I've done a bit of de-obfuscating by hand, usually just to locate a specific feature though (not reobtaining whole source code). You could probably use any modern IDE/refactoring tool that will update renamed methods, classes, and fields for you. Make sure you stick in comments whenever you figure out what something does. If there's flow obfuscation, may the force be with you.
There are free tools out there. I can tell you such a thing called mocha exists, but there's enough legal trouble surrounding its distribution that you should search for it yourself. In short, Symantec has been trying for years to apply legal pressure on mocha's author. You can get it, though, if you look. For something less controversial, try JODE. ------------------ Michael Ernest, co-author of: The Complete Java 2 Certification Study Guide
Make visible what, without you, might perhaps never have been seen. - Robert Bresson
That's what I thought. Anyway, de-obfuscation is hard work (that's why people obfuscate things!). There isn't a simple way or tool. You just have to carefully examine what code does and what String constants are nearby to come up with good comments and method/field/class names. A lot of information is lost in the obfuscation process and you shouldn't hope to discover it all. Always keep the reason you're trying to de-obfuscate in mind so you can try to ignore that parts of the program that don't matter.