  We introduce a method of reversing the execution of imperative concurrent
programs. Given an irreversible program, we describe the process of producing
two versions. The first performs forward execution and saves information
necessary for reversal. The second uses this saved information to simulate
reversal. We propose using identifiers to overcome challenges of reversing
concurrent programs. We prove this reversibility to be correct, showing that
the initial program state is restored and that all saved information is used
(garbage-free).
