diff --git a/bundleplugin/src/main/java/aQute/libg/cryptography/Digest.java b/bundleplugin/src/main/java/aQute/libg/cryptography/Digest.java
index 93d48ad..aeb4bbb 100644
--- a/bundleplugin/src/main/java/aQute/libg/cryptography/Digest.java
+++ b/bundleplugin/src/main/java/aQute/libg/cryptography/Digest.java
@@ -17,6 +17,10 @@
 		return digest;
 	}
 
+	public String asHex() {
+		return Hex.toHexString(digest());
+	}
+
 	@Override
 	public String toString() {
 		return String.format("%s(d=%s)", getAlgorithm(), Hex.toHexString(digest));
diff --git a/bundleplugin/src/main/java/aQute/libg/cryptography/MD5.java b/bundleplugin/src/main/java/aQute/libg/cryptography/MD5.java
index 05a6bdd..a1a5a0a 100644
--- a/bundleplugin/src/main/java/aQute/libg/cryptography/MD5.java
+++ b/bundleplugin/src/main/java/aQute/libg/cryptography/MD5.java
@@ -35,4 +35,7 @@
 		return ALGORITHM;
 	}
 
+	public static MD5 digest(byte [] data) throws Exception {
+		return getDigester().digest(data);
+	}
 }
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/libg/cryptography/SHA1.java b/bundleplugin/src/main/java/aQute/libg/cryptography/SHA1.java
index d0a486c..c76f182 100644
--- a/bundleplugin/src/main/java/aQute/libg/cryptography/SHA1.java
+++ b/bundleplugin/src/main/java/aQute/libg/cryptography/SHA1.java
@@ -35,4 +35,7 @@
 		return ALGORITHM;
 	}
 
+	public static SHA1 digest(byte [] data) throws Exception {
+		return getDigester().digest(data);
+	}
 }
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/libg/cryptography/SHA256.java b/bundleplugin/src/main/java/aQute/libg/cryptography/SHA256.java
index b6eeacc..743a431 100644
--- a/bundleplugin/src/main/java/aQute/libg/cryptography/SHA256.java
+++ b/bundleplugin/src/main/java/aQute/libg/cryptography/SHA256.java
@@ -35,4 +35,7 @@
 		return ALGORITHM;
 	}
 
