protected @Override Module retrieveModule(final String locator, final long version) throws StorageException {
		assert (locator != null): "Supplied locator is null";
		assert (version >= -1): "Invalid revision number supplied";
		try {
			final RandomAccessFile file = FileAccessManager.getFile(l2p(locator));
			try {
				synchronized (file) {
					final ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file.getFD()));
					return (Module) ois.readObject();
				}
			} finally {
				FileAccessManager.putFile(file);
			}
		} catch (FileNotFoundException e) {
			throw new StorageException("File not found (should not normally happen)", e);
		} catch (ClassNotFoundException e) {
			throw new StorageException("File does not contain module data", e);
		} catch (ClassCastException e) {
			throw new StorageException("File does not contain module data", e);
		} catch (OptionalDataException e) {
			throw new StorageException("File does not contain module data", e);
		} catch (InvalidClassException e) {
			throw new StorageException("File contains obsolete data", e);
		} catch (StreamCorruptedException e) {
			throw new StorageException("File contains inconsistent data", e);
		} catch (IOException e) {
			throw new StorageException("I/O error while loading module", e);
		}
	}