Support versioning, use Predicate<T> for find, and misc refactoring