I'm looking at PUC itself now, but I wanted to go ahead and get out some quick comments on everything else.
High-level: - My gut reaction is that it's odd to make it a command-line option. It's not really a user-facing 'option' in the same way that draftCompile or style=PRETTY is, it's just an internal implementation detail. It would seem more like a jvm flag, and perhaps later just always on. - Same with having to encode the persistence dir into every single entry point. Throwing it into WEB-INF in dev mode seems weird, and there's no fundamental reason dev mode and the compiler shouldn't share a unit cache anyway. How about just using / creating a well-known directory under the current directory? If you fail to create the directory (permission problem) then you don't use the disk. http://gwt-code-reviews.appspot.com/1375802/diff/1/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java File dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java (right): http://gwt-code-reviews.appspot.com/1375802/diff/1/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java#newcode232 dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java:232: logger.log(TreeLogger.TRACE, "Invalid units found: " + invalidatedUnits.size()); I would dig on this more. It's perfectly fine and expected that some units will have null dependencies. That should not force those units to recompile... *provided that the dependencies remain null*. http://gwt-code-reviews.appspot.com/1375802/diff/1/dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java#newcode450 dev/core/src/com/google/gwt/dev/javac/CompilationStateBuilder.java:450: It does seem kind of strange, though, like the two need to be unified. Maybe PersistentUnitCache should be one of two UnitCache subclasses, or maybe internally it should either use the disk or not. http://gwt-code-reviews.appspot.com/1375802/diff/5002/dev/core/src/com/google/gwt/dev/javac/Dependencies.java File dev/core/src/com/google/gwt/dev/javac/Dependencies.java (right): http://gwt-code-reviews.appspot.com/1375802/diff/5002/dev/core/src/com/google/gwt/dev/javac/Dependencies.java#newcode47 dev/core/src/com/google/gwt/dev/javac/Dependencies.java:47: public CompiledClass getCompiledClass() { Not used anymore. http://gwt-code-reviews.appspot.com/1375802/diff/5002/dev/core/src/com/google/gwt/dev/javac/Dependencies.java#newcode202 dev/core/src/com/google/gwt/dev/javac/Dependencies.java:202: return myRef.getSignatureHash().equals(theirs.getSignatureHash()); Given your changes, and that you always use signature hash now, you no longer need to bifurcate SerializedRef / DirectRef at all. You can use SerializedRef always (and just call it Ref). http://gwt-code-reviews.appspot.com/1375802/ -- http://groups.google.com/group/Google-Web-Toolkit-Contributors