public List<Achievement> readAchievements(InputStream stream) throws IOException, JAXBException {
		log.trace("Reading achievements XML");

		// Need to clean invalid XML and comments before JAXB parsing

		BufferedReader in = new BufferedReader(new InputStreamReader(stream, "UTF8"));
		StringBuilder sb = new StringBuilder();
		String line;
		while( (line = in.readLine()) != null ) {
			line = line.replaceAll("<!--[^>]*-->", "");  // TODO need a proper Matcher for multiline comments
			line = line.replaceAll("<desc>([^<]*)</name>", "<desc>$1</desc>");
			sb.append(line).append("\n");
		}
		in.close();
		if ( sb.substring(0, BOM_UTF8.length()).equals(BOM_UTF8) )
			sb.replace(0, BOM_UTF8.length(), "");

		// XML has multiple root nodes so need to wrap.
		sb.insert(0, "<achievements>\n");
		sb.append("</achievements>\n");

		// Parse cleaned XML
		Achievements ach = (Achievements)unmarshalFromSequence( Achievements.class, sb );

		return ach.getAchievements();
	}