diff --git a/wmail/src/wmail.c b/wmail/src/wmail.c
index 6f4e681..6e82c20 100644
--- a/wmail/src/wmail.c
+++ b/wmail/src/wmail.c
@@ -100,6 +100,7 @@ typedef enum {
 ///////////////////////////////////////////////////////////////////////////////
 // data
 
+static unsigned long lastTimeOut;
 mail_state_t state = STATE_NOMAIL;
 int numMails = 0;
 bool namesChanged = false;
@@ -160,7 +161,8 @@ static DAProgramOption options[] = {
 // prototypes
 
 void PreparePixmaps( bool freeThemFirst );
-void TimerHandler( int dummy );
+void TimedOut( void );
+void CheckTimeOut( bool force );
 void CheckMBox( void );
 void CheckMaildir( void );
 int TraverseDirectory( const char *name, bool isNewMail );
@@ -195,28 +197,14 @@ bool HasTickerWork( void );
 // implementation
 
 
-void SetTimer( void )
-{
-    struct itimerval timerVal;
-
-    timerVal.it_interval.tv_sec = 0;
-    timerVal.it_interval.tv_usec = 1000000/config.fps;
-    timerVal.it_value.tv_sec = 0;
-    timerVal.it_value.tv_usec = 1000000/config.fps;
-
-    setitimer( ITIMER_REAL, &timerVal, NULL );
-}
-
 int main( int argc, char **argv )
 {
     char *usersHome;
-    struct sigaction sa;
-    int ret;
     struct stat fileStat;
     XTextProperty windowName;
     char *name = argv[0];
     DACallbacks callbacks = { NULL, &ButtonPressed, &ButtonReleased,
-			      NULL, NULL, NULL, NULL };
+			      NULL, NULL, NULL, &TimedOut };
 
     // read the config file and overide the default-settings
     ReadConfigFile( false );
@@ -303,24 +291,13 @@ int main( int argc, char **argv )
     PreparePixmaps( false );
 
     DASetCallbacks( &callbacks );
-    DASetTimeout( -1 );
-
-    sa.sa_handler = TimerHandler;
-    sigemptyset( &sa.sa_mask );
-    sa.sa_flags = SA_RESTART;
-    ret = sigaction( SIGALRM, &sa, 0 );
-
-    if( ret ) {
-	perror( "wmail error: sigaction" );
-	exit( 1 );
-    }
+    DASetTimeout (1000 / config.fps);
 
     XStringListToTextProperty( &name, 1, &windowName );
     XSetWMName( DADisplay, DAWindow, &windowName );
 
     UpdatePixmap( false );
     DAShow();
-    SetTimer();
 
     DAEventLoop();
 
@@ -542,11 +519,25 @@ void RemoveChecksumFile( void )
     remove( config.checksumFileName );
 }
 
-// dummy needed because this func is a signal-handler
-void TimerHandler( int dummy )
+void TimedOut( void )
+{
+    CheckTimeOut( true );
+}
+
+void CheckTimeOut( bool force )
 {
     static int checkMail = 0;
 
+    struct timeval now;
+    gettimeofday(&now, NULL);
+
+    unsigned long nowMs = now.tv_sec * 1000L + now.tv_usec / 1000L;
+
+    if (!force && nowMs - lastTimeOut < 1000L / config.fps)
+	return;
+
+    lastTimeOut = nowMs;
+
     if( readConfigFile ) {
 	readConfigFile = false;
 	UpdateConfiguration();
@@ -1252,6 +1243,8 @@ void ButtonPressed( int button, int state, int x, int y )
     } else
 	// reread the config file
 	readConfigFile = true;
+
+    CheckTimeOut( false );
 }
 
 void ButtonReleased( int button, int state, int x, int y )
@@ -1265,6 +1258,8 @@ void ButtonReleased( int button, int state, int x, int y )
 	if( ret == 127 || ret == -1 )
 	    WARNING( "execution of command \"%s\" failed.\n", config.runCmd );
     }
+
+    CheckTimeOut( false );
 }
 
 void GetHexColorString( const char *colorName, char *xpmLine )
@@ -1326,7 +1321,7 @@ void UpdateConfiguration( void )
 
     PreparePixmaps( true );
 
-    SetTimer();
+    DASetTimeout (1000 / config.fps);
 }
 
 void CleanupNames( void )