diff -ur slim-1.3.1.orig/app.cpp slim-1.3.1/app.cpp
--- slim-1.3.1.orig/app.cpp	2008-09-26 02:54:15.000000000 +0200
+++ slim-1.3.1/app.cpp	2008-11-21 20:38:48.000000000 +0100
@@ -102,6 +102,11 @@
 
 extern App* LoginApp;
 
+int xioerror(Display *disp) {
+	LoginApp->RestartServer();
+    return 0;
+}
+
 void CatchSignal(int sig) {
     cerr << APPNAME << ": unexpected signal " << sig << endl;
     LoginApp->StopServer();
@@ -109,19 +114,6 @@
     exit(ERR_EXIT);
 }
 
-
-void AlarmSignal(int sig) {
-    int pid = LoginApp->GetServerPID();
-    if(waitpid(pid, NULL, WNOHANG) == pid) {
-        LoginApp->StopServer();
-        LoginApp->RemoveLock();
-        exit(OK_EXIT);
-    }
-    signal(sig, AlarmSignal);
-    alarm(2);
-}
-
-
 void User1Signal(int sig) {
     signal(sig, User1Signal);
 }
@@ -267,7 +259,6 @@
         signal(SIGHUP, CatchSignal);
         signal(SIGPIPE, CatchSignal);
         signal(SIGUSR1, User1Signal);
-        signal(SIGALRM, AlarmSignal);
 
 #ifndef XNEST_DEBUG
         OpenLog();
@@ -287,7 +278,6 @@
 
         CreateServerAuth();
         StartServer();
-        alarm(2);
 #endif
 
     }
@@ -603,6 +593,8 @@
     int status;
     while (wpid != pid) {
         wpid = wait(&status);
+		if (wpid == ServerPID)
+			xioerror(Dpy);	// Server died, simulate IO error
     }
     if (WIFEXITED(status) && WEXITSTATUS(status)) {
         LoginPanel->Message("Failed to execute login command");
@@ -648,9 +640,6 @@
 
 
 void App::Reboot() {
-    // Stop alarm clock
-    alarm(0);
-
 #ifdef USE_PAM
     try{
         pam.end();
@@ -673,9 +662,6 @@
 
 
 void App::Halt() {
-    // Stop alarm clock
-    alarm(0);
-
 #ifdef USE_PAM
     try{
         pam.end();
@@ -761,6 +747,7 @@
 
     StopServer(); 
     RemoveLock();
+	while (waitpid(-1, NULL, WNOHANG) > 0); // Collects all dead childrens
     Run();
 } 
 
@@ -831,6 +818,7 @@
 
     for(cycles = 0; cycles < ncycles; cycles++) {
         if((Dpy = XOpenDisplay(DisplayName))) {
+            XSetIOErrorHandler(xioerror);
             return 1;
         } else {
             if(!ServerTimeout(1, (char *) "X server to begin accepting connections"))
@@ -913,9 +901,6 @@
             ServerPID = -1;
             break;
         }
-        alarm(15);
-        pause();
-        alarm(0);
 
         // Wait for server to start up
         if(WaitForServer() == 0) {
@@ -948,15 +933,12 @@
 
 
 void App::StopServer() {
-    // Stop alars clock and ignore signals
-    alarm(0);
     signal(SIGQUIT, SIG_IGN);
     signal(SIGINT, SIG_IGN);
     signal(SIGHUP, SIG_IGN);
     signal(SIGPIPE, SIG_IGN);
     signal(SIGTERM, SIG_DFL);
     signal(SIGKILL, SIG_DFL);
-    signal(SIGALRM, SIG_DFL);
 
     // Catch X error
     XSetIOErrorHandler(IgnoreXIO);
diff -ur slim-1.3.1.orig/app.h slim-1.3.1/app.h
--- slim-1.3.1.orig/app.h	2008-09-26 02:54:15.000000000 +0200
+++ slim-1.3.1/app.h	2008-11-21 20:38:48.000000000 +0100
@@ -34,6 +34,7 @@
     ~App();
     void Run();
     int GetServerPID();
+    void RestartServer();
     void StopServer();
 
     // Lock functions
@@ -48,7 +49,6 @@
     void Console();
     void Exit();
     void KillAllClients(Bool top);
-    void RestartServer();
     void ReadConfig();
     void OpenLog();
     void CloseLog();