server: Handle existing timer replacement when no window handle specified.
diff --git a/server/queue.c b/server/queue.c
index 1e8de22..cdab2a8 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -1927,13 +1927,22 @@
     else
     {
         queue = get_current_queue();
-        /* find a free id for it */
-        do
+        /* look for a timer with this id */
+        if (id && (timer = find_timer( queue, NULL, req->msg, id )))
         {
-            id = queue->next_timer_id;
-            if (++queue->next_timer_id >= 0x10000) queue->next_timer_id = 1;
+            /* free and reuse id */
+            free_timer( queue, timer );
         }
-        while (find_timer( queue, 0, req->msg, id ));
+        else
+        {
+            /* find a free id for it */
+            do
+            {
+                id = queue->next_timer_id;
+                if (++queue->next_timer_id >= 0x10000) queue->next_timer_id = 1;
+            }
+            while (find_timer( queue, 0, req->msg, id ));
+        }
     }
 
     if ((timer = set_timer( queue, req->rate )))