diff --git a/gnome-session/gsm-util.c b/gnome-session/gsm-util.c
index 210c26a..2dc9bb4 100644
--- a/gnome-session/gsm-util.c
+++ b/gnome-session/gsm-util.c
@@ -340,9 +340,10 @@ void
 gsm_util_init_error (gboolean    fatal,
                      const char *format, ...)
 {
-        GtkWidget *dialog;
-        char      *msg;
-        va_list    args;
+        GtkButtonsType  buttons;
+        GtkWidget      *dialog;
+        char           *msg;
+        va_list         args;
 
         va_start (args, format);
         msg = g_strdup_vprintf (format, args);
@@ -358,8 +359,17 @@ gsm_util_init_error (gboolean    fatal,
                 }
         }
 
+        if (fatal)
+                buttons = GTK_BUTTONS_NONE;
+        else
+                buttons = GTK_BUTTONS_CLOSE;
+
         dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
-                                         GTK_BUTTONS_CLOSE, "%s", msg);
+                                         buttons, "%s", msg);
+
+        if (fatal)
+                gtk_dialog_add_button (GTK_DIALOG (dialog),
+                                       _("_Log Out"), GTK_RESPONSE_CLOSE);
 
         g_free (msg);
 
@@ -369,7 +379,10 @@ gsm_util_init_error (gboolean    fatal,
         gtk_widget_destroy (dialog);
 
         if (fatal) {
-                gtk_main_quit ();
+                if (gtk_main_level () > 0)
+                        gtk_main_quit ();
+                else
+                        exit (1);
         }
 }
 
diff --git a/gnome-session/gsm-xsmp-server.c b/gnome-session/gsm-xsmp-server.c
index 0de6bef..e2a3767 100644
--- a/gnome-session/gsm-xsmp-server.c
+++ b/gnome-session/gsm-xsmp-server.c
@@ -29,6 +29,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <string.h>
+#include <errno.h>
 
 #include <glib.h>
 #include <glib/gi18n.h>
@@ -331,7 +332,8 @@ auth_entry_new (const char *protocol,
 
 static gboolean
 update_iceauthority (GsmXsmpServer *server,
-                     gboolean       adding)
+                     gboolean       adding,
+                     const char    **msg)
 {
         char             *filename;
         char            **our_network_ids;
@@ -341,12 +343,22 @@ update_iceauthority (GsmXsmpServer *server,
         GSList           *e;
         int               i;
         gboolean          ok = FALSE;
+        int             ice_ret;
 
         filename = IceAuthFileName ();
-        if (IceLockAuthFile (filename,
+        ice_ret = IceLockAuthFile (filename,
                              GSM_ICE_AUTH_RETRIES,
                              GSM_ICE_AUTH_INTERVAL,
-                             GSM_ICE_AUTH_LOCK_TIMEOUT) != IceAuthLockSuccess) {
+                             GSM_ICE_AUTH_LOCK_TIMEOUT);
+
+        if (ice_ret == IceAuthLockError) {
+                *msg = strerror (errno);
+                return FALSE;
+        } else if (ice_ret == IceAuthLockTimeout) {
+                *msg = _("ICE Auth Lock Timeout");
+                return FALSE; 
+        } else if (ice_ret != IceAuthLockSuccess) {
+                *msg = _("Unknown ICE Auth Lock Error");
                 return FALSE;
         }
 
@@ -390,6 +402,7 @@ update_iceauthority (GsmXsmpServer *server,
 
                 if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
                         g_warning ("Unable to read ICE authority file: %s", filename);
+                        *msg = _("Unable to read ICE authority file");
                         goto cleanup;
                 }
 
@@ -397,6 +410,7 @@ update_iceauthority (GsmXsmpServer *server,
                 fp = fdopen (fd, "w");
                 if (!fp) {
                         g_warning ("Unable to write to ICE authority file: %s", filename);
+                        *msg = _("Unable to write to ICE authority file");
                         if (fd != -1) {
                                 close (fd);
                         }
@@ -537,13 +551,15 @@ setup_listener (GsmXsmpServer *server)
                 free (network_id_list);
         }
 #endif
-
+        char *msg;
         /* Update .ICEauthority with new auth entries for our socket */
-        if (!update_iceauthority (server, TRUE)) {
+        if (!update_iceauthority (server, TRUE, &msg)) {
                 /* FIXME: is this really fatal? Hm... */
                 gsm_util_init_error (TRUE,
-                                     "Could not update ICEauthority file %s",
-                                     IceAuthFileName ());
+                                     "%s %s:\n %s.",
+                                     _("Could not update ICEauthority file"),
+                                     IceAuthFileName (),
+                                     msg);
         }
 
         network_id_list = IceComposeNetworkIdList (server->priv->num_local_xsmp_sockets,
