protected @Override Module retrieveModule(final String locator, final long revision) throws StorageException {
		assert (locator != null): "Supplied locator is null";
		assert (!"".equals(locator)): "Proof module supplied";
		assert (revision >= 0): "Invalid version number supplied";
		try {
			final String urlEncodedLocator = URLEncoder.encode(locator, ENCODING);
			final RevisionHandler handler = handleRequest("revids=" + revision + "&prop=revisions&rvprop=content");
			if (!locator.equals(handler.getPageTitle()))
				throw new StorageException("Supplied revision " + revision + " does not match supplied title " + locator);
			final String text = handler.getText();
			if ("".equals(text))
				throw new StorageException("Supplied revision " + revision + " does not contain any text");
			// extract JHilbert text
			final StringBuilder jhText = new StringBuilder();
			final Matcher matcher = PATTERN.matcher(text);
			while(matcher.find()) {
				final String match = matcher.group();
				jhText.append('\n');
				jhText.append(match, 4, match.length() - 5); // strip tags
			}
			// parse text
			final Module module = DataFactory.getInstance().createModule(locator, revision);
			final TokenFeed tokenFeed = ScannerFactory.getInstance().createTokenFeed(new ByteArrayInputStream(jhText.toString().getBytes(ENCODING)));
				// FIXME: This encodes UTF-8 just to decode it yet again.
				// Solution: change jhilbert.scanners.impl.{CharScanner,StreamTokenFeed} constructors to accept java.io.Reader.
				// Other solution: Use a FilterInputStream instead of regexes
			CommandFactory.getInstance().processCommands(module, tokenFeed);
			return module;
		} catch (UnsupportedEncodingException e) {
			throw new StorageException(ENCODING + " encoding not supported", e);
		} catch (DataException e) {
			throw new StorageException("Unable to create interface module", e);
		} catch (ScannerException e) {
			throw new StorageException("Unable to create token feed", e);
		} catch (CommandException e) {
			throw new StorageException("Unable to parse module", e);
		}
	}