We'd like to thank Mike Fox, Jim Gray, Manoj Kasichainula, R. Adam King, and Zhiyong Li of IBM Research Triangle Park for assistance and guidance from the earliest stages of the project. Thanks to early users Jonathan Seeber and Anya Bilska for putting up with bugs. Siddhartha Chatterjee and Jan Prins of UNC-Chapel Hill, and Owen Astrachan and Robert Duvall of Duke University all made very useful comments on drafts of this paper. Chris Laffra and Lee Nackman of IBM's Thomas J. Watson Research Center gave advice on bytecode manipulation, and the attendees of the IBM Research Java Conference gave many useful comments. Thanks also go to Dan Wallach, the anonymous reviewers, and our shepherd Benjamin Zorn.