A user-level deterministic log/replay system is able to faithfully re-enact a past multithreaded execution without any modifications to the underlying OS or hardware. As concurrent software gets increasingly popular, such capability is highly useful and sometimes pivotal in understanding and fixing concurrency bugs. In this talk, I will present some of the major research challenges of the user-level replay together with three techniques, developed by our research group, that make significant improvements over the prior art. I will first describe LEAP, an order-based replay tool that works for many popular multithreaded Java programs. I will then describe STRIDE, a hybrid technique that achieves a lower recording overhead by permitting the concurrent-read-exclusive-write (CREW) semantic. Finally, I will present CLAP, a search-based and light weight replaying technique for C/C++ programs, that uses SMT solvers and thread-local profiles to achieve the replay determinism.