We are focusing on techniques to aid the debugging of multi-threaded Java applications. Debugging such applications is usually quite difficult because of synchronization race conditions. Hence, some special techniques must be applied if one wants to repeat the outcome of the races. In this paper, we describe such a technique, i.e. performing a controlled replay of a multi-threaded Java application. We eliminate the non-determinism during the replay of the application by imposing order on the synchronization operations executed, as traced during the recorded execution of the application. Since Java is portable, we want the record/replay system to be at least as portable. Thus, we propose to implement everything in Java, with no or very small changes to the Java Virtual Machine used.