Completing the task when the timer fires seems to me to be an edge-case (off course, depending on the timeout). If the timeout of a task to be completed is a couple of hours or even days, the chance of the user completing the task when the job is being executed is very small. And if that happens, the ConcurrentModificationException should be handled by your code. In your specific use case it means the user was too late to complete the task, as it's expired already. You'll get similar issues with the inclusive layaway when both event occur, as they both try to update the same process-instance eventually.