+	public static SHA256 digest(byte [] data) throws Exception {
+		return getDigester().digest(data);
+	}
 }
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/libg/filerepo/FileRepo.java b/bundleplugin/src/main/java/aQute/libg/filerepo/FileRepo.java
deleted file mode 100644
index e278a74..0000000
--- a/bundleplugin/src/main/java/aQute/libg/filerepo/FileRepo.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package aQute.libg.filerepo;
-
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-
-import aQute.libg.version.*;
-
-public class FileRepo {
-	File	root;
-	Pattern	REPO_FILE	= Pattern.compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+|latest)\\.(jar|lib)");
-
-	public FileRepo(File root) {
-		this.root = root;
-	}
-
-	/**
-	 * Get a list of URLs to bundles that are constrained by the bsn and
-	 * versionRange.
-	 */
-	public File[] get(String bsn, final VersionRange versionRange) throws Exception {
-
-		//
-		// Check if the entry exists
-		//
-		File f = new File(root, bsn);
-		if (!f.isDirectory())
-			return null;
-
-		//
-		// Iterator over all the versions for this BSN.
-		// Create a sorted map over the version as key
-		// and the file as URL as value. Only versions
-		// that match the desired range are included in
-		// this list.
-		//
-		return f.listFiles(new FilenameFilter() {
-			public boolean accept(File dir, String name) {
-				Matcher m = REPO_FILE.matcher(name);
-				if (!m.matches())
-					return false;
-				if (versionRange == null)
-					return true;
-
-				Version v = new Version(m.group(2));
-				return versionRange.includes(v);
-			}
-		});
-	}
-
-	public List<String> list(String regex) throws Exception {
-		if (regex == null)
-			regex = ".*";
-		final Pattern pattern = Pattern.compile(regex);
-
-		String list[] = root.list(new FilenameFilter() {
-
-			public boolean accept(File dir, String name) {
-				Matcher matcher = pattern.matcher(name);
-				return matcher.matches();
-			}
-
-		});
-		return Arrays.asList(list);
-	}
-
-	public List<Version> versions(String bsn) throws Exception {
-		File dir = new File(root, bsn);
-		final List<Version> versions = new ArrayList<Version>();
-		dir.list(new FilenameFilter() {
-
-			public boolean accept(File dir, String name) {
-				Matcher m = REPO_FILE.matcher(name);
-				if (m.matches()) {
-					versions.add(new Version(m.group(2)));
-					return true;
-				}
-				return false;
-			}
-
-		});
-		return versions;
-	}
-
-	public File get(String bsn, VersionRange range, int strategy) throws Exception {
-		File[] files = get(bsn, range);
-		if (files == null || files.length == 0)
-			return null;
-
-		if (files.length == 1)
-			return files[0];
-
-		if (strategy < 0) {
-			return files[0];
-		}
-		return files[files.length - 1];
-	}
-
-	public File put(String bsn, Version version) {
-		File dir = new File(root, bsn);
-		dir.mkdirs();
-		File file = new File(dir, bsn + "-" + version.getMajor() + "." + version.getMinor() + "." + version.getMicro()
-				+ ".jar");
-		return file;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/libg/filerepo/packageinfo b/bundleplugin/src/main/java/aQute/libg/filerepo/packageinfo
deleted file mode 100644
index 7c8de03..0000000
--- a/bundleplugin/src/main/java/aQute/libg/filerepo/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0
diff --git a/bundleplugin/src/main/java/aQute/libg/filters/LiteralFilter.java b/bundleplugin/src/main/java/aQute/libg/filters/LiteralFilter.java
new file mode 100644
index 0000000..ca09228
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/libg/filters/LiteralFilter.java
@@ -0,0 +1,16 @@
+package aQute.libg.filters;
+
+public class LiteralFilter extends Filter {
+	
+	private String	filterString;
+
+	public LiteralFilter(String filterString) {
+		this.filterString = filterString;
+	}
+
+	@Override
+	public void append(StringBuilder builder) {
+		builder.append(filterString);
+	}
+
+}
diff --git a/bundleplugin/src/main/java/aQute/libg/header/Attrs.java b/bundleplugin/src/main/java/aQute/libg/header/Attrs.java
deleted file mode 100644
index 40fefcc..0000000
--- a/bundleplugin/src/main/java/aQute/libg/header/Attrs.java
+++ /dev/null
@@ -1,312 +0,0 @@
-package aQute.libg.header;
-
-import java.util.*;
-import java.util.regex.*;
-
-import aQute.lib.collections.*;
-import aQute.libg.version.*;
-
-public class Attrs implements Map<String,String> {
-	public enum Type {
-		STRING(null), LONG(null), VERSION(null), DOUBLE(null), STRINGS(STRING), LONGS(LONG), VERSIONS(VERSION), DOUBLES(
-				DOUBLE);
-
-		Type	sub;
-
-		Type(Type sub) {
-			this.sub = sub;
-		}
-
-	}
-
-	/**
-	 * <pre>
-	 * Provide-Capability ::= capability ::=
-	 * name-space ::= typed-attr ::= type ::= scalar ::=
-	 * capability ( ',' capability )*
-	 * name-space
-	 *     ( ’;’ directive | typed-attr )*
-	 * symbolic-name
-	 * extended ( ’:’ type ) ’=’ argument
-	 * scalar | list
-	 * ’String’ | ’Version’ | ’Long’
-	 * list ::=
-	 * ’List<’ scalar ’>’
-	 * </pre>
-	 */
-	static String							EXTENDED	= "[\\-0-9a-zA-Z\\._]+";
-	static String							SCALAR		= "String|Version|Long|Double";
-	static String							LIST		= "List\\s*<\\s*(" + SCALAR + ")\\s*>";
-	public static final Pattern				TYPED		= Pattern.compile("\\s*(" + EXTENDED + ")\\s*:\\s*(" + SCALAR
-																+ "|" + LIST + ")\\s*");
-
-	private LinkedHashMap<String,String>	map;
-	private Map<String,Type>				types;
-	static Map<String,String>				EMPTY		= Collections.emptyMap();
-
-	public Attrs(Attrs... attrs) {
-		for (Attrs a : attrs) {
-			if (a != null) {
-				putAll(a);
-			}
-		}
-	}
-
-	public void clear() {
-		map.clear();
-	}
-
-	public boolean containsKey(String name) {
-		if (map == null)
-			return false;
-
-		return map.containsKey(name);
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public boolean containsKey(Object name) {
-		assert name instanceof String;
-		if (map == null)
-			return false;
-
-		return map.containsKey((String) name);
-	}
-
-	public boolean containsValue(String value) {
-		if (map == null)
-			return false;
-
-		return map.containsValue(value);
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public boolean containsValue(Object value) {
-		assert value instanceof String;
-		if (map == null)
-			return false;
-
-		return map.containsValue((String) value);
-	}
-
-	public Set<java.util.Map.Entry<String,String>> entrySet() {
-		if (map == null)
-			return EMPTY.entrySet();
-
-		return map.entrySet();
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public String get(Object key) {
-		assert key instanceof String;
-		if (map == null)
-			return null;
-
-		return map.get((String) key);
-	}
-
-	public String get(String key) {
-		if (map == null)
-			return null;
-
-		return map.get(key);
-	}
-
-	public String get(String key, String deflt) {
-		String s = get(key);
-		if (s == null)
-			return deflt;
-		return s;
-	}
-
-	public boolean isEmpty() {
-		return map == null || map.isEmpty();
-	}
-
-	public Set<String> keySet() {
-		if (map == null)
-			return EMPTY.keySet();
-
-		return map.keySet();
-	}
-
-	public String put(String key, String value) {
-		if (map == null)
-			map = new LinkedHashMap<String,String>();
-
-		Matcher m = TYPED.matcher(key);
-		if (m.matches()) {
-			key = m.group(1);
-			String type = m.group(2);
-			Type t = Type.STRING;
-
-			if (type.startsWith("List")) {
-				type = m.group(3);
-				if ("String".equals(type))
-					t = Type.STRINGS;
-				else if ("Long".equals(type))
-					t = Type.LONGS;
-				else if ("Double".equals(type))
-					t = Type.DOUBLES;
-				else if ("Version".equals(type))
-					t = Type.VERSIONS;
-			} else {
-				if ("String".equals(type))
-					t = Type.STRING;
-				else if ("Long".equals(type))
-					t = Type.LONG;
-				else if ("Double".equals(type))
-					t = Type.DOUBLE;
-				else if ("Version".equals(type))
-					t = Type.VERSION;
-			}
-			if (types == null)
-				types = new LinkedHashMap<String,Type>();
-			types.put(key, t);
-
-			// TODO verify value?
-		}
-
-		return map.put(key, value);
-	}
-
-	public Type getType(String key) {
-		if (types == null)
-			return Type.STRING;
-		Type t = types.get(key);
-		if (t == null)
-			return Type.STRING;
-		return t;
-	}
-
-	public void putAll(Map< ? extends String, ? extends String> map) {
-		for (Map.Entry< ? extends String, ? extends String> e : map.entrySet())
-			put(e.getKey(), e.getValue());
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public String remove(Object var0) {
-		assert var0 instanceof String;
-		if (map == null)
-			return null;
-
-		return map.remove((String) var0);
-	}
-
-	public String remove(String var0) {
-		if (map == null)
-			return null;
-		return map.remove(var0);
-	}
-
-	public int size() {
-		if (map == null)
-			return 0;
-		return map.size();
-	}
-
-	public Collection<String> values() {
-		if (map == null)
-			return EMPTY.values();
-
-		return map.values();
-	}
-
-	public String getVersion() {
-		return get("version");
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		append(sb);
-		return sb.toString();
-	}
-
-	public void append(StringBuilder sb) {
-		String del = "";
-		for (Map.Entry<String,String> e : entrySet()) {
-			sb.append(del);
-			sb.append(e.getKey());
-			sb.append("=");
-			sb.append(e.getValue());
-			del = ";";
-		}
-	}
-
-	@Deprecated
-	public boolean equals(Object other) {
-		return super.equals(other);
-	}
-
-	@Deprecated
-	public int hashCode() {
-		return super.hashCode();
-	}
-
-	public boolean isEqual(Attrs o) {
-		if (this == o)
-			return true;
-
-		Attrs other = o;
-
-		if (size() != other.size())
-			return false;
-
-		if (isEmpty())
-			return true;
-
-		SortedList<String> l = new SortedList<String>(keySet());
-		SortedList<String> lo = new SortedList<String>(other.keySet());
-		if (!l.isEqual(lo))
-			return false;
-
-		for (String key : keySet()) {
-			if (!get(key).equals(other.get(key)))
-				return false;
-		}
-		return true;
-
-	}
-
-	public Object getTyped(String adname) {
-		String s = get(adname);
-		if (s == null)
-			return null;
-
-		Type t = getType(adname);
-		return convert(t, s);
-	}
-
-	private Object convert(Type t, String s) {
-		if (t.sub == null) {
-			switch (t) {
-				case STRING :
-					return s;
-				case LONG :
-					return Long.parseLong(s.trim());
-				case VERSION :
-					return Version.parseVersion(s);
-				case DOUBLE :
-					return Double.parseDouble(s.trim());
-					
-				case DOUBLES :
-				case LONGS :
-				case STRINGS :
-				case VERSIONS :
-					// Cannot happen since the sub is null
-					return null;
-			}
-			return null;
-		}
-		List<Object> list = new ArrayList<Object>();
-		String split[] = s.split("\\s*\\(\\?!\\),\\s*");
-		for (String p : split) {
-			p = p.replaceAll("\\\\", "");
-			list.add(convert(t.sub, p));
-		}
-		return list;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/libg/header/OSGiHeader.java b/bundleplugin/src/main/java/aQute/libg/header/OSGiHeader.java
deleted file mode 100755
index a372527..0000000
--- a/bundleplugin/src/main/java/aQute/libg/header/OSGiHeader.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package aQute.libg.header;
-
-import java.util.*;
-
-import aQute.libg.generics.*;
-import aQute.libg.qtokens.*;
-import aQute.service.reporter.*;
-
-public class OSGiHeader {
-
-	static public Parameters parseHeader(String value) {
-		return parseHeader(value, null);
-	}
-
-	/**
-	 * Standard OSGi header parser. This parser can handle the format clauses
-	 * ::= clause ( ',' clause ) + clause ::= name ( ';' name ) (';' key '='
-	 * value ) This is mapped to a Map { name => Map { attr|directive => value }
-	 * }
-	 * 
-	 * @param value
-	 *            A string
-	 * @return a Map<String,Map<String,String>>
-	 */
-	static public Parameters parseHeader(String value, Reporter logger) {
-		return parseHeader(value, logger, new Parameters());
-	}
-
-	static public Parameters parseHeader(String value, Reporter logger, Parameters result) {
-		if (value == null || value.trim().length() == 0)
-			return result;
-
-		QuotedTokenizer qt = new QuotedTokenizer(value, ";=,");
-		char del = 0;
-		do {
-			boolean hadAttribute = false;
-			Attrs clause = new Attrs();
-			List<String> aliases = Create.list();
-			String name = qt.nextToken(",;");
-
-			del = qt.getSeparator();
-			if (name == null || name.length() == 0) {
-				if (logger != null && logger.isPedantic()) {
-					logger.warning("Empty clause, usually caused by repeating a comma without any name field or by having spaces after the backslash of a property file: "
-							+ value);
-				}
-				if (name == null)
-					break;
-			} else {
-				name = name.trim();
-
-				aliases.add(name);
-				while (del == ';') {
-					String adname = qt.nextToken();
-					if ((del = qt.getSeparator()) != '=') {
-						if (hadAttribute)
-							if (logger != null) {
-								logger.error("Header contains name field after attribute or directive: " + adname
-										+ " from " + value
-										+ ". Name fields must be consecutive, separated by a ';' like a;b;c;x=3;y=4");
-							}
-						if (adname != null && adname.length() > 0)
-							aliases.add(adname.trim());
-					} else {
-						String advalue = qt.nextToken();
-						if (clause.containsKey(adname)) {
-							if (logger != null && logger.isPedantic())
-								logger.warning("Duplicate attribute/directive name " + adname + " in " + value
-										+ ". This attribute/directive will be ignored");
-						}
-						if (advalue == null) {
-							if (logger != null)
-								logger.error("No value after '=' sign for attribute " + adname);
-							advalue = "";
-						}
-						clause.put(adname.trim(), advalue.trim());
-						del = qt.getSeparator();
-						hadAttribute = true;
-					}
-				}
-
-				// Check for duplicate names. The aliases list contains
-				// the list of nams, for each check if it exists. If so,
-				// add a number of "~" to make it unique.
-				for (String clauseName : aliases) {
-					if (result.containsKey(clauseName)) {
-						if (logger != null && logger.isPedantic())
-							logger.warning("Duplicate name "
-									+ clauseName
-									+ " used in header: '"
-									+ clauseName
-									+ "'. Duplicate names are specially marked in Bnd with a ~ at the end (which is stripped at printing time).");
-						while (result.containsKey(clauseName))
-							clauseName += "~";
-					}
-					result.put(clauseName, clause);
-				}
-			}
-		} while (del == ',');
-		return result;
-	}
-
-	public static Attrs parseProperties(String input) {
-		return parseProperties(input, null);
-	}
-
-	public static Attrs parseProperties(String input, Reporter logger) {
-		if (input == null || input.trim().length() == 0)
-			return new Attrs();
-
-		Attrs result = new Attrs();
-		QuotedTokenizer qt = new QuotedTokenizer(input, "=,");
-		char del = ',';
-
-		while (del == ',') {
-			String key = qt.nextToken(",=");
-			String value = "";
-			del = qt.getSeparator();
-			if (del == '=') {
-				value = qt.nextToken(",=");
-				del = qt.getSeparator();
-			}
-			result.put(key, value);
-		}
-		if (del != 0) {
-			if (logger == null)
-				throw new IllegalArgumentException("Invalid syntax for properties: " + input);
-			logger.error("Invalid syntax for properties: " + input);
-		}
-
-		return result;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/libg/header/Parameters.java b/bundleplugin/src/main/java/aQute/libg/header/Parameters.java
deleted file mode 100644
index 02e3463..0000000
--- a/bundleplugin/src/main/java/aQute/libg/header/Parameters.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package aQute.libg.header;
-
-import java.util.*;
-
-import aQute.lib.collections.*;
-import aQute.service.reporter.*;
-
-public class Parameters implements Map<String,Attrs> {
-	private LinkedHashMap<String,Attrs>	map;
-	static Map<String,Attrs>			EMPTY	= Collections.emptyMap();
-	String								error;
-
-	public Parameters() {}
-
-	public Parameters(String header) {
-		OSGiHeader.parseHeader(header, null, this);
-	}
-
-	public Parameters(String header, Reporter reporter) {
-		OSGiHeader.parseHeader(header, reporter, this);
-	}
-
-	public void clear() {
-		map.clear();
-	}
-
-	public boolean containsKey(final String name) {
-		if (map == null)
-			return false;
-
-		return map.containsKey(name);
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public boolean containsKey(Object name) {
-		assert name instanceof String;
-		if (map == null)
-			return false;
-
-		return map.containsKey((String) name);
-	}
-
-	public boolean containsValue(Attrs value) {
-		if (map == null)
-			return false;
-
-		return map.containsValue(value);
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public boolean containsValue(Object value) {
-		assert value instanceof Attrs;
-		if (map == null)
-			return false;
-
-		return map.containsValue((Attrs) value);
-	}
-
-	public Set<java.util.Map.Entry<String,Attrs>> entrySet() {
-		if (map == null)
-			return EMPTY.entrySet();
-
-		return map.entrySet();
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public Attrs get(Object key) {
-		assert key instanceof String;
-		if (map == null)
-			return null;
-
-		return map.get((String) key);
-	}
-
-	public Attrs get(String key) {
-		if (map == null)
-			return null;
-
-		return map.get(key);
-	}
-
-	public boolean isEmpty() {
-		return map == null || map.isEmpty();
-	}
-
-	public Set<String> keySet() {
-		if (map == null)
-			return EMPTY.keySet();
-
-		return map.keySet();
-	}
-
-	public Attrs put(String key, Attrs value) {
-		assert key != null;
-		assert value != null;
-
-		if (map == null)
-			map = new LinkedHashMap<String,Attrs>();
-
-		return map.put(key, value);
-	}
-
-	public void putAll(Map< ? extends String, ? extends Attrs> map) {
-		if (this.map == null) {
-			if (map.isEmpty())
-				return;
-			this.map = new LinkedHashMap<String,Attrs>();
-		}
-		this.map.putAll(map);
-	}
-
-	public void putAllIfAbsent(Map<String, ? extends Attrs> map) {
-		for (Map.Entry<String, ? extends Attrs> entry : map.entrySet()) {
-			if (!containsKey(entry.getKey()))
-				put(entry.getKey(), entry.getValue());
-		}
-	}
-
-	@SuppressWarnings("cast")
-	@Deprecated
-	public Attrs remove(Object var0) {
-		assert var0 instanceof String;
-		if (map == null)
-			return null;
-
-		return map.remove((String) var0);
-	}
-
-	public Attrs remove(String var0) {
-		if (map == null)
-			return null;
-		return map.remove(var0);
-	}
-
-	public int size() {
-		if (map == null)
-			return 0;
-		return map.size();
-	}
-
-	public Collection<Attrs> values() {
-		if (map == null)
-			return EMPTY.values();
-
-		return map.values();
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		append(sb);
-		return sb.toString();
-	}
-
-	public void append(StringBuilder sb) {
-		String del = "";
-		for (Map.Entry<String,Attrs> s : entrySet()) {
-			sb.append(del);
-			sb.append(s.getKey());
-			if (!s.getValue().isEmpty()) {
-				sb.append(';');
-				s.getValue().append(sb);
-			}
-
-			del = ",";
-		}
-	}
-
-	@Deprecated
-	public boolean equals(Object other) {
-		return super.equals(other);
-	}
-
-	@Deprecated
-	public int hashCode() {
-		return super.hashCode();
-	}
-
-	public boolean isEqual(Parameters other) {
-		if (this == other)
-			return true;
-
-		if (size() != other.size())
-			return false;
-
-		if (isEmpty())
-			return true;
-
-		SortedList<String> l = new SortedList<String>(keySet());
-		SortedList<String> lo = new SortedList<String>(other.keySet());
-		if (!l.isEqual(lo))
-			return false;
-
-		for (String key : keySet()) {
-			if (!get(key).isEqual(other.get(key)))
-				return false;
-		}
-		return true;
-	}
-
-	public Map<String, ? extends Map<String,String>> asMapMap() {
-		return this;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/libg/header/packageinfo b/bundleplugin/src/main/java/aQute/libg/header/packageinfo
deleted file mode 100644
index e39f616..0000000
--- a/bundleplugin/src/main/java/aQute/libg/header/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.1.0
diff --git a/bundleplugin/src/main/java/aQute/libg/reporter/ReporterAdapter.java b/bundleplugin/src/main/java/aQute/libg/reporter/ReporterAdapter.java
index 4ed2ff1..e08c569 100644
--- a/bundleplugin/src/main/java/aQute/libg/reporter/ReporterAdapter.java
+++ b/bundleplugin/src/main/java/aQute/libg/reporter/ReporterAdapter.java
@@ -10,7 +10,7 @@
 /**
  * Mainly used for testing where reporters are needed.
  */
-public class ReporterAdapter implements Reporter, Report {
+public class ReporterAdapter implements Reporter, Report, Runnable {
 	final List<String>	errors		= new ArrayList<String>();
 	final List<String>	warnings	= new ArrayList<String>();
 	final List<LocationImpl> locations = new ArrayList<LocationImpl>();
@@ -204,8 +204,9 @@
 			return true;
 
 		if (!missed.isEmpty())
-			error("Missed the following patterns in the warnings or errors: %s", missed);
+			System.err.println("Missed the following patterns in the warnings or errors: " + missed);
 
+		report(System.err);
 		return false;
 	}
 
@@ -258,4 +259,19 @@
 		return null;
 	}
 
+	/**
+	 * Handy routine that can be extended by subclasses
+	 * so they can run inside the context
+	 */
+	public void run() {
+		throw new UnsupportedOperationException("Must be implemented by subclass");
+	}
+
+	/**
+	 * Return a messages object bound to this adapter
+	 */
+	
+	public <T> T getMessages(Class<T> c) {
+		return ReporterMessages.base(this, c);
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/libg/reporter/ReporterMessages.java b/bundleplugin/src/main/java/aQute/libg/reporter/ReporterMessages.java
index 375dbc6..d2ca832 100644
--- a/bundleplugin/src/main/java/aQute/libg/reporter/ReporterMessages.java
+++ b/bundleplugin/src/main/java/aQute/libg/reporter/ReporterMessages.java
@@ -10,7 +10,7 @@
 
 public class ReporterMessages {
 
-	static class WARNINGImpl implements ERROR {
+	static class WARNINGImpl implements WARNING {
 		Reporter.SetLocation	loc;
 
 		public SetLocation file(String file) {
@@ -42,7 +42,7 @@
 		}
 	}
 
-	static class ERRORImpl extends WARNINGImpl implements WARNING {
+	static class ERRORImpl extends WARNINGImpl implements ERROR {
 		public ERRORImpl(SetLocation e) {
 			super(e);
 		}
diff --git a/bundleplugin/src/main/java/aQute/libg/version/Version.java b/bundleplugin/src/main/java/aQute/libg/version/Version.java
deleted file mode 100755
index 77d21e4..0000000
--- a/bundleplugin/src/main/java/aQute/libg/version/Version.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package aQute.libg.version;
-
-import java.util.regex.*;
-
-public class Version implements Comparable<Version> {
-	final int					major;
-	final int					minor;
-	final int					micro;
-	final String				qualifier;
-	public final static String	VERSION_STRING	= "(\\d+)(\\.(\\d+)(\\.(\\d+)(\\.([-_\\da-zA-Z]+))?)?)?";
-	public final static Pattern	VERSION			= Pattern.compile(VERSION_STRING);
-	public final static Version	LOWEST			= new Version();
-	public final static Version	HIGHEST			= new Version(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE,
-														"\uFFFF");
-
-	public static final Version	emptyVersion	= LOWEST;
-	public static final Version	ONE				= new Version(1, 0, 0);
-
-	public Version() {
-		this(0);
-	}
-
-	public Version(int major, int minor, int micro, String qualifier) {
-		this.major = major;
-		this.minor = minor;
-		this.micro = micro;
-		this.qualifier = qualifier;
-	}
-
-	public Version(int major, int minor, int micro) {
-		this(major, minor, micro, null);
-	}
-
-	public Version(int major, int minor) {
-		this(major, minor, 0, null);
-	}
-
-	public Version(int major) {
-		this(major, 0, 0, null);
-	}
-
-	public Version(String version) {
-		version = version.trim();
-		Matcher m = VERSION.matcher(version);
-		if (!m.matches())
-			throw new IllegalArgumentException("Invalid syntax for version: " + version);
-
-		major = Integer.parseInt(m.group(1));
-		if (m.group(3) != null)
-			minor = Integer.parseInt(m.group(3));
-		else
-			minor = 0;
-
-		if (m.group(5) != null)
-			micro = Integer.parseInt(m.group(5));
-		else
-			micro = 0;
-
-		qualifier = m.group(7);
-	}
-
-	public int getMajor() {
-		return major;
-	}
-
-	public int getMinor() {
-		return minor;
-	}
-
-	public int getMicro() {
-		return micro;
-	}
-
-	public String getQualifier() {
-		return qualifier;
-	}
-
-	public int compareTo(Version other) {
-		if (other == this)
-			return 0;
-
-		Version o = other;
-		if (major != o.major)
-			return major - o.major;
-
-		if (minor != o.minor)
-			return minor - o.minor;
-
-		if (micro != o.micro)
-			return micro - o.micro;
-
-		int c = 0;
-		if (qualifier != null)
-			c = 1;
-		if (o.qualifier != null)
-			c += 2;
-
-		switch (c) {
-			case 0 :
-				return 0;
-			case 1 :
-				return 1;
-			case 2 :
-				return -1;
-		}
-		return qualifier.compareTo(o.qualifier);
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		sb.append(major);
-		sb.append(".");
-		sb.append(minor);
-		sb.append(".");
-		sb.append(micro);
-		if (qualifier != null) {
-			sb.append(".");
-			sb.append(qualifier);
-		}
-		return sb.toString();
-	}
-
-	public boolean equals(Object ot) {
-		if (!(ot instanceof Version))
-			return false;
-
-		return compareTo((Version) ot) == 0;
-	}
-
-	public int hashCode() {
-		return major * 97 ^ minor * 13 ^ micro + (qualifier == null ? 97 : qualifier.hashCode());
-	}
-
-	public int get(int i) {
-		switch (i) {
-			case 0 :
-				return major;
-			case 1 :
-				return minor;
-			case 2 :
-				return micro;
-			default :
-				throw new IllegalArgumentException("Version can only get 0 (major), 1 (minor), or 2 (micro)");
-		}
-	}
-
-	public static Version parseVersion(String version) {
-		if (version == null) {
-			return LOWEST;
-		}
-
-		version = version.trim();
-		if (version.length() == 0) {
-			return LOWEST;
-		}
-
-		return new Version(version);
-
-	}
-
-	public Version getWithoutQualifier() {
-		return new Version(major, minor, micro);
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/libg/version/VersionRange.java b/bundleplugin/src/main/java/aQute/libg/version/VersionRange.java
deleted file mode 100755
index 3e00c76..0000000
--- a/bundleplugin/src/main/java/aQute/libg/version/VersionRange.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package aQute.libg.version;
-
-import java.util.*;
-import java.util.regex.*;
-
-public class VersionRange {
-	Version			high;
-	Version			low;
-	char			start	= '[';
-	char			end		= ']';
-
-	static Pattern	RANGE	= Pattern.compile("(\\(|\\[)\\s*(" + Version.VERSION_STRING + ")\\s*,\\s*("
-									+ Version.VERSION_STRING + ")\\s*(\\)|\\])");
-
-	public VersionRange(String string) {
-		string = string.trim();
-		Matcher m = RANGE.matcher(string);
-		if (m.matches()) {
-			start = m.group(1).charAt(0);
-			String v1 = m.group(2);
-			String v2 = m.group(10);
-			low = new Version(v1);
-			high = new Version(v2);
-			end = m.group(18).charAt(0);
-			if (low.compareTo(high) > 0)
-				throw new IllegalArgumentException("Low Range is higher than High Range: " + low + "-" + high);
-
-		} else
-			high = low = new Version(string);
-	}
-
-	public boolean isRange() {
-		return high != low;
-	}
-
-	public boolean includeLow() {
-		return start == '[';
-	}
-
-	public boolean includeHigh() {
-		return end == ']';
-	}
-
-	public String toString() {
-		if (high == low)
-			return high.toString();
-
-		StringBuilder sb = new StringBuilder();
-		sb.append(start);
-		sb.append(low);
-		sb.append(',');
-		sb.append(high);
-		sb.append(end);
-		return sb.toString();
-	}
-
-	public Version getLow() {
-		return low;
-	}
-
-	public Version getHigh() {
-		return high;
-	}
-
-	public boolean includes(Version v) {
-		if (!isRange()) {
-			return low.compareTo(v) <= 0;
-		}
-		if (includeLow()) {
-			if (v.compareTo(low) < 0)
-				return false;
-		} else if (v.compareTo(low) <= 0)
-			return false;
-
-		if (includeHigh()) {
-			if (v.compareTo(high) > 0)
-				return false;
-		} else if (v.compareTo(high) >= 0)
-			return false;
-
-		return true;
-	}
-
-	public Iterable<Version> filter(final Iterable<Version> versions) {
-		List<Version> list = new ArrayList<Version>();
-		for (Version v : versions) {
-			if (includes(v))
-				list.add(v);
-		}
-		return list;
-	}
-
-}
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/libg/version/packageinfo b/bundleplugin/src/main/java/aQute/libg/version/packageinfo
deleted file mode 100644
index b3d1f97..0000000
--- a/bundleplugin/src/main/java/aQute/libg/version/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0.1
