The versioning framework in jackrabbit consists of 3 layers. A persistence layer, an application layer and an presentation layer.

The persistence layer uses a 'normal' workspace as storage. The storage can later be exchanged by a more scaleable one. The application layer operates on the persistent one and provides the internal view of the version storage. It is manifested through the `InternalVersion` and `InternalVersionHistory` objects. The internal versions are also mapped to the content and exposed through the API (i.e. the `Version` extends `Node` and can be inspected with normal Node methods). Furthermore the version store is also exposed below `/jcr:system/jcr:versionStorage`. The exact structure of it is not defined yet, so applications should not relay on it and rather use `Node.getVersionHistory()` to access a particular version history or use the search mechanisms to find the respective versions.

The presentation layer is managed by the `VersionManager`. it is responsible for mapping the version storage to the content.

Open issues:

- consider multi-threading behaviour