Update to latest refactored bndlib

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1362033 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java b/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
index 21c1509..322a2e8 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
@@ -2,6 +2,7 @@
 
 import java.util.*;
 
+
 public class MultiMap<K, V> extends HashMap<K,List<V>> {
 	private static final long	serialVersionUID	= 1L;
 	final boolean				noduplicates;
@@ -22,6 +23,15 @@
 		this.valueClass = valueClass;
 	}
 
+	public MultiMap(MultiMap<K,V> other) {
+		keyClass = other.keyClass;
+		valueClass  = other.valueClass;
+		noduplicates = other.noduplicates;
+		for ( java.util.Map.Entry<K,List<V>> e : other.entrySet()) {
+			addAll(e.getKey(), e.getValue());
+		}
+	}
+
 	@SuppressWarnings("unchecked")
 	public boolean add(K key, V value) {
 		assert keyClass.isInstance(key);
@@ -57,7 +67,7 @@
 			boolean r = false;
 			for (V v : value) {
 				assert valueClass.isInstance(v);
-				if (!set.contains(value))
+				if (!set.contains(v))
 					r |= set.add(v);
 			}
 			return r;
diff --git a/bundleplugin/src/main/java/aQute/lib/converter/Converter.java b/bundleplugin/src/main/java/aQute/lib/converter/Converter.java
index 621b558..a227d71 100644
--- a/bundleplugin/src/main/java/aQute/lib/converter/Converter.java
+++ b/bundleplugin/src/main/java/aQute/lib/converter/Converter.java
@@ -38,8 +38,8 @@
 	public Object convert(Type type, Object o) throws Exception {
 		Class resultType = getRawClass(type);
 		if (o == null) {
-			if (resultType.isPrimitive()||  Number.class.isAssignableFrom(resultType)) 
-				return convert(type,0);
+			if (resultType.isPrimitive() || Number.class.isAssignableFrom(resultType))
+				return convert(type, 0);
 
 			return null; // compatible with any
 		}
@@ -231,27 +231,40 @@
 		}
 
 		if (o instanceof Map) {
+			String key = null;
 			try {
 				Map<Object,Object> map = (Map) o;
 				Object instance = resultType.newInstance();
 				for (Map.Entry e : map.entrySet()) {
-					String key = (String) e.getKey();
-					Field f = resultType.getField(key);
-					Object value = convert(f.getGenericType(), e.getValue());
-					f.set(instance, value);
+					key = (String) e.getKey();
+					try {
+						Field f = resultType.getField(key);
+						Object value = convert(f.getGenericType(), e.getValue());
+						f.set(instance, value);
+					}
+					catch (Exception ee) {
+						
+						// We cannot find the key, so try the __extra field
+						Field f = resultType.getField("__extra");
+						Map<String,Object> extra = (Map<String,Object>) f.get(instance);
+						if ( extra == null) {
+							extra = new HashMap<String,Object>();
+							f.set(instance, extra);
+						}
+						extra.put(key, convert(Object.class,e.getValue()));
+						
+					}
 				}
 				return instance;
 			}
 			catch (Exception e) {
-				// fall through
+				return error("No conversion found for " + o.getClass() + " to " + type + ", error " + e + " on key " + key);
 			}
 		}
 
 		return error("No conversion found for " + o.getClass() + " to " + type);
 	}
 
-
-
 	private Number number(Object o) {
 		if (o instanceof Number)
 			return (Number) o;
@@ -446,10 +459,10 @@
 
 			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 				Object o = properties.get(method.getName());
-				if ( o == null)
+				if (o == null)
 					o = properties.get(mangleMethodName(method.getName()));
 
-				return convert( method.getGenericReturnType(), o);
+				return convert(method.getGenericReturnType(), o);
 			}
 
 		});
@@ -471,4 +484,17 @@
 		}
 		return sb.toString();
 	}
+
+	public static <T> T cnv(TypeReference<T> tr, Object source) throws Exception {
+		return new Converter().convert(tr, source);
+	}
+
+	public static <T> T cnv(Class<T> tr, Object source) throws Exception {
+		return new Converter().convert(tr, source);
+	}
+
+	public static Object cnv(Type tr, Object source) throws Exception {
+		return new Converter().convert(tr, source);
+	}
+
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java b/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java
index 9b01ff7..84c3c46 100644
--- a/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java
+++ b/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java
@@ -5,9 +5,8 @@
 import java.util.jar.*;
 import java.util.regex.*;
 
-import aQute.lib.osgi.*;
-import aQute.libg.header.*;
-import aQute.libg.version.*;
+import aQute.bnd.header.*;
+import aQute.bnd.osgi.*;
 import aQute.service.reporter.*;
 
 public class FileInstallRepo extends FileRepo {
diff --git a/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java b/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java
index 3703b8b..d34ef98 100644
--- a/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java
+++ b/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java
@@ -5,11 +5,10 @@
 import java.util.jar.*;
 import java.util.regex.*;
 
+import aQute.bnd.header.*;
+import aQute.bnd.osgi.*;
 import aQute.bnd.service.*;
 import aQute.lib.io.*;
-import aQute.lib.osgi.*;
-import aQute.libg.header.*;
-import aQute.libg.version.*;
 import aQute.service.reporter.*;
 
 public class FileRepo implements Plugin, RepositoryPlugin, Refreshable, RegistryPlugin {
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/About.java b/bundleplugin/src/main/java/aQute/lib/osgi/About.java
deleted file mode 100755
index 0fdf402..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/About.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package aQute.lib.osgi;
-
-import aQute.libg.header.*;
-
-/**
- * This package contains a number of classes that assists by analyzing JARs and
- * constructing bundles. The Analyzer class can be used to analyze an existing
- * bundle and can create a manifest specification from proposed (wildcard)
- * Export-Package, Bundle-Includes, and Import-Package headers. The Builder
- * class can use the headers to construct a JAR from the classpath. The Verifier
- * class can take an existing JAR and verify that all headers are correctly set.
- * It will verify the syntax of the headers, match it against the proper
- * contents, and verify imports and exports. A number of utility classes are
- * available. Jar, provides an abstraction of a Jar file. It has constructors
- * for creating a Jar from a stream, a directory, or a jar file. A Jar, keeps a
- * collection Resource's. There are Resource implementations for File, from
- * ZipFile, or from a stream (which copies the data). The Jar tries to minimize
- * the work during build up so that it is cheap to use. The Resource's can be
- * used to iterate over the names and later read the resources when needed.
- * Clazz, provides a parser for the class files. This will be used to define the
- * imports and exports. Headers are translated to {@link Parameters} that
- * contains all headers (the order is maintained). The attribute of each header
- * are maintained in an {@link Attrs}. Each additional file in a header
- * definition will have its own entry (only native code does not work this way).
- * The ':' of directives is considered part of the name. This allows attributes
- * and directives to be maintained in the Attributes map. An important aspect of
- * the specification is to allow the use of wildcards. Wildcards select from a
- * set and can decorate the entries with new attributes. This functionality is
- * implemented in Instructions. Much of the information calculated is in
- * packages. A package is identified by a PackageRef (and a type by a TypeRef).
- * The namespace is maintained by {@link Descriptors}, which here is owned by
- * {@link Analyzer}. A special class, {@link Packages} maintains the attributes
- * that are found in the code.
- * 
- * @version $Revision$
- */
-public class About {
-	// Empty
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/AbstractResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/AbstractResource.java
deleted file mode 100644
index 782e615..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/AbstractResource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-
-public abstract class AbstractResource implements Resource {
-	String	extra;
-	byte[]	calculated;
-	long	lastModified;
-
-	protected AbstractResource(long modified) {
-		lastModified = modified;
-	}
-
-	public String getExtra() {
-		return extra;
-	}
-
-	public long lastModified() {
-		return lastModified;
-	}
-
-	public InputStream openInputStream() throws IOException {
-		return new ByteArrayInputStream(getLocalBytes());
-	}
-
-	private byte[] getLocalBytes() throws IOException {
-		try {
-			if (calculated != null)
-				return calculated;
-
-			return calculated = getBytes();
-		}
-		catch (IOException e) {
-			throw e;
-		}
-		catch (Exception e) {
-			IOException ee = new IOException("Opening resource");
-			ee.initCause(e);
-			throw ee;
-		}
-	}
-
-	public void setExtra(String extra) {
-		this.extra = extra;
-	}
-
-	public void write(OutputStream out) throws IOException {
-		out.write(getLocalBytes());
-	}
-
-	abstract protected byte[] getBytes() throws Exception;
-
-	public long size() throws IOException {
-		return getLocalBytes().length;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Analyzer.java b/bundleplugin/src/main/java/aQute/lib/osgi/Analyzer.java
deleted file mode 100755
index 4f26d94..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Analyzer.java
+++ /dev/null
@@ -1,2414 +0,0 @@
-package aQute.lib.osgi;
-
-/**
- * This class can calculate the required headers for a (potential) JAR file. It
- * analyzes a directory or JAR for the packages that are contained and that are
- * referred to by the bytecodes. The user can the use regular expressions to
- * define the attributes and directives. The matching is not fully regex for
- * convenience. A * and ? get a . prefixed and dots are escaped.
- * 
- * <pre>
- *                                                             			*;auto=true				any		
- *                                                             			org.acme.*;auto=true    org.acme.xyz
- *                                                             			org.[abc]*;auto=true    org.acme.xyz
- * </pre>
- * 
- * Additional, the package instruction can start with a '=' or a '!'. The '!'
- * indicates negation. Any matching package is removed. The '=' is literal, the
- * expression will be copied verbatim and no matching will take place.
- * 
- * Any headers in the given properties are used in the output properties.
- */
-import static aQute.libg.generics.Create.*;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.jar.*;
-import java.util.jar.Attributes.Name;
-import java.util.regex.*;
-
-import aQute.bnd.annotation.*;
-import aQute.bnd.service.*;
-import aQute.lib.base64.*;
-import aQute.lib.collections.*;
-import aQute.lib.filter.*;
-import aQute.lib.hex.*;
-import aQute.lib.io.*;
-import aQute.lib.osgi.Descriptors.Descriptor;
-import aQute.lib.osgi.Descriptors.PackageRef;
-import aQute.lib.osgi.Descriptors.TypeRef;
-import aQute.libg.cryptography.*;
-import aQute.libg.generics.*;
-import aQute.libg.header.*;
-import aQute.libg.reporter.*;
-import aQute.libg.version.Version;
-
-public class Analyzer extends Processor {
-	private final SortedSet<Clazz.JAVA>				ees						= new TreeSet<Clazz.JAVA>();
-	static Properties								bndInfo;
-
-	// Bundle parameters
-	private Jar										dot;
-	private final Packages							contained				= new Packages();
-	private final Packages							referred				= new Packages();
-	private Packages								exports;
-	private Packages								imports;
-	private TypeRef									activator;
-
-	// Global parameters
-	private final MultiMap<PackageRef,PackageRef>	uses					= new MultiMap<PackageRef,PackageRef>(
-																					PackageRef.class, PackageRef.class,
-																					true);
-	private final Packages							classpathExports		= new Packages();
-	private final Descriptors						descriptors				= new Descriptors();
-	private final List<Jar>							classpath				= list();
-	private final Map<TypeRef,Clazz>				classspace				= map();
-	private final Map<TypeRef,Clazz>				importedClassesCache	= map();
-	private boolean									analyzed				= false;
-	private boolean									diagnostics				= false;
-	private boolean									inited					= false;
-	final protected AnalyzerMessages				msgs					= ReporterMessages.base(this,
-																					AnalyzerMessages.class);
-
-	public Analyzer(Processor parent) {
-		super(parent);
-	}
-
-	public Analyzer() {}
-
-	/**
-	 * Specifically for Maven
-	 * 
-	 * @param properties
-	 *            the properties
-	 */
-
-	public static Properties getManifest(File dirOrJar) throws Exception {
-		Analyzer analyzer = new Analyzer();
-		try {
-			analyzer.setJar(dirOrJar);
-			Properties properties = new Properties();
-			properties.put(IMPORT_PACKAGE, "*");
-			properties.put(EXPORT_PACKAGE, "*");
-			analyzer.setProperties(properties);
-			Manifest m = analyzer.calcManifest();
-			Properties result = new Properties();
-			for (Iterator<Object> i = m.getMainAttributes().keySet().iterator(); i.hasNext();) {
-				Attributes.Name name = (Attributes.Name) i.next();
-				result.put(name.toString(), m.getMainAttributes().getValue(name));
-			}
-			return result;
-		}
-		finally {
-			analyzer.close();
-		}
-	}
-
-	/**
-	 * Calculates the data structures for generating a manifest.
-	 * 
-	 * @throws IOException
-	 */
-	public void analyze() throws Exception {
-		if (!analyzed) {
-			analyzed = true;
-			uses.clear();
-			classspace.clear();
-			classpathExports.clear();
-
-			// Parse all the class in the
-			// the jar according to the OSGi bcp
-			analyzeBundleClasspath();
-
-			//
-			// calculate class versions in use
-			//
-			for (Clazz c : classspace.values()) {
-				ees.add(c.getFormat());
-			}
-
-			//
-			// Get exported packages from the
-			// entries on the classpath
-			//
-
-			for (Jar current : getClasspath()) {
-				getExternalExports(current, classpathExports);
-				for (String dir : current.getDirectories().keySet()) {
-					PackageRef packageRef = getPackageRef(dir);
-					Resource resource = current.getResource(dir + "/packageinfo");
-					getExportVersionsFromPackageInfo(packageRef, resource, classpathExports);
-				}
-			}
-
-			// Handle the bundle activator
-
-			String s = getProperty(BUNDLE_ACTIVATOR);
-			if (s != null) {
-				activator = getTypeRefFromFQN(s);
-				referTo(activator);
-				trace("activator %s %s", s, activator);
-			}
-
-			// Execute any plugins
-			// TODO handle better reanalyze
-			doPlugins();
-
-			Jar extra = getExtra();
-			while (extra != null) {
-				dot.addAll(extra);
-				analyzeJar(extra, "", true);
-				extra = getExtra();
-			}
-
-			referred.keySet().removeAll(contained.keySet());
-
-			//
-			// EXPORTS
-			//
-			{
-				Set<Instruction> unused = Create.set();
-
-				Instructions filter = new Instructions(getExportPackage());
-				filter.append(getExportContents());
-
-				exports = filter(filter, contained, unused);
-
-				if (!unused.isEmpty()) {
-					warning("Unused Export-Package instructions: %s ", unused);
-				}
-
-				// See what information we can find to augment the
-				// exports. I.e. look on the classpath
-				augmentExports(exports);
-			}
-
-			//
-			// IMPORTS
-			// Imports MUST come after exports because we use information from
-			// the exports
-			//
-			{
-				// Add all exports that do not have an -noimport: directive
-				// to the imports.
-				Packages referredAndExported = new Packages(referred);
-				referredAndExported.putAll(doExportsToImports(exports));
-
-				removeDynamicImports(referredAndExported);
-
-				// Remove any Java references ... where are the closures???
-				for (Iterator<PackageRef> i = referredAndExported.keySet().iterator(); i.hasNext();) {
-					if (i.next().isJava())
-						i.remove();
-				}
-
-				Set<Instruction> unused = Create.set();
-				String h = getProperty(IMPORT_PACKAGE);
-				if (h == null) // If not set use a default
-					h = "*";
-
-				if (isPedantic() && h.trim().length() == 0)
-					warning("Empty Import-Package header");
-
-				Instructions filter = new Instructions(h);
-				imports = filter(filter, referredAndExported, unused);
-				if (!unused.isEmpty()) {
-					// We ignore the end wildcard catch
-					if (!(unused.size() == 1 && unused.iterator().next().toString().equals("*")))
-						warning("Unused Import-Package instructions: %s ", unused);
-				}
-
-				// See what information we can find to augment the
-				// imports. I.e. look in the exports
-				augmentImports(imports, exports);
-			}
-
-			//
-			// USES
-			//
-			// Add the uses clause to the exports
-			doUses(exports, uses, imports);
-
-			//
-			// Checks
-			//
-			if (referred.containsKey(Descriptors.DEFAULT_PACKAGE)) {
-				error("The default package '.' is not permitted by the Import-Package syntax. \n"
-						+ " This can be caused by compile errors in Eclipse because Eclipse creates \n"
-						+ "valid class files regardless of compile errors.\n"
-						+ "The following package(s) import from the default package "
-						+ uses.transpose().get(Descriptors.DEFAULT_PACKAGE));
-			}
-
-		}
-	}
-
-	/**
-	 * Discussed with BJ and decided to kill the .
-	 * 
-	 * @param referredAndExported
-	 */
-	void removeDynamicImports(Packages referredAndExported) {
-
-		// // Remove any matching a dynamic import package instruction
-		// Instructions dynamicImports = new
-		// Instructions(getDynamicImportPackage());
-		// Collection<PackageRef> dynamic = dynamicImports.select(
-		// referredAndExported.keySet(), false);
-		// referredAndExported.keySet().removeAll(dynamic);
-	}
-
-	protected Jar getExtra() throws Exception {
-		return null;
-	}
-
-	/**
-	 * 
-	 */
-	void doPlugins() {
-		for (AnalyzerPlugin plugin : getPlugins(AnalyzerPlugin.class)) {
-			try {
-				boolean reanalyze = plugin.analyzeJar(this);
-				if (reanalyze) {
-					classspace.clear();
-					analyzeBundleClasspath();
-				}
-			}
-			catch (Exception e) {
-				error("Analyzer Plugin %s failed %s", plugin, e);
-			}
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	boolean isResourceOnly() {
-		return isTrue(getProperty(RESOURCEONLY));
-	}
-
-	/**
-	 * One of the main workhorses of this class. This will analyze the current
-	 * setp and calculate a new manifest according to this setup. This method
-	 * will also set the manifest on the main jar dot
-	 * 
-	 * @return
-	 * @throws IOException
-	 */
-	public Manifest calcManifest() throws Exception {
-		analyze();
-		Manifest manifest = new Manifest();
-		Attributes main = manifest.getMainAttributes();
-
-		main.put(Attributes.Name.MANIFEST_VERSION, "1.0");
-		main.putValue(BUNDLE_MANIFESTVERSION, "2");
-
-		boolean noExtraHeaders = "true".equalsIgnoreCase(getProperty(NOEXTRAHEADERS));
-
-		if (!noExtraHeaders) {
-			main.putValue(CREATED_BY, System.getProperty("java.version") + " (" + System.getProperty("java.vendor")
-					+ ")");
-			main.putValue(TOOL, "Bnd-" + getBndVersion());
-			main.putValue(BND_LASTMODIFIED, "" + System.currentTimeMillis());
-		}
-
-		String exportHeader = printClauses(exports, true);
-
-		if (exportHeader.length() > 0)
-			main.putValue(EXPORT_PACKAGE, exportHeader);
-		else
-			main.remove(EXPORT_PACKAGE);
-
-		// Remove all the Java packages from the imports
-		if (!imports.isEmpty()) {
-			main.putValue(IMPORT_PACKAGE, printClauses(imports));
-		} else {
-			main.remove(IMPORT_PACKAGE);
-		}
-
-		Packages temp = new Packages(contained);
-		temp.keySet().removeAll(exports.keySet());
-
-		if (!temp.isEmpty())
-			main.putValue(PRIVATE_PACKAGE, printClauses(temp));
-		else
-			main.remove(PRIVATE_PACKAGE);
-
-		Parameters bcp = getBundleClasspath();
-		if (bcp.isEmpty() || (bcp.containsKey(".") && bcp.size() == 1))
-			main.remove(BUNDLE_CLASSPATH);
-		else
-			main.putValue(BUNDLE_CLASSPATH, printClauses(bcp));
-
-		doNamesection(dot, manifest);
-
-		for (Enumeration< ? > h = getProperties().propertyNames(); h.hasMoreElements();) {
-			String header = (String) h.nextElement();
-			if (header.trim().length() == 0) {
-				warning("Empty property set with value: " + getProperties().getProperty(header));
-				continue;
-			}
-
-			if (isMissingPlugin(header.trim())) {
-				error("Missing plugin for command %s", header);
-			}
-			if (!Character.isUpperCase(header.charAt(0))) {
-				if (header.charAt(0) == '@')
-					doNameSection(manifest, header);
-				continue;
-			}
-
-			if (header.equals(BUNDLE_CLASSPATH) || header.equals(EXPORT_PACKAGE) || header.equals(IMPORT_PACKAGE))
-				continue;
-
-			if (header.equalsIgnoreCase("Name")) {
-				error("Your bnd file contains a header called 'Name'. This interferes with the manifest name section.");
-				continue;
-			}
-
-			if (Verifier.HEADER_PATTERN.matcher(header).matches()) {
-				String value = getProperty(header);
-				if (value != null && main.getValue(header) == null) {
-					if (value.trim().length() == 0)
-						main.remove(header);
-					else if (value.trim().equals(EMPTY_HEADER))
-						main.putValue(header, "");
-					else
-						main.putValue(header, value);
-				}
-			} else {
-				// TODO should we report?
-			}
-		}
-
-		//
-		// Calculate the bundle symbolic name if it is
-		// not set.
-		// 1. set
-		// 2. name of properties file (must be != bnd.bnd)
-		// 3. name of directory, which is usualy project name
-		//
-		String bsn = getBsn();
-		if (main.getValue(BUNDLE_SYMBOLICNAME) == null) {
-			main.putValue(BUNDLE_SYMBOLICNAME, bsn);
-		}
-
-		//
-		// Use the same name for the bundle name as BSN when
-		// the bundle name is not set
-		//
-		if (main.getValue(BUNDLE_NAME) == null) {
-			main.putValue(BUNDLE_NAME, bsn);
-		}
-
-		if (main.getValue(BUNDLE_VERSION) == null)
-			main.putValue(BUNDLE_VERSION, "0");
-
-		// Copy old values into new manifest, when they
-		// exist in the old one, but not in the new one
-		merge(manifest, dot.getManifest());
-
-		// Remove all the headers mentioned in -removeheaders
-		Instructions instructions = new Instructions(getProperty(REMOVEHEADERS));
-		Collection<Object> result = instructions.select(main.keySet(), false);
-		main.keySet().removeAll(result);
-
-		dot.setManifest(manifest);
-		return manifest;
-	}
-
-	/**
-	 * Parse the namesection as instructions and then match them against the
-	 * current set of resources For example:
-	 * 
-	 * <pre>
-	 * 	-namesection: *;baz=true, abc/def/bar/X.class=3
-	 * </pre>
-	 * 
-	 * The raw value of {@link Constants#NAMESECTION} is used but the values of
-	 * the attributes are replaced where @ is set to the resource name. This
-	 * allows macro to operate on the resource
-	 */
-
-	private void doNamesection(Jar dot, Manifest manifest) {
-
-		Parameters namesection = parseHeader(getProperties().getProperty(NAMESECTION));
-		Instructions instructions = new Instructions(namesection);
-		Set<String> resources = new HashSet<String>(dot.getResources().keySet());
-
-		//
-		// For each instruction, iterator over the resources and filter
-		// them. If a resource matches, it must be removed even if the
-		// instruction is negative. If positive, add a name section
-		// to the manifest for the given resource name. Then add all
-		// attributes from the instruction to that name section.
-		//
-		for (Map.Entry<Instruction,Attrs> instr : instructions.entrySet()) {
-			boolean matched = false;
-
-			// For each instruction
-
-			for (Iterator<String> i = resources.iterator(); i.hasNext();) {
-				String path = i.next();
-				// For each resource
-
-				if (instr.getKey().matches(path)) {
-
-					// Instruction matches the resource
-
-					matched = true;
-					if (!instr.getKey().isNegated()) {
-
-						// Positive match, add the attributes
-
-						Attributes attrs = manifest.getAttributes(path);
-						if (attrs == null) {
-							attrs = new Attributes();
-							manifest.getEntries().put(path, attrs);
-						}
-
-						//
-						// Add all the properties from the instruction to the
-						// name section
-						//
-
-						for (Map.Entry<String,String> property : instr.getValue().entrySet()) {
-							setProperty("@", path);
-							try {
-								String processed = getReplacer().process(property.getValue());
-								attrs.putValue(property.getKey(), processed);
-							}
-							finally {
-								unsetProperty("@");
-							}
-						}
-					}
-					i.remove();
-				}
-			}
-
-			if (!matched && resources.size() > 0)
-				warning("The instruction %s in %s did not match any resources", instr.getKey(), NAMESECTION);
-		}
-
-	}
-
-	/**
-	 * This method is called when the header starts with a @, signifying a name
-	 * section header. The name part is defined by replacing all the @ signs to
-	 * a /, removing the first and the last, and using the last part as header
-	 * name:
-	 * 
-	 * <pre>
-	 * &#064;org@osgi@service@event@Implementation-Title
-	 * </pre>
-	 * 
-	 * This will be the header Implementation-Title in the
-	 * org/osgi/service/event named section.
-	 * 
-	 * @param manifest
-	 * @param header
-	 */
-	private void doNameSection(Manifest manifest, String header) {
-		String path = header.replace('@', '/');
-		int n = path.lastIndexOf('/');
-		// Must succeed because we start with @
-		String name = path.substring(n + 1);
-		// Skip first /
-		path = path.substring(1, n);
-		if (name.length() != 0 && path.length() != 0) {
-			Attributes attrs = manifest.getAttributes(path);
-			if (attrs == null) {
-				attrs = new Attributes();
-				manifest.getEntries().put(path, attrs);
-			}
-			attrs.putValue(name, getProperty(header));
-		} else {
-			warning("Invalid header (starts with @ but does not seem to be for the Name section): %s", header);
-		}
-	}
-
-	/**
-	 * Clear the key part of a header. I.e. remove everything from the first ';'
-	 * 
-	 * @param value
-	 * @return
-	 */
-	public String getBsn() {
-		String value = getProperty(BUNDLE_SYMBOLICNAME);
-		if (value == null) {
-			if (getPropertiesFile() != null)
-				value = getPropertiesFile().getName();
-
-			String projectName = getBase().getName();
-			if (value == null || value.equals("bnd.bnd")) {
-				value = projectName;
-			} else if (value.endsWith(".bnd")) {
-				value = value.substring(0, value.length() - 4);
-				if (!value.startsWith(getBase().getName()))
-					value = projectName + "." + value;
-			}
-		}
-
-		if (value == null)
-			return "untitled";
-
-		int n = value.indexOf(';');
-		if (n > 0)
-			value = value.substring(0, n);
-		return value.trim();
-	}
-
-	public String _bsn(@SuppressWarnings("unused") String args[]) {
-		return getBsn();
-	}
-
-	/**
-	 * Calculate an export header solely based on the contents of a JAR file
-	 * 
-	 * @param bundle
-	 *            The jar file to analyze
-	 * @return
-	 */
-	public String calculateExportsFromContents(Jar bundle) {
-		String ddel = "";
-		StringBuilder sb = new StringBuilder();
-		Map<String,Map<String,Resource>> map = bundle.getDirectories();
-		for (Iterator<String> i = map.keySet().iterator(); i.hasNext();) {
-			String directory = i.next();
-			if (directory.equals("META-INF") || directory.startsWith("META-INF/"))
-				continue;
-			if (directory.equals("OSGI-OPT") || directory.startsWith("OSGI-OPT/"))
-				continue;
-			if (directory.equals("/"))
-				continue;
-
-			if (directory.endsWith("/"))
-				directory = directory.substring(0, directory.length() - 1);
-
-			directory = directory.replace('/', '.');
-			sb.append(ddel);
-			sb.append(directory);
-			ddel = ",";
-		}
-		return sb.toString();
-	}
-
-	public Packages getContained() {
-		return contained;
-	}
-
-	public Packages getExports() {
-		return exports;
-	}
-
-	public Packages getImports() {
-		return imports;
-	}
-
-	public Jar getJar() {
-		return dot;
-	}
-
-	public Packages getReferred() {
-		return referred;
-	}
-
-	/**
-	 * Return the set of unreachable code depending on exports and the bundle
-	 * activator.
-	 * 
-	 * @return
-	 */
-	public Set<PackageRef> getUnreachable() {
-		Set<PackageRef> unreachable = new HashSet<PackageRef>(uses.keySet()); // all
-		for (Iterator<PackageRef> r = exports.keySet().iterator(); r.hasNext();) {
-			PackageRef packageRef = r.next();
-			removeTransitive(packageRef, unreachable);
-		}
-		if (activator != null) {
-			removeTransitive(activator.getPackageRef(), unreachable);
-		}
-		return unreachable;
-	}
-
-	public MultiMap<PackageRef,PackageRef> getUses() {
-		return uses;
-	}
-
-	/**
-	 * Get the version for this bnd
-	 * 
-	 * @return version or unknown.
-	 */
-	public String getBndVersion() {
-		return getBndInfo("version", "<unknown>");
-	}
-
-	public long getBndLastModified() {
-		String time = getBndInfo("lastmodified", "0");
-		try {
-			return Long.parseLong(time);
-		}
-		catch (Exception e) {
-			// Ignore
-		}
-		return 0;
-	}
-
-	public String getBndInfo(String key, String defaultValue) {
-		if (bndInfo == null) {
-			try {
-				Properties bndInfoLocal = new Properties();
-				URL url = Analyzer.class.getResource("bnd.info");
-				if (url != null) {
-					InputStream in = url.openStream();
-					try {
-						bndInfoLocal.load(in);
-					}
-					finally {
-						in.close();
-					}
-				}
-				bndInfo = bndInfoLocal;
-			}
-			catch (Exception e) {
-				e.printStackTrace();
-				return defaultValue;
-			}
-		}
-		String value = bndInfo.getProperty(key);
-		if (value == null)
-			return defaultValue;
-		return value;
-	}
-
-	/**
-	 * Merge the existing manifest with the instructions but do not override
-	 * existing properties.
-	 * 
-	 * @param manifest
-	 *            The manifest to merge with
-	 * @throws IOException
-	 */
-	public void mergeManifest(Manifest manifest) throws IOException {
-		if (manifest != null) {
-			Attributes attributes = manifest.getMainAttributes();
-			for (Iterator<Object> i = attributes.keySet().iterator(); i.hasNext();) {
-				Name name = (Name) i.next();
-				String key = name.toString();
-				// Dont want instructions
-				if (key.startsWith("-"))
-					continue;
-
-				if (getProperty(key) == null)
-					setProperty(key, attributes.getValue(name));
-			}
-		}
-	}
-
-	public void setBase(File file) {
-		super.setBase(file);
-		getProperties().put("project.dir", getBase().getAbsolutePath());
-	}
-
-	/**
-	 * Set the classpath for this analyzer by file.
-	 * 
-	 * @param classpath
-	 * @throws IOException
-	 */
-	public void setClasspath(File[] classpath) throws IOException {
-		List<Jar> list = new ArrayList<Jar>();
-		for (int i = 0; i < classpath.length; i++) {
-			if (classpath[i].exists()) {
-				Jar current = new Jar(classpath[i]);
-				list.add(current);
-			} else {
-				error("Missing file on classpath: %s", classpath[i]);
-			}
-		}
-		for (Iterator<Jar> i = list.iterator(); i.hasNext();) {
-			addClasspath(i.next());
-		}
-	}
-
-	public void setClasspath(Jar[] classpath) {
-		for (int i = 0; i < classpath.length; i++) {
-			addClasspath(classpath[i]);
-		}
-	}
-
-	public void setClasspath(String[] classpath) {
-		for (int i = 0; i < classpath.length; i++) {
-			Jar jar = getJarFromName(classpath[i], " setting classpath");
-			if (jar != null)
-				addClasspath(jar);
-		}
-	}
-
-	/**
-	 * Set the JAR file we are going to work in. This will read the JAR in
-	 * memory.
-	 * 
-	 * @param jar
-	 * @return
-	 * @throws IOException
-	 */
-	public Jar setJar(File jar) throws IOException {
-		Jar jarx = new Jar(jar);
-		addClose(jarx);
-		return setJar(jarx);
-	}
-
-	/**
-	 * Set the JAR directly we are going to work on.
-	 * 
-	 * @param jar
-	 * @return
-	 */
-	public Jar setJar(Jar jar) {
-		if (dot != null)
-			removeClose(dot);
-
-		this.dot = jar;
-		if (dot != null)
-			addClose(dot);
-
-		return jar;
-	}
-
-	protected void begin() {
-		if (inited == false) {
-			inited = true;
-			super.begin();
-
-			updateModified(getBndLastModified(), "bnd last modified");
-			verifyManifestHeadersCase(getProperties());
-
-		}
-	}
-
-	/**
-	 * Try to get a Jar from a file name/path or a url, or in last resort from
-	 * the classpath name part of their files.
-	 * 
-	 * @param name
-	 *            URL or filename relative to the base
-	 * @param from
-	 *            Message identifying the caller for errors
-	 * @return null or a Jar with the contents for the name
-	 */
-	Jar getJarFromName(String name, String from) {
-		File file = new File(name);
-		if (!file.isAbsolute())
-			file = new File(getBase(), name);
-
-		if (file.exists())
-			try {
-				Jar jar = new Jar(file);
-				addClose(jar);
-				return jar;
-			}
-			catch (Exception e) {
-				error("Exception in parsing jar file for " + from + ": " + name + " " + e);
-			}
-		// It is not a file ...
-		try {
-			// Lets try a URL
-			URL url = new URL(name);
-			Jar jar = new Jar(fileName(url.getPath()));
-			addClose(jar);
-			URLConnection connection = url.openConnection();
-			InputStream in = connection.getInputStream();
-			long lastModified = connection.getLastModified();
-			if (lastModified == 0)
-				// We assume the worst :-(
-				lastModified = System.currentTimeMillis();
-			EmbeddedResource.build(jar, in, lastModified);
-			in.close();
-			return jar;
-		}
-		catch (IOException ee) {
-			// Check if we have files on the classpath
-			// that have the right name, allows us to specify those
-			// names instead of the full path.
-			for (Iterator<Jar> cp = getClasspath().iterator(); cp.hasNext();) {
-				Jar entry = cp.next();
-				if (entry.getSource() != null && entry.getSource().getName().equals(name)) {
-					return entry;
-				}
-			}
-			// error("Can not find jar file for " + from + ": " + name);
-		}
-		return null;
-	}
-
-	private String fileName(String path) {
-		int n = path.lastIndexOf('/');
-		if (n > 0)
-			return path.substring(n + 1);
-		return path;
-	}
-
-	/**
-	 * @param manifests
-	 * @throws Exception
-	 */
-	private void merge(Manifest result, Manifest old) {
-		if (old != null) {
-			for (Iterator<Map.Entry<Object,Object>> e = old.getMainAttributes().entrySet().iterator(); e.hasNext();) {
-				Map.Entry<Object,Object> entry = e.next();
-				Attributes.Name name = (Attributes.Name) entry.getKey();
-				String value = (String) entry.getValue();
-				if (name.toString().equalsIgnoreCase("Created-By"))
-					name = new Attributes.Name("Originally-Created-By");
-				if (!result.getMainAttributes().containsKey(name))
-					result.getMainAttributes().put(name, value);
-			}
-
-			// do not overwrite existing entries
-			Map<String,Attributes> oldEntries = old.getEntries();
-			Map<String,Attributes> newEntries = result.getEntries();
-			for (Iterator<Map.Entry<String,Attributes>> e = oldEntries.entrySet().iterator(); e.hasNext();) {
-				Map.Entry<String,Attributes> entry = e.next();
-				if (!newEntries.containsKey(entry.getKey())) {
-					newEntries.put(entry.getKey(), entry.getValue());
-				}
-			}
-		}
-	}
-
-	/**
-	 * Bnd is case sensitive for the instructions so we better check people are
-	 * not using an invalid case. We do allow this to set headers that should
-	 * not be processed by us but should be used by the framework.
-	 * 
-	 * @param properties
-	 *            Properties to verify.
-	 */
-
-	void verifyManifestHeadersCase(Properties properties) {
-		for (Iterator<Object> i = properties.keySet().iterator(); i.hasNext();) {
-			String header = (String) i.next();
-			for (int j = 0; j < headers.length; j++) {
-				if (!headers[j].equals(header) && headers[j].equalsIgnoreCase(header)) {
-					warning("Using a standard OSGi header with the wrong case (bnd is case sensitive!), using: "
-							+ header + " and expecting: " + headers[j]);
-					break;
-				}
-			}
-		}
-	}
-
-	/**
-	 * We will add all exports to the imports unless there is a -noimport
-	 * directive specified on an export. This directive is skipped for the
-	 * manifest. We also remove any version parameter so that augmentImports can
-	 * do the version policy. The following method is really tricky and evolved
-	 * over time. Coming from the original background of OSGi, it was a weird
-	 * idea for me to have a public package that should not be substitutable. I
-	 * was so much convinced that this was the right rule that I rücksichtlos
-	 * imported them all. Alas, the real world was more subtle than that. It
-	 * turns out that it is not a good idea to always import. First, there must
-	 * be a need to import, i.e. there must be a contained package that refers
-	 * to the exported package for it to make use importing that package.
-	 * Second, if an exported package refers to an internal package than it
-	 * should not be imported. Additionally, it is necessary to treat the
-	 * exports in groups. If an exported package refers to another exported
-	 * packages than it must be in the same group. A framework can only
-	 * substitute exports for imports for the whole of such a group. WHY?????
-	 * Not clear anymore ...
-	 */
-	Packages doExportsToImports(Packages exports) {
-
-		// private packages = contained - exported.
-		Set<PackageRef> privatePackages = new HashSet<PackageRef>(contained.keySet());
-		privatePackages.removeAll(exports.keySet());
-
-		// private references = ∀ p : private packages | uses(p)
-		Set<PackageRef> privateReferences = newSet();
-		for (PackageRef p : privatePackages) {
-			Collection<PackageRef> uses = this.uses.get(p);
-			if (uses != null)
-				privateReferences.addAll(uses);
-		}
-
-		// Assume we are going to export all exported packages
-		Set<PackageRef> toBeImported = new HashSet<PackageRef>(exports.keySet());
-
-		// Remove packages that are not referenced privately
-		toBeImported.retainAll(privateReferences);
-
-		// Not necessary to import anything that is already
-		// imported in the Import-Package statement.
-		// TODO toBeImported.removeAll(imports.keySet());
-
-		// Remove exported packages that are referring to
-		// private packages.
-		// Each exported package has a uses clause. We just use
-		// the used packages for each exported package to find out
-		// if it refers to an internal package.
-		//
-
-		for (Iterator<PackageRef> i = toBeImported.iterator(); i.hasNext();) {
-			PackageRef next = i.next();
-			Collection<PackageRef> usedByExportedPackage = this.uses.get(next);
-
-			for (PackageRef privatePackage : privatePackages) {
-				if (usedByExportedPackage.contains(privatePackage)) {
-					i.remove();
-					break;
-				}
-			}
-		}
-
-		// Clean up attributes and generate result map
-		Packages result = new Packages();
-		for (Iterator<PackageRef> i = toBeImported.iterator(); i.hasNext();) {
-			PackageRef ep = i.next();
-			Attrs parameters = exports.get(ep);
-
-			String noimport = parameters == null ? null : parameters.get(NO_IMPORT_DIRECTIVE);
-			if (noimport != null && noimport.equalsIgnoreCase("true"))
-				continue;
-
-			// // we can't substitute when there is no version
-			// String version = parameters.get(VERSION_ATTRIBUTE);
-			// if (version == null) {
-			// if (isPedantic())
-			// warning(
-			// "Cannot automatically import exported package %s because it has no version defined",
-			// ep);
-			// continue;
-			// }
-
-			parameters = new Attrs();
-			parameters.remove(VERSION_ATTRIBUTE);
-			result.put(ep, parameters);
-		}
-		return result;
-	}
-
-	public boolean referred(PackageRef packageName) {
-		// return true;
-		for (Map.Entry<PackageRef,List<PackageRef>> contained : uses.entrySet()) {
-			if (!contained.getKey().equals(packageName)) {
-				if (contained.getValue().contains(packageName))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param jar
-	 */
-	private void getExternalExports(Jar jar, Packages classpathExports) {
-		try {
-			Manifest m = jar.getManifest();
-			if (m != null) {
-				Domain domain = Domain.domain(m);
-				Parameters exported = domain.getExportPackage();
-				for (Entry<String,Attrs> e : exported.entrySet()) {
-					PackageRef ref = getPackageRef(e.getKey());
-					if (!classpathExports.containsKey(ref)) {
-						// TODO e.getValue().put(SOURCE_DIRECTIVE,
-						// jar.getBsn()+"-"+jar.getVersion());
-
-						classpathExports.put(ref, e.getValue());
-					}
-				}
-			}
-		}
-		catch (Exception e) {
-			warning("Erroneous Manifest for " + jar + " " + e);
-		}
-	}
-
-	/**
-	 * Find some more information about imports in manifest and other places. It
-	 * is assumed that the augmentsExports has already copied external attrs
-	 * from the classpathExports.
-	 * 
-	 * @throws Exception
-	 */
-	void augmentImports(Packages imports, Packages exports) throws Exception {
-		List<PackageRef> noimports = Create.list();
-		Set<PackageRef> provided = findProvidedPackages();
-
-		for (PackageRef packageRef : imports.keySet()) {
-			String packageName = packageRef.getFQN();
-
-			setProperty(CURRENT_PACKAGE, packageName);
-			try {
-				Attrs importAttributes = imports.get(packageRef);
-				Attrs exportAttributes = exports.get(packageRef, classpathExports.get(packageRef, new Attrs()));
-
-				String exportVersion = exportAttributes.getVersion();
-				String importRange = importAttributes.getVersion();
-
-				if (exportVersion == null) {
-					// TODO Should check if the source is from a bundle.
-
-				} else {
-
-					//
-					// Version Policy - Import version substitution. We
-					// calculate the export version and then allow the
-					// import version attribute to use it in a substitution
-					// by using a ${@} macro. The export version can
-					// be defined externally or locally
-					//
-
-					boolean provider = isTrue(importAttributes.get(PROVIDE_DIRECTIVE))
-							|| isTrue(exportAttributes.get(PROVIDE_DIRECTIVE)) || provided.contains(packageRef);
-
-					exportVersion = cleanupVersion(exportVersion);
-
-					try {
-						setProperty("@", exportVersion);
-
-						if (importRange != null) {
-							importRange = cleanupVersion(importRange);
-							importRange = getReplacer().process(importRange);
-						} else
-							importRange = getVersionPolicy(provider);
-
-					}
-					finally {
-						unsetProperty("@");
-					}
-					importAttributes.put(VERSION_ATTRIBUTE, importRange);
-				}
-
-				//
-				// Check if exporter has mandatory attributes
-				//
-				String mandatory = exportAttributes.get(MANDATORY_DIRECTIVE);
-				if (mandatory != null) {
-					String[] attrs = mandatory.split("\\s*,\\s*");
-					for (int i = 0; i < attrs.length; i++) {
-						if (!importAttributes.containsKey(attrs[i]))
-							importAttributes.put(attrs[i], exportAttributes.get(attrs[i]));
-					}
-				}
-
-				if (exportAttributes.containsKey(IMPORT_DIRECTIVE))
-					importAttributes.put(IMPORT_DIRECTIVE, exportAttributes.get(IMPORT_DIRECTIVE));
-
-				fixupAttributes(importAttributes);
-				removeAttributes(importAttributes);
-
-				String result = importAttributes.get(Constants.VERSION_ATTRIBUTE);
-				if (result == null)
-					noimports.add(packageRef);
-			}
-			finally {
-				unsetProperty(CURRENT_PACKAGE);
-			}
-		}
-
-		if (isPedantic() && noimports.size() != 0) {
-			warning("Imports that lack version ranges: %s", noimports);
-		}
-	}
-
-	/**
-	 * Find the packages we depend on, where we implement an interface that is a
-	 * Provider Type. These packages, when we import them, must use the provider
-	 * policy.
-	 * 
-	 * @throws Exception
-	 */
-	Set<PackageRef> findProvidedPackages() throws Exception {
-		Set<PackageRef> providers = Create.set();
-		Set<TypeRef> cached = Create.set();
-
-		for (Clazz c : classspace.values()) {
-			TypeRef[] interfaces = c.getInterfaces();
-			if (interfaces != null)
-				for (TypeRef t : interfaces)
-					if (cached.contains(t) || isProvider(t)) {
-						cached.add(t);
-						providers.add(t.getPackageRef());
-					}
-		}
-		return providers;
-	}
-
-	private boolean isProvider(TypeRef t) throws Exception {
-		Clazz c = findClass(t);
-		if (c == null)
-			return false;
-
-		if (c.annotations == null)
-			return false;
-
-		TypeRef pt = getTypeRefFromFQN(ProviderType.class.getName());
-		boolean result = c.annotations.contains(pt);
-		return result;
-	}
-
-	/**
-	 * Provide any macro substitutions and versions for exported packages.
-	 */
-
-	void augmentExports(Packages exports) {
-		for (PackageRef packageRef : exports.keySet()) {
-			String packageName = packageRef.getFQN();
-			setProperty(CURRENT_PACKAGE, packageName);
-			try {
-				Attrs attributes = exports.get(packageRef);
-				Attrs exporterAttributes = classpathExports.get(packageRef);
-				if (exporterAttributes == null)
-					continue;
-
-				for (Map.Entry<String,String> entry : exporterAttributes.entrySet()) {
-					String key = entry.getKey();
-					if (key.equalsIgnoreCase(SPECIFICATION_VERSION))
-						key = VERSION_ATTRIBUTE;
-
-					// dont overwrite and no directives
-					if (!key.endsWith(":") && !attributes.containsKey(key)) {
-						attributes.put(key, entry.getValue());
-					}
-				}
-
-				fixupAttributes(attributes);
-				removeAttributes(attributes);
-
-			}
-			finally {
-				unsetProperty(CURRENT_PACKAGE);
-			}
-		}
-	}
-
-	/**
-	 * Fixup Attributes Execute any macros on an export and
-	 */
-
-	void fixupAttributes(Attrs attributes) {
-		// Convert any attribute values that have macros.
-		for (String key : attributes.keySet()) {
-			String value = attributes.get(key);
-			if (value.indexOf('$') >= 0) {
-				value = getReplacer().process(value);
-				attributes.put(key, value);
-			}
-		}
-
-	}
-
-	/**
-	 * Remove the attributes mentioned in the REMOVE_ATTRIBUTE_DIRECTIVE. You
-	 * can add a remove-attribute: directive with a regular expression for
-	 * attributes that need to be removed. We also remove all attributes that
-	 * have a value of !. This allows you to use macros with ${if} to remove
-	 * values.
-	 */
-
-	void removeAttributes(Attrs attributes) {
-		String remove = attributes.remove(REMOVE_ATTRIBUTE_DIRECTIVE);
-
-		if (remove != null) {
-			Instructions removeInstr = new Instructions(remove);
-			attributes.keySet().removeAll(removeInstr.select(attributes.keySet(), false));
-		}
-
-		// Remove any ! valued attributes
-		for (Iterator<Entry<String,String>> i = attributes.entrySet().iterator(); i.hasNext();) {
-			String v = i.next().getValue();
-			if (v.equals("!"))
-				i.remove();
-		}
-	}
-
-	/**
-	 * Calculate a version from a version policy.
-	 * 
-	 * @param version
-	 *            The actual exported version
-	 * @param impl
-	 *            true for implementations and false for clients
-	 */
-
-	String calculateVersionRange(String version, boolean impl) {
-		setProperty("@", version);
-		try {
-			return getVersionPolicy(impl);
-		}
-		finally {
-			unsetProperty("@");
-		}
-	}
-
-	/**
-	 * Add the uses clauses. This method iterates over the exports and cal
-	 * 
-	 * @param exports
-	 * @param uses
-	 * @throws MojoExecutionException
-	 */
-	void doUses(Packages exports, MultiMap<PackageRef,PackageRef> uses, Packages imports) {
-		if ("true".equalsIgnoreCase(getProperty(NOUSES)))
-			return;
-
-		for (Iterator<PackageRef> i = exports.keySet().iterator(); i.hasNext();) {
-			PackageRef packageRef = i.next();
-			String packageName = packageRef.getFQN();
-			setProperty(CURRENT_PACKAGE, packageName);
-			try {
-				doUses(packageRef, exports, uses, imports);
-			}
-			finally {
-				unsetProperty(CURRENT_PACKAGE);
-			}
-
-		}
-	}
-
-	/**
-	 * @param packageName
-	 * @param exports
-	 * @param uses
-	 * @param imports
-	 */
-	protected void doUses(PackageRef packageRef, Packages exports, MultiMap<PackageRef,PackageRef> uses,
-			Packages imports) {
-		Attrs clause = exports.get(packageRef);
-
-		// Check if someone already set the uses: directive
-		String override = clause.get(USES_DIRECTIVE);
-		if (override == null)
-			override = USES_USES;
-
-		// Get the used packages
-		Collection<PackageRef> usedPackages = uses.get(packageRef);
-
-		if (usedPackages != null) {
-
-			// Only do a uses on exported or imported packages
-			// and uses should also not contain our own package
-			// name
-			Set<PackageRef> sharedPackages = new HashSet<PackageRef>();
-			sharedPackages.addAll(imports.keySet());
-			sharedPackages.addAll(exports.keySet());
-			sharedPackages.retainAll(usedPackages);
-			sharedPackages.remove(packageRef);
-
-			StringBuilder sb = new StringBuilder();
-			String del = "";
-			for (Iterator<PackageRef> u = sharedPackages.iterator(); u.hasNext();) {
-				PackageRef usedPackage = u.next();
-				if (!usedPackage.isJava()) {
-					sb.append(del);
-					sb.append(usedPackage.getFQN());
-					del = ",";
-				}
-			}
-			if (override.indexOf('$') >= 0) {
-				setProperty(CURRENT_USES, sb.toString());
-				override = getReplacer().process(override);
-				unsetProperty(CURRENT_USES);
-			} else
-				// This is for backward compatibility 0.0.287
-				// can be deprecated over time
-				override = override.replaceAll(USES_USES, Matcher.quoteReplacement(sb.toString())).trim();
-
-			if (override.endsWith(","))
-				override = override.substring(0, override.length() - 1);
-			if (override.startsWith(","))
-				override = override.substring(1);
-			if (override.length() > 0) {
-				clause.put(USES_DIRECTIVE, override);
-			}
-		}
-	}
-
-	/**
-	 * Transitively remove all elemens from unreachable through the uses link.
-	 * 
-	 * @param name
-	 * @param unreachable
-	 */
-	void removeTransitive(PackageRef name, Set<PackageRef> unreachable) {
-		if (!unreachable.contains(name))
-			return;
-
-		unreachable.remove(name);
-
-		List<PackageRef> ref = uses.get(name);
-		if (ref != null) {
-			for (Iterator<PackageRef> r = ref.iterator(); r.hasNext();) {
-				PackageRef element = r.next();
-				removeTransitive(element, unreachable);
-			}
-		}
-	}
-
-	/**
-	 * Helper method to set the package info resource
-	 * 
-	 * @param dir
-	 * @param key
-	 * @param value
-	 * @throws Exception
-	 */
-	void getExportVersionsFromPackageInfo(PackageRef packageRef, Resource r, Packages classpathExports) throws Exception {
-		if (r == null)
-			return;
-
-		Properties p = new Properties();
-		try {
-			InputStream in = r.openInputStream();
-			try {
-				p.load(in);
-			}
-			finally {
-				in.close();
-			}
-			Attrs map = classpathExports.get(packageRef);
-			if (map == null) {
-				classpathExports.put(packageRef, map = new Attrs());
-			}
-			for (Enumeration<String> t = (Enumeration<String>) p.propertyNames(); t.hasMoreElements();) {
-				String key = t.nextElement();
-				String value = map.get(key);
-				if (value == null) {
-					value = p.getProperty(key);
-
-					// Messy, to allow directives we need to
-					// allow the value to start with a ':' since we cannot
-					// encode this in a property name
-
-					if (value.startsWith(":")) {
-						key = key + ":";
-						value = value.substring(1);
-					}
-					map.put(key, value);
-				}
-			}
-		}
-		catch (Exception e) {
-			msgs.NoSuchFile_(r);
-		}
-	}
-
-	public void close() {
-		if (diagnostics) {
-			PrintStream out = System.err;
-			out.printf("Current directory            : %s%n", new File("").getAbsolutePath());
-			out.println("Classpath used");
-			for (Jar jar : getClasspath()) {
-				out.printf("File                                : %s%n", jar.getSource());
-				out.printf("File abs path                       : %s%n", jar.getSource().getAbsolutePath());
-				out.printf("Name                                : %s%n", jar.getName());
-				Map<String,Map<String,Resource>> dirs = jar.getDirectories();
-				for (Map.Entry<String,Map<String,Resource>> entry : dirs.entrySet()) {
-					Map<String,Resource> dir = entry.getValue();
-					String name = entry.getKey().replace('/', '.');
-					if (dir != null) {
-						out.printf("                                      %-30s %d%n", name, dir.size());
-					} else {
-						out.printf("                                      %-30s <<empty>>%n", name);
-					}
-				}
-			}
-		}
-
-		super.close();
-		if (dot != null)
-			dot.close();
-
-		if (classpath != null)
-			for (Iterator<Jar> j = classpath.iterator(); j.hasNext();) {
-				Jar jar = j.next();
-				jar.close();
-			}
-	}
-
-	/**
-	 * Findpath looks through the contents of the JAR and finds paths that end
-	 * with the given regular expression ${findpath (; reg-expr (; replacement)?
-	 * )? }
-	 * 
-	 * @param args
-	 * @return
-	 */
-	public String _findpath(String args[]) {
-		return findPath("findpath", args, true);
-	}
-
-	public String _findname(String args[]) {
-		return findPath("findname", args, false);
-	}
-
-	String findPath(String name, String[] args, boolean fullPathName) {
-		if (args.length > 3) {
-			warning("Invalid nr of arguments to " + name + " " + Arrays.asList(args) + ", syntax: ${" + name
-					+ " (; reg-expr (; replacement)? )? }");
-			return null;
-		}
-
-		String regexp = ".*";
-		String replace = null;
-
-		switch (args.length) {
-			case 3 :
-				replace = args[2];
-				//$FALL-THROUGH$
-			case 2 :
-				regexp = args[1];
-		}
-		StringBuilder sb = new StringBuilder();
-		String del = "";
-
-		Pattern expr = Pattern.compile(regexp);
-		for (Iterator<String> e = dot.getResources().keySet().iterator(); e.hasNext();) {
-			String path = e.next();
-			if (!fullPathName) {
-				int n = path.lastIndexOf('/');
-				if (n >= 0) {
-					path = path.substring(n + 1);
-				}
-			}
-
-			Matcher m = expr.matcher(path);
-			if (m.matches()) {
-				if (replace != null)
-					path = m.replaceAll(replace);
-
-				sb.append(del);
-				sb.append(path);
-				del = ", ";
-			}
-		}
-		return sb.toString();
-	}
-
-	public void putAll(Map<String,String> additional, boolean force) {
-		for (Iterator<Map.Entry<String,String>> i = additional.entrySet().iterator(); i.hasNext();) {
-			Map.Entry<String,String> entry = i.next();
-			if (force || getProperties().get(entry.getKey()) == null)
-				setProperty(entry.getKey(), entry.getValue());
-		}
-	}
-
-	boolean	firstUse	= true;
-
-	public List<Jar> getClasspath() {
-		if (firstUse) {
-			firstUse = false;
-			String cp = getProperty(CLASSPATH);
-			if (cp != null)
-				for (String s : split(cp)) {
-					Jar jar = getJarFromName(s, "getting classpath");
-					if (jar != null)
-						addClasspath(jar);
-					else
-						warning("Cannot find entry on -classpath: %s", s);
-				}
-		}
-		return classpath;
-	}
-
-	public void addClasspath(Jar jar) {
-		if (isPedantic() && jar.getResources().isEmpty())
-			warning("There is an empty jar or directory on the classpath: " + jar.getName());
-
-		classpath.add(jar);
-	}
-
-	public void addClasspath(Collection< ? > jars) throws IOException {
-		for (Object jar : jars) {
-			if (jar instanceof Jar)
-				addClasspath((Jar) jar);
-			else if (jar instanceof File)
-				addClasspath((File) jar);
-			else if (jar instanceof String)
-				addClasspath(getFile((String) jar));
-			else
-				error("Cannot convert to JAR to add to classpath %s. Not a File, Jar, or String", jar);
-		}
-	}
-
-	public void addClasspath(File cp) throws IOException {
-		if (!cp.exists())
-			warning("File on classpath that does not exist: " + cp);
-		Jar jar = new Jar(cp);
-		addClose(jar);
-		classpath.add(jar);
-	}
-
-	public void clear() {
-		classpath.clear();
-	}
-
-	public Jar getTarget() {
-		return dot;
-	}
-
-	private void analyzeBundleClasspath() throws Exception {
-		Parameters bcp = getBundleClasspath();
-
-		if (bcp.isEmpty()) {
-			analyzeJar(dot, "", true);
-		} else {
-			boolean okToIncludeDirs = true;
-
-			for (String path : bcp.keySet()) {
-				if (dot.getDirectories().containsKey(path)) {
-					okToIncludeDirs = false;
-					break;
-				}
-			}
-
-			for (String path : bcp.keySet()) {
-				Attrs info = bcp.get(path);
-
-				if (path.equals(".")) {
-					analyzeJar(dot, "", okToIncludeDirs);
-					continue;
-				}
-				//
-				// There are 3 cases:
-				// - embedded JAR file
-				// - directory
-				// - error
-				//
-
-				Resource resource = dot.getResource(path);
-				if (resource != null) {
-					try {
-						Jar jar = new Jar(path);
-						addClose(jar);
-						EmbeddedResource.build(jar, resource);
-						analyzeJar(jar, "", true);
-					}
-					catch (Exception e) {
-						warning("Invalid bundle classpath entry: " + path + " " + e);
-					}
-				} else {
-					if (dot.getDirectories().containsKey(path)) {
-						// if directories are used, we should not have dot as we
-						// would have the classes in these directories on the
-						// class path twice.
-						if (bcp.containsKey("."))
-							warning("Bundle-ClassPath uses a directory '%s' as well as '.'. This means bnd does not know if a directory is a package.",
-									path, path);
-						analyzeJar(dot, Processor.appendPath(path) + "/", true);
-					} else {
-						if (!"optional".equals(info.get(RESOLUTION_DIRECTIVE)))
-							warning("No sub JAR or directory " + path);
-					}
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * We traverse through all the classes that we can find and calculate the
-	 * contained and referred set and uses. This method ignores the Bundle
-	 * classpath.
-	 * 
-	 * @param jar
-	 * @param contained
-	 * @param referred
-	 * @param uses
-	 * @throws IOException
-	 */
-	private boolean analyzeJar(Jar jar, String prefix, boolean okToIncludeDirs) throws Exception {
-		Map<String,Clazz> mismatched = new HashMap<String,Clazz>();
-
-		next: for (String path : jar.getResources().keySet()) {
-			if (path.startsWith(prefix)) {
-
-				String relativePath = path.substring(prefix.length());
-
-				if (okToIncludeDirs) {
-					int n = relativePath.lastIndexOf('/');
-					if (n < 0)
-						n = relativePath.length();
-					String relativeDir = relativePath.substring(0, n);
-
-					PackageRef packageRef = getPackageRef(relativeDir);
-					if (!packageRef.isMetaData() && !contained.containsKey(packageRef)) {
-						contained.put(packageRef);
-
-						// For each package we encounter for the first
-						// time. Unfortunately we can only do this once
-						// we found a class since the bcp has a tendency
-						// to overlap
-						if (!packageRef.isMetaData()) {
-							Resource pinfo = jar.getResource(prefix + packageRef.getPath() + "/packageinfo");
-							getExportVersionsFromPackageInfo(packageRef, pinfo, classpathExports);
-						}
-					}
-				}
-
-				// Check class resources, we need to analyze them
-				if (path.endsWith(".class")) {
-					Resource resource = jar.getResource(path);
-					Clazz clazz;
-					Attrs info = null;
-
-					try {
-						InputStream in = resource.openInputStream();
-						clazz = new Clazz(this, path, resource);
-						try {
-							// Check if we have a package-info
-							if (relativePath.endsWith("/package-info.class")) {
-								// package-info can contain an Export annotation
-								info = new Attrs();
-								parsePackageInfoClass(clazz, info);
-							} else {
-								// Otherwise we just parse it simply
-								clazz.parseClassFile();
-							}
-						}
-						finally {
-							in.close();
-						}
-					}
-					catch (Throwable e) {
-						error("Invalid class file %s (%s)", e, relativePath, e);
-						e.printStackTrace();
-						continue next;
-					}
-
-					String calculatedPath = clazz.getClassName().getPath();
-					if (!calculatedPath.equals(relativePath)) {
-						// If there is a mismatch we
-						// warning
-						if (okToIncludeDirs) // assume already reported
-							mismatched.put(clazz.getAbsolutePath(), clazz);
-					} else {
-						classspace.put(clazz.getClassName(), clazz);
-						PackageRef packageRef = clazz.getClassName().getPackageRef();
-
-						if (!contained.containsKey(packageRef)) {
-							contained.put(packageRef);
-							if (!packageRef.isMetaData()) {
-								Resource pinfo = jar.getResource(prefix + packageRef.getPath() + "/packageinfo");
-								getExportVersionsFromPackageInfo(packageRef, pinfo, classpathExports);
-							}
-						}
-						if (info != null)
-							contained.merge(packageRef, false, info);
-
-						Set<PackageRef> set = Create.set();
-
-						// Look at the referred packages
-						// and copy them to our baseline
-						for (PackageRef p : clazz.getReferred()) {
-							referred.put(p);
-							set.add(p);
-						}
-						set.remove(packageRef);
-						uses.addAll(packageRef, set);
-					}
-				}
-			}
-		}
-
-		if (mismatched.size() > 0) {
-			error("Classes found in the wrong directory: %s", mismatched);
-			return false;
-		}
-		return true;
-	}
-
-	static Pattern	OBJECT_REFERENCE	= Pattern.compile("L([^/]+/)*([^;]+);");
-
-	private void parsePackageInfoClass(final Clazz clazz, final Attrs info) throws Exception {
-		clazz.parseClassFileWithCollector(new ClassDataCollector() {
-			@Override
-			public void annotation(Annotation a) {
-				String name = a.name.getFQN();
-				if (aQute.bnd.annotation.Version.class.getName().equals(name)) {
-
-					// Check version
-					String version = a.get("value");
-					if (!info.containsKey(Constants.VERSION_ATTRIBUTE)) {
-						if (version != null) {
-							version = getReplacer().process(version);
-							if (Verifier.VERSION.matcher(version).matches())
-								info.put(VERSION_ATTRIBUTE, version);
-							else
-								error("Export annotation in %s has invalid version info: %s", clazz, version);
-						}
-					} else {
-						// Verify this matches with packageinfo
-						String presentVersion = info.get(VERSION_ATTRIBUTE);
-						try {
-							Version av = new Version(presentVersion);
-							Version bv = new Version(version);
-							if (!av.equals(bv)) {
-								error("Version from annotation for %s differs with packageinfo or Manifest", clazz
-										.getClassName().getFQN());
-							}
-						}
-						catch (Exception e) {
-							// Ignore
-						}
-					}
-				} else if (name.equals(Export.class.getName())) {
-
-					// Check mandatory attributes
-					Attrs attrs = doAttrbutes((Object[]) a.get(Export.MANDATORY), clazz, getReplacer());
-					if (!attrs.isEmpty()) {
-						info.putAll(attrs);
-						info.put(MANDATORY_DIRECTIVE, Processor.join(attrs.keySet()));
-					}
-
-					// Check optional attributes
-					attrs = doAttrbutes((Object[]) a.get(Export.OPTIONAL), clazz, getReplacer());
-					if (!attrs.isEmpty()) {
-						info.putAll(attrs);
-					}
-
-					// Check Included classes
-					Object[] included = a.get(Export.INCLUDE);
-					if (included != null && included.length > 0) {
-						StringBuilder sb = new StringBuilder();
-						String del = "";
-						for (Object i : included) {
-							Matcher m = OBJECT_REFERENCE.matcher((String) i);
-							if (m.matches()) {
-								sb.append(del);
-								sb.append(m.group(2));
-								del = ",";
-							}
-						}
-						info.put(INCLUDE_DIRECTIVE, sb.toString());
-					}
-
-					// Check Excluded classes
-					Object[] excluded = a.get(Export.EXCLUDE);
-					if (excluded != null && excluded.length > 0) {
-						StringBuilder sb = new StringBuilder();
-						String del = "";
-						for (Object i : excluded) {
-							Matcher m = OBJECT_REFERENCE.matcher((String) i);
-							if (m.matches()) {
-								sb.append(del);
-								sb.append(m.group(2));
-								del = ",";
-							}
-						}
-						info.put(EXCLUDE_DIRECTIVE, sb.toString());
-					}
-
-					// Check Uses
-					Object[] uses = a.get(Export.USES);
-					if (uses != null && uses.length > 0) {
-						String old = info.get(USES_DIRECTIVE);
-						if (old == null)
-							old = "";
-						StringBuilder sb = new StringBuilder(old);
-						String del = sb.length() == 0 ? "" : ",";
-
-						for (Object use : uses) {
-							sb.append(del);
-							sb.append(use);
-							del = ",";
-						}
-						info.put(USES_DIRECTIVE, sb.toString());
-					}
-				}
-			}
-
-		});
-	}
-
-	/**
-	 * Clean up version parameters. Other builders use more fuzzy definitions of
-	 * the version syntax. This method cleans up such a version to match an OSGi
-	 * version.
-	 * 
-	 * @param VERSION_STRING
-	 * @return
-	 */
-	static Pattern	fuzzyVersion		= Pattern.compile("(\\d+)(\\.(\\d+)(\\.(\\d+))?)?([^a-zA-Z0-9](.*))?",
-												Pattern.DOTALL);
-	static Pattern	fuzzyVersionRange	= Pattern.compile(
-												"(\\(|\\[)\\s*([-\\da-zA-Z.]+)\\s*,\\s*([-\\da-zA-Z.]+)\\s*(\\]|\\))",
-												Pattern.DOTALL);
-	static Pattern	fuzzyModifier		= Pattern.compile("(\\d+[.-])*(.*)", Pattern.DOTALL);
-
-	static Pattern	nummeric			= Pattern.compile("\\d*");
-
-	static public String cleanupVersion(String version) {
-		Matcher m = Verifier.VERSIONRANGE.matcher(version);
-
-		if (m.matches()) {
-			return version;
-		}
-
-		m = fuzzyVersionRange.matcher(version);
-		if (m.matches()) {
-			String prefix = m.group(1);
-			String first = m.group(2);
-			String last = m.group(3);
-			String suffix = m.group(4);
-			return prefix + cleanupVersion(first) + "," + cleanupVersion(last) + suffix;
-		}
-
-		m = fuzzyVersion.matcher(version);
-		if (m.matches()) {
-			StringBuilder result = new StringBuilder();
-			String major = removeLeadingZeroes(m.group(1));
-			String minor = removeLeadingZeroes(m.group(3));
-			String micro = removeLeadingZeroes(m.group(5));
-			String qualifier = m.group(7);
-
-			if (major != null) {
-				result.append(major);
-				if (minor != null) {
-					result.append(".");
-					result.append(minor);
-					if (micro != null) {
-						result.append(".");
-						result.append(micro);
-						if (qualifier != null) {
-							result.append(".");
-							cleanupModifier(result, qualifier);
-						}
-					} else if (qualifier != null) {
-						result.append(".0.");
-						cleanupModifier(result, qualifier);
-					}
-				} else if (qualifier != null) {
-					result.append(".0.0.");
-					cleanupModifier(result, qualifier);
-				}
-				return result.toString();
-			}
-		}
-		return version;
-	}
-
-	private static String removeLeadingZeroes(String group) {
-		if (group == null)
-			return null;
-
-		int n = 0;
-		while (n < group.length() - 1 && group.charAt(n) == '0')
-			n++;
-		if (n == 0)
-			return group;
-
-		return group.substring(n);
-	}
-
-	static void cleanupModifier(StringBuilder result, String modifier) {
-		Matcher m = fuzzyModifier.matcher(modifier);
-		if (m.matches())
-			modifier = m.group(2);
-
-		for (int i = 0; i < modifier.length(); i++) {
-			char c = modifier.charAt(i);
-			if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')
-				result.append(c);
-		}
-	}
-
-	final static String	DEFAULT_PROVIDER_POLICY	= "${range;[==,=+)}";
-	final static String	DEFAULT_CONSUMER_POLICY	= "${range;[==,+)}";
-
-	public String getVersionPolicy(boolean implemented) {
-		if (implemented) {
-			return getProperty(PROVIDER_POLICY, DEFAULT_PROVIDER_POLICY);
-		}
-
-		return getProperty(CONSUMER_POLICY, DEFAULT_CONSUMER_POLICY);
-	}
-
-	/**
-	 * The extends macro traverses all classes and returns a list of class names
-	 * that extend a base class.
-	 */
-
-	static String	_classesHelp	= "${classes;'implementing'|'extending'|'importing'|'named'|'version'|'any';<pattern>}, Return a list of class fully qualified class names that extend/implement/import any of the contained classes matching the pattern\n";
-
-	public String _classes(String... args) throws Exception {
-		// Macro.verifyCommand(args, _classesHelp, new
-		// Pattern[]{null,Pattern.compile("(implementing|implements|extending|extends|importing|imports|any)"),
-		// null}, 3,3);
-
-		Collection<Clazz> matched = getClasses(args);
-		if (matched.isEmpty())
-			return "";
-
-		return join(matched);
-	}
-
-	public Collection<Clazz> getClasses(String... args) throws Exception {
-
-		Set<Clazz> matched = new HashSet<Clazz>(classspace.values());
-		for (int i = 1; i < args.length; i++) {
-			if (args.length < i + 1)
-				throw new IllegalArgumentException("${classes} macro must have odd number of arguments. "
-						+ _classesHelp);
-
-			String typeName = args[i];
-			if (typeName.equalsIgnoreCase("extending"))
-				typeName = "extends";
-			else if (typeName.equalsIgnoreCase("importing"))
-				typeName = "imports";
-			else if (typeName.equalsIgnoreCase("implementing"))
-				typeName = "implements";
-
-			Clazz.QUERY type = Clazz.QUERY.valueOf(typeName.toUpperCase());
-
-			if (type == null)
-				throw new IllegalArgumentException("${classes} has invalid type: " + typeName + ". " + _classesHelp);
-
-			Instruction instr = null;
-			if (Clazz.HAS_ARGUMENT.contains(type)) {
-				String s = args[++i];
-				instr = new Instruction(s);
-			}
-			for (Iterator<Clazz> c = matched.iterator(); c.hasNext();) {
-				Clazz clazz = c.next();
-				if (!clazz.is(type, instr, this)) {
-					c.remove();
-				}
-			}
-		}
-		return matched;
-	}
-
-	/**
-	 * Get the exporter of a package ...
-	 */
-
-	public String _exporters(String args[]) throws Exception {
-		Macro.verifyCommand(args, "${exporters;<packagename>}, returns the list of jars that export the given package",
-				null, 2, 2);
-		StringBuilder sb = new StringBuilder();
-		String del = "";
-		String pack = args[1].replace('.', '/');
-		for (Jar jar : classpath) {
-			if (jar.getDirectories().containsKey(pack)) {
-				sb.append(del);
-				sb.append(jar.getName());
-			}
-		}
-		return sb.toString();
-	}
-
-	public Map<TypeRef,Clazz> getClassspace() {
-		return classspace;
-	}
-
-	/**
-	 * Locate a resource on the class path.
-	 * 
-	 * @param path
-	 *            Path of the reosurce
-	 * @return A resource or <code>null</code>
-	 */
-	public Resource findResource(String path) {
-		for (Jar entry : getClasspath()) {
-			Resource r = entry.getResource(path);
-			if (r != null)
-				return r;
-		}
-		return null;
-	}
-
-	/**
-	 * Find a clazz on the class path. This class has been parsed.
-	 * 
-	 * @param path
-	 * @return
-	 */
-	public Clazz findClass(TypeRef typeRef) throws Exception {
-		Clazz c = classspace.get(typeRef);
-		if (c != null)
-			return c;
-
-		c = importedClassesCache.get(typeRef);
-		if (c != null)
-			return c;
-
-		Resource r = findResource(typeRef.getPath());
-		if (r == null) {
-			getClass().getClassLoader();
-			URL url = ClassLoader.getSystemResource(typeRef.getPath());
-			if (url != null)
-				r = new URLResource(url);
-		}
-		if (r != null) {
-			c = new Clazz(this, typeRef.getPath(), r);
-			c.parseClassFile();
-			importedClassesCache.put(typeRef, c);
-		}
-		return c;
-	}
-
-	/**
-	 * Answer the bundle version.
-	 * 
-	 * @return
-	 */
-	public String getVersion() {
-		String version = getProperty(BUNDLE_VERSION);
-		if (version == null)
-			version = "0.0.0";
-		return version;
-	}
-
-	public boolean isNoBundle() {
-		return isTrue(getProperty(RESOURCEONLY)) || isTrue(getProperty(NOMANIFEST));
-	}
-
-	public void referTo(TypeRef ref) {
-		PackageRef pack = ref.getPackageRef();
-		if (!referred.containsKey(pack))
-			referred.put(pack, new Attrs());
-	}
-
-	public void referToByBinaryName(String binaryClassName) {
-		TypeRef ref = descriptors.getTypeRef(binaryClassName);
-		referTo(ref);
-	}
-
-	/**
-	 * Ensure that we are running on the correct bnd.
-	 */
-	void doRequireBnd() {
-		Attrs require = OSGiHeader.parseProperties(getProperty(REQUIRE_BND));
-		if (require == null || require.isEmpty())
-			return;
-
-		Hashtable<String,String> map = new Hashtable<String,String>();
-		map.put(Constants.VERSION_FILTER, getBndVersion());
-
-		for (String filter : require.keySet()) {
-			try {
-				Filter f = new Filter(filter);
-				if (f.match(map))
-					continue;
-				error("%s fails %s", REQUIRE_BND, require.get(filter));
-			}
-			catch (Exception t) {
-				error("%s with value %s throws exception", t, REQUIRE_BND, require);
-			}
-		}
-	}
-
-	/**
-	 * md5 macro
-	 */
-
-	static String	_md5Help	= "${md5;path}";
-
-	public String _md5(String args[]) throws Exception {
-		Macro.verifyCommand(args, _md5Help, new Pattern[] {
-				null, null, Pattern.compile("base64|hex")
-		}, 2, 3);
-
-		Digester<MD5> digester = MD5.getDigester();
-		Resource r = dot.getResource(args[1]);
-		if (r == null)
-			throw new FileNotFoundException("From " + digester + ", not found " + args[1]);
-
-		IO.copy(r.openInputStream(), digester);
-		boolean hex = args.length > 2 && args[2].equals("hex");
-		if (hex)
-			return Hex.toHexString(digester.digest().digest());
-
-		return Base64.encodeBase64(digester.digest().digest());
-	}
-
-	/**
-	 * SHA1 macro
-	 */
-
-	static String	_sha1Help	= "${sha1;path}";
-
-	public String _sha1(String args[]) throws Exception {
-		Macro.verifyCommand(args, _sha1Help, new Pattern[] {
-				null, null, Pattern.compile("base64|hex")
-		}, 2, 3);
-		Digester<SHA1> digester = SHA1.getDigester();
-		Resource r = dot.getResource(args[1]);
-		if (r == null)
-			throw new FileNotFoundException("From sha1, not found " + args[1]);
-
-		IO.copy(r.openInputStream(), digester);
-		return Base64.encodeBase64(digester.digest().digest());
-	}
-
-	public Descriptor getDescriptor(String descriptor) {
-		return descriptors.getDescriptor(descriptor);
-	}
-
-	public TypeRef getTypeRef(String binaryClassName) {
-		return descriptors.getTypeRef(binaryClassName);
-	}
-
-	public PackageRef getPackageRef(String binaryName) {
-		return descriptors.getPackageRef(binaryName);
-	}
-
-	public TypeRef getTypeRefFromFQN(String fqn) {
-		return descriptors.getTypeRefFromFQN(fqn);
-	}
-
-	public TypeRef getTypeRefFromPath(String path) {
-		return descriptors.getTypeRefFromPath(path);
-	}
-
-	public boolean isImported(PackageRef packageRef) {
-		return imports.containsKey(packageRef);
-	}
-
-	/**
-	 * Merge the attributes of two maps, where the first map can contain
-	 * wildcarded names. The idea is that the first map contains instructions
-	 * (for example *) with a set of attributes. These patterns are matched
-	 * against the found packages in actual. If they match, the result is set
-	 * with the merged set of attributes. It is expected that the instructions
-	 * are ordered so that the instructor can define which pattern matches
-	 * first. Attributes in the instructions override any attributes from the
-	 * actual.<br/>
-	 * A pattern is a modified regexp so it looks like globbing. The * becomes a
-	 * .* just like the ? becomes a .?. '.' are replaced with \\. Additionally,
-	 * if the pattern starts with an exclamation mark, it will remove that
-	 * matches for that pattern (- the !) from the working set. So the following
-	 * patterns should work:
-	 * <ul>
-	 * <li>com.foo.bar</li>
-	 * <li>com.foo.*</li>
-	 * <li>com.foo.???</li>
-	 * <li>com.*.[^b][^a][^r]</li>
-	 * <li>!com.foo.* (throws away any match for com.foo.*)</li>
-	 * </ul>
-	 * Enough rope to hang the average developer I would say.
-	 * 
-	 * @param instructions
-	 *            the instructions with patterns.
-	 * @param source
-	 *            the actual found packages, contains no duplicates
-	 * @return Only the packages that were filtered by the given instructions
-	 */
-
-	Packages filter(Instructions instructions, Packages source, Set<Instruction> nomatch) {
-		Packages result = new Packages();
-		List<PackageRef> refs = new ArrayList<PackageRef>(source.keySet());
-		Collections.sort(refs);
-
-		List<Instruction> filters = new ArrayList<Instruction>(instructions.keySet());
-		if (nomatch == null)
-			nomatch = Create.set();
-
-		for (Instruction instruction : filters) {
-			boolean match = false;
-
-			for (Iterator<PackageRef> i = refs.iterator(); i.hasNext();) {
-				PackageRef packageRef = i.next();
-
-				if (packageRef.isMetaData()) {
-					i.remove(); // no use checking it again
-					continue;
-				}
-
-				String packageName = packageRef.getFQN();
-
-				if (instruction.matches(packageName)) {
-					match = true;
-					if (!instruction.isNegated()) {
-						result.merge(packageRef, instruction.isDuplicate(), source.get(packageRef),
-								instructions.get(instruction));
-					}
-					i.remove(); // Can never match again for another pattern
-				}
-			}
-			if (!match && !instruction.isAny())
-				nomatch.add(instruction);
-		}
-
-		/*
-		 * Tricky. If we have umatched instructions they might indicate that we
-		 * want to have multiple decorators for the same package. So we check
-		 * the unmatched against the result list. If then then match and have
-		 * actually interesting properties then we merge them
-		 */
-
-		for (Iterator<Instruction> i = nomatch.iterator(); i.hasNext();) {
-			Instruction instruction = i.next();
-
-			// We assume the user knows what he is
-			// doing and inserted a literal. So
-			// we ignore any not matched literals
-			if (instruction.isLiteral()) {
-				result.merge(getPackageRef(instruction.getLiteral()), true, instructions.get(instruction));
-				i.remove();
-				continue;
-			}
-
-			// Not matching a negated instruction looks
-			// like an error ...
-			if (instruction.isNegated()) {
-				continue;
-			}
-
-			// An optional instruction should not generate
-			// an error
-			if (instruction.isOptional()) {
-				i.remove();
-				continue;
-			}
-
-			// boolean matched = false;
-			// Set<PackageRef> prefs = new HashSet<PackageRef>(result.keySet());
-			// for (PackageRef ref : prefs) {
-			// if (instruction.matches(ref.getFQN())) {
-			// result.merge(ref, true, source.get(ref),
-			// instructions.get(instruction));
-			// matched = true;
-			// }
-			// }
-			// if (matched)
-			// i.remove();
-		}
-		return result;
-	}
-
-	public void setDiagnostics(boolean b) {
-		diagnostics = b;
-	}
-
-	public Clazz.JAVA getLowestEE() {
-		if (ees.isEmpty())
-			return Clazz.JAVA.JDK1_4;
-
-		return ees.first();
-	}
-
-	public String _ee(@SuppressWarnings("unused") String args[]) {
-		return getLowestEE().getEE();
-	}
-
-	/**
-	 * Calculate the output file for the given target. The strategy is:
-	 * 
-	 * <pre>
-	 * parameter given if not null and not directory
-	 * if directory, this will be the output directory
-	 * based on bsn-version.jar
-	 * name of the source file if exists
-	 * Untitled-[n]
-	 * </pre>
-	 * 
-	 * @param output
-	 *            may be null, otherwise a file path relative to base
-	 */
-	public File getOutputFile(String output) {
-
-		if (output == null)
-			output = get(Constants.OUTPUT);
-
-		File outputDir;
-
-		if (output != null) {
-			File outputFile = getFile(output);
-			if (outputFile.isDirectory())
-				outputDir = outputFile;
-			else
-				return outputFile;
-		} else
-			outputDir = getBase();
-
-		if (getBundleSymbolicName() != null) {
-			String bsn = getBundleSymbolicName();
-			String version = getBundleVersion();
-			Version v = Version.parseVersion(version);
-			String outputName = bsn + "-" + v.getWithoutQualifier() + Constants.DEFAULT_JAR_EXTENSION;
-			return new File(outputDir, outputName);
-		}
-
-		File source = getJar().getSource();
-		if (source != null) {
-			String outputName = source.getName();
-			return new File(outputDir, outputName);
-		}
-
-		error("Cannot establish an output name from %s, nor bsn, nor source file name, using Untitled", output);
-		int n = 0;
-		File f = getFile(outputDir, "Untitled");
-		while (f.isFile()) {
-			f = getFile(outputDir, "Untitled-" + n++);
-		}
-		return f;
-	}
-
-	/**
-	 * Utility function to carefully save the file. Will create a backup if the
-	 * source file has the same path as the output. It will also only save if
-	 * the file was modified or the force flag is true
-	 * 
-	 * @param output
-	 *            the output file, if null {@link #getOutputFile(String)} is
-	 *            used.
-	 * @param force
-	 *            if it needs to be overwritten
-	 * @throws Exception
-	 */
-
-	public boolean save(File output, boolean force) throws Exception {
-		if (output == null)
-			output = getOutputFile(null);
-
-		Jar jar = getJar();
-		File source = jar.getSource();
-
-		trace("check for modified build=%s file=%s, diff=%s", jar.lastModified(), output.lastModified(),
-				jar.lastModified() - output.lastModified());
-
-		if (!output.exists() || output.lastModified() <= jar.lastModified() || force) {
-			output.getParentFile().mkdirs();
-			if (source != null && output.getCanonicalPath().equals(source.getCanonicalPath())) {
-				File bak = new File(source.getParentFile(), source.getName() + ".bak");
-				if (!source.renameTo(bak)) {
-					error("Could not create backup file %s", bak);
-				} else
-					source.delete();
-			}
-			try {
-				trace("Saving jar to %s", output);
-				getJar().write(output);
-			}
-			catch (Exception e) {
-				output.delete();
-				error("Cannot write JAR file to %s due to %s", e, output, e.getMessage());
-			}
-			return true;
-		}
-		trace("Not modified %s", output);
-		return false;
-
-	}
-
-	/**
-	 * Set default import and export instructions if none are set
-	 */
-	public void setDefaults(String bsn, Version version) {
-		if (getExportPackage() == null)
-			setExportPackage("*");
-		if (getImportPackage() == null)
-			setExportPackage("*");
-		if (bsn != null && getBundleSymbolicName() == null)
-			setBundleSymbolicName(bsn);
-		if (version != null && getBundleVersion() == null)
-			setBundleVersion(version);
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/AnalyzerMessages.java b/bundleplugin/src/main/java/aQute/lib/osgi/AnalyzerMessages.java
deleted file mode 100644
index a91a0f0..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/AnalyzerMessages.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package aQute.lib.osgi;
-
-import aQute.libg.reporter.*;
-
-public interface AnalyzerMessages extends Messages {
-/**/
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Annotation.java b/bundleplugin/src/main/java/aQute/lib/osgi/Annotation.java
deleted file mode 100644
index e364949..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Annotation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package aQute.lib.osgi;
-
-import java.lang.annotation.*;
-import java.util.*;
-
-import aQute.bnd.annotation.metatype.*;
-import aQute.lib.osgi.Descriptors.TypeRef;
-
-public class Annotation {
-	TypeRef				name;
-	Map<String,Object>	elements;
-	ElementType			member;
-	RetentionPolicy		policy;
-
-	public Annotation(TypeRef name, Map<String,Object> elements, ElementType member, RetentionPolicy policy) {
-		this.name = name;
-		if (elements == null)
-			this.elements = Collections.emptyMap();
-		else
-			this.elements = elements;
-		this.member = member;
-		this.policy = policy;
-	}
-
-	public TypeRef getName() {
-		return name;
-	}
-
-	public ElementType getElementType() {
-		return member;
-	}
-
-	public RetentionPolicy getRetentionPolicy() {
-		return policy;
-	}
-
-	public String toString() {
-		return name + ":" + member + ":" + policy + ":" + elements;
-	}
-
-	public <T> T get(String string) {
-		if (elements == null)
-			return null;
-
-		return (T) elements.get(string);
-	}
-
-	public <T> void put(String string, Object v) {
-		if (elements == null)
-			return;
-
-		elements.put(string, v);
-	}
-
-	public Set<String> keySet() {
-		if (elements == null)
-			return Collections.emptySet();
-
-		return elements.keySet();
-	}
-
-	public <T extends java.lang.annotation.Annotation> T getAnnotation() throws Exception {
-		String cname = name.getFQN();
-		Class<T> c = (Class<T>) getClass().getClassLoader().loadClass(cname);
-		return getAnnotation(c);
-	}
-
-	public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T> c) throws Exception {
-		String cname = name.getFQN();
-		if (!c.getName().equals(cname))
-			return null;
-		return Configurable.createConfigurable(c, elements);
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java b/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
deleted file mode 100755
index 152f326..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
+++ /dev/null
@@ -1,1575 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.jar.*;
-import java.util.regex.*;
-import java.util.zip.*;
-
-import aQute.bnd.component.*;
-import aQute.bnd.differ.*;
-import aQute.bnd.differ.Baseline.Info;
-import aQute.bnd.make.*;
-import aQute.bnd.make.component.*;
-import aQute.bnd.make.metatype.*;
-import aQute.bnd.maven.*;
-import aQute.bnd.service.*;
-import aQute.bnd.service.RepositoryPlugin.Strategy;
-import aQute.bnd.service.diff.*;
-import aQute.lib.collections.*;
-import aQute.lib.osgi.Descriptors.PackageRef;
-import aQute.lib.osgi.Descriptors.TypeRef;
-import aQute.libg.generics.*;
-import aQute.libg.header.*;
-
-/**
- * Include-Resource: ( [name '=' ] file )+ Private-Package: package-decl ( ','
- * package-decl )* Export-Package: package-decl ( ',' package-decl )*
- * Import-Package: package-decl ( ',' package-decl )*
- * 
- * @version $Revision$
- */
-public class Builder extends Analyzer {
-	static Pattern					IR_PATTERN			= Pattern.compile("[{]?-?@?(?:[^=]+=)?\\s*([^}!]+).*");
-	private final DiffPluginImpl	differ				= new DiffPluginImpl();
-	private Pattern					xdoNotCopy			= null;
-	private static final int		SPLIT_MERGE_LAST	= 1;
-	private static final int		SPLIT_MERGE_FIRST	= 2;
-	private static final int		SPLIT_ERROR			= 3;
-	private static final int		SPLIT_FIRST			= 4;
-	private static final int		SPLIT_DEFAULT		= 0;
-	private final List<File>		sourcePath			= new ArrayList<File>();
-	private final Make				make				= new Make(this);
-
-	public Builder(Processor parent) {
-		super(parent);
-	}
-
-	public Builder() {}
-
-	public Jar build() throws Exception {
-		trace("build");
-		init();
-		if (isTrue(getProperty(NOBUNDLES)))
-			return null;
-
-		if (getProperty(CONDUIT) != null)
-			error("Specified " + CONDUIT + " but calls build() instead of builds() (might be a programmer error");
-
-		Jar dot = new Jar("dot");
-		try {
-			long modified = Long.parseLong(getProperty("base.modified"));
-			dot.updateModified(modified, "Base modified");
-		}
-		catch (Exception e) {
-			// Ignore
-		}
-		setJar(dot);
-
-		doExpand(dot);
-		doIncludeResources(dot);
-		doWab(dot);
-
-
-		// Check if we override the calculation of the
-		// manifest. We still need to calculated it because
-		// we need to have analyzed the classpath.
-
-		Manifest manifest = calcManifest();
-
-		String mf = getProperty(MANIFEST);
-		if (mf != null) {
-			File mff = getFile(mf);
-			if (mff.isFile()) {
-				try {
-					InputStream in = new FileInputStream(mff);
-					manifest = new Manifest(in);
-					in.close();
-				}
-				catch (Exception e) {
-					error(MANIFEST + " while reading manifest file", e);
-				}
-			} else {
-				error(MANIFEST + ", no such file " + mf);
-			}
-		}
-
-		if (getProperty(NOMANIFEST) == null)
-			dot.setManifest(manifest);
-		else
-			dot.setDoNotTouchManifest();
-
-		// This must happen after we analyzed so
-		// we know what it is on the classpath
-		addSources(dot);
-
-		if (getProperty(POM) != null)
-			dot.putResource("pom.xml", new PomResource(dot.getManifest()));
-		
-		if (!isNoBundle())
-			doVerify(dot);
-
-		if (dot.getResources().isEmpty())
-			warning("The JAR is empty: The instructions for the JAR named %s did not cause any content to be included, this is likely wrong",
-					getBsn());
-
-		dot.updateModified(lastModified(), "Last Modified Processor");
-		dot.setName(getBsn());
-
-		sign(dot);
-		doSaveManifest(dot);
-
-		doDiff(dot); // check if need to diff this bundle
-		doBaseline(dot); // check for a baseline
-		return dot;
-	}
-
-
-	/**
-	 * Check if we need to calculate any checksums.
-	 * 
-	 * @param dot
-	 * @throws Exception
-	 */
-	private void doDigests(Jar dot) throws Exception {
-		Parameters ps = OSGiHeader.parseHeader(getProperty(DIGESTS));
-		if (ps.isEmpty())
-			return;
-		trace("digests %s", ps);
-		String[] digests = ps.keySet().toArray(new String[ps.size()]);
-		dot.calcChecksums(digests);
-	}
-
-	/**
-	 * Allow any local initialization by subclasses before we build.
-	 */
-	public void init() throws Exception {
-		begin();
-		doRequireBnd();
-
-		// Check if we have sensible setup
-
-		if (getClasspath().size() == 0
-				&& (getProperty(EXPORT_PACKAGE) != null || getProperty(EXPORT_PACKAGE) != null || getProperty(PRIVATE_PACKAGE) != null))
-			warning("Classpath is empty. Private-Package and Export-Package can only expand from the classpath when there is one");
-
-	}
-
-	/**
-	 * Turn this normal bundle in a web and add any resources.
-	 * 
-	 * @throws Exception
-	 */
-	private Jar doWab(Jar dot) throws Exception {
-		String wab = getProperty(WAB);
-		String wablib = getProperty(WABLIB);
-		if (wab == null && wablib == null)
-			return dot;
-
-		trace("wab %s %s", wab, wablib);
-		setBundleClasspath(append("WEB-INF/classes", getProperty(BUNDLE_CLASSPATH)));
-
-		Set<String> paths = new HashSet<String>(dot.getResources().keySet());
-
-		for (String path : paths) {
-			if (path.indexOf('/') > 0 && !Character.isUpperCase(path.charAt(0))) {
-				trace("wab: moving: %s", path);
-				dot.rename(path, "WEB-INF/classes/" + path);
-			}
-		}
-
-		Parameters clauses = parseHeader(getProperty(WABLIB));
-		for (String key : clauses.keySet()) {
-			File f = getFile(key);
-			addWabLib(dot, f);
-		}
-		doIncludeResource(dot, wab);
-		return dot;
-	}
-
-	/**
-	 * Add a wab lib to the jar.
-	 * 
-	 * @param f
-	 */
-	private void addWabLib(Jar dot, File f) throws Exception {
-		if (f.exists()) {
-			Jar jar = new Jar(f);
-			jar.setDoNotTouchManifest();
-			addClose(jar);
-			String path = "WEB-INF/lib/" + f.getName();
-			dot.putResource(path, new JarResource(jar));
-			setProperty(BUNDLE_CLASSPATH, append(getProperty(BUNDLE_CLASSPATH), path));
-
-			Manifest m = jar.getManifest();
-			String cp = m.getMainAttributes().getValue("Class-Path");
-			if (cp != null) {
-				Collection<String> parts = split(cp, ",");
-				for (String part : parts) {
-					File sub = getFile(f.getParentFile(), part);
-					if (!sub.exists() || !sub.getParentFile().equals(f.getParentFile())) {
-						warning("Invalid Class-Path entry %s in %s, must exist and must reside in same directory", sub,
-								f);
-					} else {
-						addWabLib(dot, sub);
-					}
-				}
-			}
-		} else {
-			error("WAB lib does not exist %s", f);
-		}
-	}
-
-	/**
-	 * Get the manifest and write it out separately if -savemanifest is set
-	 * 
-	 * @param dot
-	 */
-	private void doSaveManifest(Jar dot) throws Exception {
-		String output = getProperty(SAVEMANIFEST);
-		if (output == null)
-			return;
-
-		File f = getFile(output);
-		if (f.isDirectory()) {
-			f = new File(f, "MANIFEST.MF");
-		}
-		f.delete();
-		f.getParentFile().mkdirs();
-		OutputStream out = new FileOutputStream(f);
-		try {
-			Jar.writeManifest(dot.getManifest(), out);
-		}
-		finally {
-			out.close();
-		}
-		changedFile(f);
-	}
-
-	protected void changedFile(@SuppressWarnings("unused") File f) {}
-
-	/**
-	 * Sign the jar file. -sign : <alias> [ ';' 'password:=' <password> ] [ ';'
-	 * 'keystore:=' <keystore> ] [ ';' 'sign-password:=' <pw> ] ( ',' ... )*
-	 * 
-	 * @return
-	 */
-
-	void sign(@SuppressWarnings("unused") Jar jar) throws Exception {
-		String signing = getProperty("-sign");
-		if (signing == null)
-			return;
-
-		trace("Signing %s, with %s", getBsn(), signing);
-		List<SignerPlugin> signers = getPlugins(SignerPlugin.class);
-
-		Parameters infos = parseHeader(signing);
-		for (Entry<String,Attrs> entry : infos.entrySet()) {
-			for (SignerPlugin signer : signers) {
-				signer.sign(this, entry.getKey());
-			}
-		}
-	}
-
-	public boolean hasSources() {
-		return isTrue(getProperty(SOURCES));
-	}
-
-	/**
-	 * Answer extra packages. In this case we implement conditional package. Any
-	 */
-	protected Jar getExtra() throws Exception {
-		Parameters conditionals = getParameters(CONDITIONAL_PACKAGE);
-		if (conditionals.isEmpty())
-			return null;
-		trace("do Conditional Package %s", conditionals);
-		Instructions instructions = new Instructions(conditionals);
-
-		Collection<PackageRef> referred = instructions.select(getReferred().keySet(), false);
-		referred.removeAll(getContained().keySet());
-
-		Jar jar = new Jar("conditional-import");
-		addClose(jar);
-		for (PackageRef pref : referred) {
-			for (Jar cpe : getClasspath()) {
-				Map<String,Resource> map = cpe.getDirectories().get(pref.getPath());
-				if (map != null) {
-					copy(jar, cpe, pref.getPath(), false);
-// Now use copy so that bnd.info is processed, next line should be 
-// removed in the future TODO
-//					jar.addDirectory(map, false);
-					break;
-				}
-			}
-		}
-		if (jar.getDirectories().size() == 0)
-			return null;
-		return jar;
-	}
-
-	/**
-	 * Intercept the call to analyze and cleanup versions after we have analyzed
-	 * the setup. We do not want to cleanup if we are going to verify.
-	 */
-
-	public void analyze() throws Exception {
-		super.analyze();
-		cleanupVersion(getImports(), null);
-		cleanupVersion(getExports(), getVersion());
-		String version = getProperty(BUNDLE_VERSION);
-		if (version != null) {
-			version = cleanupVersion(version);
-			if (version.endsWith(".SNAPSHOT")) {
-				version = version.replaceAll("SNAPSHOT$", getProperty(SNAPSHOT, "SNAPSHOT"));
-			}
-			setProperty(BUNDLE_VERSION, version);
-		}
-	}
-
-	public void cleanupVersion(Packages packages, String defaultVersion) {
-		for (Map.Entry<PackageRef,Attrs> entry : packages.entrySet()) {
-			Attrs attributes = entry.getValue();
-			String v = attributes.get(Constants.VERSION_ATTRIBUTE);
-			if (v == null && defaultVersion != null) {
-				if (!isTrue(getProperty(Constants.NODEFAULTVERSION))) {
-					v = defaultVersion;
-					if (isPedantic())
-						warning("Used bundle version %s for exported package %s", v, entry.getKey());
-				} else {
-					if (isPedantic())
-						warning("No export version for exported package %s", entry.getKey());
-				}
-			}
-			if (v != null)
-				attributes.put(Constants.VERSION_ATTRIBUTE, cleanupVersion(v));
-		}
-	}
-
-	/**
-     * 
-     */
-	private void addSources(Jar dot) {
-		if (!hasSources())
-			return;
-
-		Set<PackageRef> packages = Create.set();
-
-		for (TypeRef typeRef : getClassspace().keySet()) {
-			PackageRef packageRef = typeRef.getPackageRef();
-			String sourcePath = typeRef.getSourcePath();
-			String packagePath = packageRef.getPath();
-
-			boolean found = false;
-			String[] fixed = {
-					"packageinfo", "package.html", "module-info.java", "package-info.java"
-			};
-
-			for (Iterator<File> i = getSourcePath().iterator(); i.hasNext();) {
-				File root = i.next();
-
-				// TODO should use bcp?
-
-				File f = getFile(root, sourcePath);
-				if (f.exists()) {
-					found = true;
-					if (!packages.contains(packageRef)) {
-						packages.add(packageRef);
-						File bdir = getFile(root, packagePath);
-						for (int j = 0; j < fixed.length; j++) {
-							File ff = getFile(bdir, fixed[j]);
-							if (ff.isFile()) {
-								String name = "OSGI-OPT/src/" + packagePath + "/" + fixed[j];
-								dot.putResource(name, new FileResource(ff));
-							}
-						}
-					}
-					if (packageRef.isDefaultPackage())
-						System.err.println("Duh?");
-					dot.putResource("OSGI-OPT/src/" + sourcePath, new FileResource(f));
-				}
-			}
-			if (!found) {
-				for (Jar jar : getClasspath()) {
-					Resource resource = jar.getResource(sourcePath);
-					if (resource != null) {
-						dot.putResource("OSGI-OPT/src/" + sourcePath, resource);
-					} else {
-						resource = jar.getResource("OSGI-OPT/src/" + sourcePath);
-						if (resource != null) {
-							dot.putResource("OSGI-OPT/src/" + sourcePath, resource);
-						}
-					}
-				}
-			}
-			if (getSourcePath().isEmpty())
-				warning("Including sources but " + SOURCEPATH + " does not contain any source directories ");
-			// TODO copy from the jars where they came from
-		}
-	}
-
-	boolean			firstUse	= true;
-	private Tree	tree;
-
-	public Collection<File> getSourcePath() {
-		if (firstUse) {
-			firstUse = false;
-			String sp = getProperty(SOURCEPATH);
-			if (sp != null) {
-				Parameters map = parseHeader(sp);
-				for (Iterator<String> i = map.keySet().iterator(); i.hasNext();) {
-					String file = i.next();
-					if (!isDuplicate(file)) {
-						File f = getFile(file);
-						if (!f.isDirectory()) {
-							error("Adding a sourcepath that is not a directory: " + f);
-						} else {
-							sourcePath.add(f);
-						}
-					}
-				}
-			}
-		}
-		return sourcePath;
-	}
-
-	private void doVerify(@SuppressWarnings("unused") Jar dot) throws Exception {
-		Verifier verifier = new Verifier(this);
-		// Give the verifier the benefit of our analysis
-		// prevents parsing the files twice
-		verifier.verify();
-		getInfo(verifier);
-	}
-
-	private void doExpand(Jar dot) {
-
-		// Build an index of the class path that we can then
-		// use destructively
-		MultiMap<String,Jar> packages = new MultiMap<String,Jar>();
-		for (Jar srce : getClasspath()) {
-			for (Entry<String,Map<String,Resource>> e : srce.getDirectories().entrySet()) {
-				if (e.getValue() != null)
-					packages.add(e.getKey(), srce);
-			}
-		}
-
-		Parameters privatePackages = getPrivatePackage();
-		if (isTrue(getProperty(Constants.UNDERTEST))) {
-			String h = getProperty(Constants.TESTPACKAGES, "test;presence:=optional");
-			privatePackages.putAll(parseHeader(h));
-		}
-
-		if (!privatePackages.isEmpty()) {
-			Instructions privateFilter = new Instructions(privatePackages);
-			Set<Instruction> unused = doExpand(dot, packages, privateFilter);
-
-			if (!unused.isEmpty()) {
-				warning("Unused Private-Package instructions, no such package(s) on the class path: %s", unused);
-			}
-		}
-
-		Parameters exportedPackage = getExportPackage();
-		if (!exportedPackage.isEmpty()) {
-			Instructions exportedFilter = new Instructions(exportedPackage);
-
-			// We ignore unused instructions for exports, they should show
-			// up as errors during analysis. Otherwise any overlapping
-			// packages with the private packages should show up as
-			// unused
-
-			doExpand(dot, packages, exportedFilter);
-		}
-	}
-
-	/**
-	 * Destructively filter the packages from the build up index. This index is
-	 * used by the Export Package as well as the Private Package
-	 * 
-	 * @param jar
-	 * @param name
-	 * @param instructions
-	 */
-	private Set<Instruction> doExpand(Jar jar, MultiMap<String,Jar> index, Instructions filter) {
-		Set<Instruction> unused = Create.set();
-
-		for (Entry<Instruction,Attrs> e : filter.entrySet()) {
-			Instruction instruction = e.getKey();
-			if (instruction.isDuplicate())
-				continue;
-
-			Attrs directives = e.getValue();
-
-			// We can optionally filter on the
-			// source of the package. We assume
-			// they all match but this can be overridden
-			// on the instruction
-			Instruction from = new Instruction(directives.get(FROM_DIRECTIVE, "*"));
-
-			boolean used = false;
-
-			for (Iterator<Entry<String,List<Jar>>> entry = index.entrySet().iterator(); entry.hasNext();) {
-				Entry<String,List<Jar>> p = entry.next();
-
-				String directory = p.getKey();
-				PackageRef packageRef = getPackageRef(directory);
-
-				// Skip * and meta data, we're talking packages!
-				if (packageRef.isMetaData() && instruction.isAny())
-					continue;
-
-				if (!instruction.matches(packageRef.getFQN()))
-					continue;
-
-				// Ensure it is never matched again
-				entry.remove();
-
-				// ! effectively removes it from consideration by others (this
-				// includes exports)
-				if (instruction.isNegated())
-					continue;
-
-				// Do the from: directive, filters on the JAR type
-				List<Jar> providers = filterFrom(from, p.getValue());
-				if (providers.isEmpty())
-					continue;
-
-				int splitStrategy = getSplitStrategy(directives.get(SPLIT_PACKAGE_DIRECTIVE));
-				copyPackage(jar, providers, directory, splitStrategy);
-
-				used = true;
-			}
-
-			if (!used && !isTrue(directives.get("optional:")))
-				unused.add(instruction);
-		}
-		return unused;
-	}
-
-	/**
-	 * @param from
-	 * @return
-	 */
-	private List<Jar> filterFrom(Instruction from, List<Jar> providers) {
-		if (from.isAny())
-			return providers;
-
-		List<Jar> np = new ArrayList<Jar>();
-		for (Iterator<Jar> i = providers.iterator(); i.hasNext();) {
-			Jar j = i.next();
-			if (from.matches(j.getName())) {
-				np.add(j);
-			}
-		}
-		return np;
-	}
-
-	/**
-	 * Copy the package from the providers based on the split package strategy.
-	 * 
-	 * @param dest
-	 * @param providers
-	 * @param directory
-	 * @param splitStrategy
-	 */
-	private void copyPackage(Jar dest, List<Jar> providers, String path, int splitStrategy) {
-		switch (splitStrategy) {
-			case SPLIT_MERGE_LAST :
-				for (Jar srce : providers) {
-					copy(dest, srce, path, true);
-				}
-				break;
-
-			case SPLIT_MERGE_FIRST :
-				for (Jar srce : providers) {
-					copy(dest, srce, path, false);
-				}
-				break;
-
-			case SPLIT_ERROR :
-				error(diagnostic(path, providers));
-				break;
-
-			case SPLIT_FIRST :
-				copy(dest, providers.get(0), path, false);
-				break;
-
-			default :
-				if (providers.size() > 1)
-					warning("%s", diagnostic(path, providers));
-				for (Jar srce : providers) {
-					copy(dest, srce, path, false);
-				}
-				break;
-		}
-	}
-
-	/**
-	 * Cop
-	 * 
-	 * @param dest
-	 * @param srce
-	 * @param path
-	 * @param overwriteResource
-	 */
-	private void copy(Jar dest, Jar srce, String path, boolean overwrite) {
-		trace("copy d=" + dest + " s=" + srce +" p="+ path);
-		dest.copy(srce, path, overwrite);
-		
-		// bnd.info sources must be preprocessed
-		String bndInfoPath = path + "/bnd.info";
-		Resource r = dest.getResource(bndInfoPath);
-		if ( r != null && !(r instanceof PreprocessResource)) {
-			trace("preprocessing bnd.info");
-			PreprocessResource pp = new PreprocessResource(this, r);
-			dest.putResource(bndInfoPath, pp);
-		}
-		
-		if (hasSources()) {
-			String srcPath = "OSGI-OPT/src/" + path;
-			Map<String,Resource> srcContents = srce.getDirectories().get(srcPath);
-			if (srcContents != null) {
-				dest.addDirectory(srcContents, overwrite);
-			}
-		}
-	}
-
-	/**
-	 * Analyze the classpath for a split package
-	 * 
-	 * @param pack
-	 * @param classpath
-	 * @param source
-	 * @return
-	 */
-	private String diagnostic(String pack, List<Jar> culprits) {
-		// Default is like merge-first, but with a warning
-		return "Split package, multiple jars provide the same package:"
-				+ pack
-				+ "\nUse Import/Export Package directive -split-package:=(merge-first|merge-last|error|first) to get rid of this warning\n"
-				+ "Package found in   " + culprits + "\n" //
-				+ "Class path         " + getClasspath();
-	}
-
-	private int getSplitStrategy(String type) {
-		if (type == null)
-			return SPLIT_DEFAULT;
-
-		if (type.equals("merge-last"))
-			return SPLIT_MERGE_LAST;
-
-		if (type.equals("merge-first"))
-			return SPLIT_MERGE_FIRST;
-
-		if (type.equals("error"))
-			return SPLIT_ERROR;
-
-		if (type.equals("first"))
-			return SPLIT_FIRST;
-
-		error("Invalid strategy for split-package: " + type);
-		return SPLIT_DEFAULT;
-	}
-
-	/**
-	 * Matches the instructions against a package.
-	 * 
-	 * @param instructions
-	 *            The list of instructions
-	 * @param pack
-	 *            The name of the package
-	 * @param unused
-	 *            The total list of patterns, matched patterns are removed
-	 * @param source
-	 *            The name of the source container, can be filtered upon with
-	 *            the from: directive.
-	 * @return
-	 */
-	private Instruction matches(Instructions instructions, String pack, Set<Instruction> unused, String source) {
-		for (Entry<Instruction,Attrs> entry : instructions.entrySet()) {
-			Instruction pattern = entry.getKey();
-
-			// It is possible to filter on the source of the
-			// package with the from: directive. This is an
-			// instruction that must match the name of the
-			// source class path entry.
-
-			String from = entry.getValue().get(FROM_DIRECTIVE);
-			if (from != null) {
-				Instruction f = new Instruction(from);
-				if (!f.matches(source) || f.isNegated())
-					continue;
-			}
-
-			// Now do the normal
-			// matching
-			if (pattern.matches(pack)) {
-				if (unused != null)
-					unused.remove(pattern);
-				return pattern;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Parse the Bundle-Includes header. Files in the bundles Include header are
-	 * included in the jar. The source can be a directory or a file.
-	 * 
-	 * @throws IOException
-	 * @throws FileNotFoundException
-	 */
-	private void doIncludeResources(Jar jar) throws Exception {
-		String includes = getProperty("Bundle-Includes");
-		if (includes == null) {
-			includes = getProperty(INCLUDERESOURCE);
-			if (includes == null || includes.length() == 0)
-				includes = getProperty("Include-Resource");
-		} else
-			warning("Please use -includeresource instead of Bundle-Includes");
-
-		doIncludeResource(jar, includes);
-
-	}
-
-	private void doIncludeResource(Jar jar, String includes) throws Exception {
-		Parameters clauses = parseHeader(includes);
-		doIncludeResource(jar, clauses);
-	}
-
-	private void doIncludeResource(Jar jar, Parameters clauses) throws ZipException, IOException, Exception {
-		for (Entry<String,Attrs> entry : clauses.entrySet()) {
-			doIncludeResource(jar, entry.getKey(), entry.getValue());
-		}
-	}
-
-	private void doIncludeResource(Jar jar, String name, Map<String,String> extra) throws ZipException, IOException,
-			Exception {
-
-		boolean preprocess = false;
-		boolean absentIsOk = false;
-
-		if (name.startsWith("{") && name.endsWith("}")) {
-			preprocess = true;
-			name = name.substring(1, name.length() - 1).trim();
-		}
-
-		String parts[] = name.split("\\s*=\\s*");
-		String source = parts[0];
-		String destination = parts[0];
-		if (parts.length == 2)
-			source = parts[1];
-
-		if (source.startsWith("-")) {
-			source = source.substring(1);
-			absentIsOk = true;
-		}
-
-		if (source.startsWith("@")) {
-			extractFromJar(jar, source.substring(1), parts.length == 1 ? "" : destination, absentIsOk);
-		} else if (extra.containsKey("cmd")) {
-			doCommand(jar, source, destination, extra, preprocess, absentIsOk);
-		} else if (extra.containsKey("literal")) {
-			String literal = extra.get("literal");
-			Resource r = new EmbeddedResource(literal.getBytes("UTF-8"), 0);
-			String x = extra.get("extra");
-			if (x != null)
-				r.setExtra(x);
-			jar.putResource(name, r);
-		} else {
-			File sourceFile;
-			String destinationPath;
-
-			sourceFile = getFile(source);
-			if (parts.length == 1) {
-				// Directories should be copied to the root
-				// but files to their file name ...
-				if (sourceFile.isDirectory())
-					destinationPath = "";
-				else
-					destinationPath = sourceFile.getName();
-			} else {
-				destinationPath = parts[0];
-			}
-			// Handle directories
-			if (sourceFile.isDirectory()) {
-				destinationPath = doResourceDirectory(jar, extra, preprocess, sourceFile, destinationPath);
-				return;
-			}
-
-			// destinationPath = checkDestinationPath(destinationPath);
-
-			if (!sourceFile.exists()) {
-				if (absentIsOk)
-					return;
-
-				noSuchFile(jar, name, extra, source, destinationPath);
-			} else
-				copy(jar, destinationPath, sourceFile, preprocess, extra);
-		}
-	}
-
-	/**
-	 * It is possible in Include-Resource to use a system command that generates
-	 * the contents, this is indicated with {@code cmd} attribute. The command
-	 * can be repeated for a number of source files with the {@code for}
-	 * attribute which indicates a list of repetitions, often down with the
-	 * {@link Macro#_lsa(String[])} or {@link Macro#_lsb(String[])} macro. The
-	 * repetition will repeat the given command for each item. The @} macro can
-	 * be used to replace the current item. If no {@code for} is given, the
-	 * source is used as the only item. If the destination contains a macro,
-	 * each iteration will create a new file, otherwise the destination name is
-	 * used. The execution of the command is delayed until the JAR is actually
-	 * written to the file system for performance reasons.
-	 * 
-	 * @param jar
-	 * @param source
-	 * @param destination
-	 * @param extra
-	 * @param preprocess
-	 * @param absentIsOk
-	 */
-	private void doCommand(Jar jar, String source, String destination, Map<String,String> extra, boolean preprocess,
-			boolean absentIsOk) {
-		String repeat = extra.get("for"); // TODO constant
-		if (repeat == null)
-			repeat = source;
-
-		Collection<String> requires = split(extra.get("requires"));
-		long lastModified = 0;
-		for (String required : requires) {
-			File file = getFile(required);
-			if (!file.isFile()) {
-				error("Include-Resource.cmd for %s, requires %s, but no such file %s", source, required,
-						file.getAbsoluteFile());
-			} else
-				lastModified = Math.max(lastModified, file.lastModified());
-		}
-
-		String cmd = extra.get("cmd");
-
-		Collection<String> items = Processor.split(repeat);
-
-		CombinedResource cr = null;
-
-		if (!destination.contains("${@}")) {
-			cr = new CombinedResource();
-		}
-		trace("last modified requires %s", lastModified);
-
-		for (String item : items) {
-			setProperty("@", item);
-			try {
-				String path = getReplacer().process(destination);
-				String command = getReplacer().process(cmd);
-				File file = getFile(item);
-
-				Resource r = new CommandResource(command, this, Math.max(lastModified,
-						file.exists() ? file.lastModified() : 0L));
-
-				if (preprocess)
-					r = new PreprocessResource(this, r);
-
-				if (cr == null)
-					jar.putResource(path, r);
-				else
-					cr.addResource(r);
-			}
-			finally {
-				unsetProperty("@");
-			}
-		}
-
-		// Add last so the correct modification date is used
-		// to update the modified time.
-		if (cr != null)
-			jar.putResource(destination, cr);
-	}
-
-	private String doResourceDirectory(Jar jar, Map<String,String> extra, boolean preprocess, File sourceFile,
-			String destinationPath) throws Exception {
-		String filter = extra.get("filter:");
-		boolean flatten = isTrue(extra.get("flatten:"));
-		boolean recursive = true;
-		String directive = extra.get("recursive:");
-		if (directive != null) {
-			recursive = isTrue(directive);
-		}
-
-		Instruction.Filter iFilter = null;
-		if (filter != null) {
-			iFilter = new Instruction.Filter(new Instruction(filter), recursive, getDoNotCopy());
-		} else {
-			iFilter = new Instruction.Filter(null, recursive, getDoNotCopy());
-		}
-
-		Map<String,File> files = newMap();
-		resolveFiles(sourceFile, iFilter, recursive, destinationPath, files, flatten);
-
-		for (Map.Entry<String,File> entry : files.entrySet()) {
-			copy(jar, entry.getKey(), entry.getValue(), preprocess, extra);
-		}
-		return destinationPath;
-	}
-
-	private void resolveFiles(File dir, FileFilter filter, boolean recursive, String path, Map<String,File> files,
-			boolean flatten) {
-
-		if (doNotCopy(dir.getName())) {
-			return;
-		}
-
-		File[] fs = dir.listFiles(filter);
-		for (File file : fs) {
-			if (file.isDirectory()) {
-				if (recursive) {
-					String nextPath;
-					if (flatten)
-						nextPath = path;
-					else
-						nextPath = appendPath(path, file.getName());
-
-					resolveFiles(file, filter, recursive, nextPath, files, flatten);
-				}
-				// Directories are ignored otherwise
-			} else {
-				String p = appendPath(path, file.getName());
-				if (files.containsKey(p))
-					warning("Include-Resource overwrites entry %s from file %s", p, file);
-				files.put(p, file);
-			}
-		}
-	}
-
-	private void noSuchFile(Jar jar, @SuppressWarnings("unused") String clause, Map<String,String> extra, String source, String destinationPath)
-			throws Exception {
-		Jar src = getJarFromName(source, "Include-Resource " + source);
-		if (src != null) {
-			// Do not touch the manifest so this also
-			// works for signed files.
-			src.setDoNotTouchManifest();
-			JarResource jarResource = new JarResource(src);
-			jar.putResource(destinationPath, jarResource);
-		} else {
-			Resource lastChance = make.process(source);
-			if (lastChance != null) {
-				String x = extra.get("extra");
-				if (x != null)
-					lastChance.setExtra(x);
-				jar.putResource(destinationPath, lastChance);
-			} else
-				error("Input file does not exist: " + source);
-		}
-	}
-
-	/**
-	 * Extra resources from a Jar and add them to the given jar. The clause is
-	 * the
-	 * 
-	 * @param jar
-	 * @param clauses
-	 * @param i
-	 * @throws ZipException
-	 * @throws IOException
-	 */
-	private void extractFromJar(Jar jar, String source, String destination, boolean absentIsOk) throws ZipException,
-			IOException {
-		// Inline all resources and classes from another jar
-		// optionally appended with a modified regular expression
-		// like @zip.jar!/META-INF/MANIFEST.MF
-		int n = source.lastIndexOf("!/");
-		Instruction instr = null;
-		if (n > 0) {
-			instr = new Instruction(source.substring(n + 2));
-			source = source.substring(0, n);
-		}
-
-		// Pattern filter = null;
-		// if (n > 0) {
-		// String fstring = source.substring(n + 2);
-		// source = source.substring(0, n);
-		// filter = wildcard(fstring);
-		// }
-		Jar sub = getJarFromName(source, "extract from jar");
-		if (sub == null) {
-			if (absentIsOk)
-				return;
-
-			error("Can not find JAR file " + source);
-		} else {
-			addAll(jar, sub, instr, destination);
-		}
-	}
-
-	/**
-	 * Add all the resources in the given jar that match the given filter.
-	 * 
-	 * @param sub
-	 *            the jar
-	 * @param filter
-	 *            a pattern that should match the resoures in sub to be added
-	 */
-	public boolean addAll(Jar to, Jar sub, Instruction filter) {
-		return addAll(to, sub, filter, "");
-	}
-
-	/**
-	 * Add all the resources in the given jar that match the given filter.
-	 * 
-	 * @param sub
-	 *            the jar
-	 * @param filter
-	 *            a pattern that should match the resoures in sub to be added
-	 */
-	public boolean addAll(Jar to, Jar sub, Instruction filter, String destination) {
-		boolean dupl = false;
-		for (String name : sub.getResources().keySet()) {
-			if ("META-INF/MANIFEST.MF".equals(name))
-				continue;
-
-			if (filter == null || filter.matches(name) != filter.isNegated())
-				dupl |= to.putResource(Processor.appendPath(destination, name), sub.getResource(name), true);
-		}
-		return dupl;
-	}
-
-	private void copy(Jar jar, String path, File from, boolean preprocess, Map<String,String> extra) throws Exception {
-		if (doNotCopy(from.getName()))
-			return;
-
-		if (from.isDirectory()) {
-
-			File files[] = from.listFiles();
-			for (int i = 0; i < files.length; i++) {
-				copy(jar, appendPath(path, files[i].getName()), files[i], preprocess, extra);
-			}
-		} else {
-			if (from.exists()) {
-				Resource resource = new FileResource(from);
-				if (preprocess) {
-					resource = new PreprocessResource(this, resource);
-				}
-				String x = extra.get("extra");
-				if (x != null)
-					resource.setExtra(x);
-				if (path.endsWith("/"))
-					path = path + from.getName();
-				jar.putResource(path, resource);
-
-				if (isTrue(extra.get(LIB_DIRECTIVE))) {
-					setProperty(BUNDLE_CLASSPATH, append(getProperty(BUNDLE_CLASSPATH), path));
-				}
-			} else {
-				error("Input file does not exist: " + from);
-			}
-		}
-	}
-
-	public void setSourcepath(File[] files) {
-		for (int i = 0; i < files.length; i++)
-			addSourcepath(files[i]);
-	}
-
-	public void addSourcepath(File cp) {
-		if (!cp.exists())
-			warning("File on sourcepath that does not exist: " + cp);
-
-		sourcePath.add(cp);
-	}
-
-	public void close() {
-		super.close();
-	}
-
-	/**
-	 * Build Multiple jars. If the -sub command is set, we filter the file with
-	 * the given patterns.
-	 * 
-	 * @return
-	 * @throws Exception
-	 */
-	public Jar[] builds() throws Exception {
-		begin();
-
-		// Are we acting as a conduit for another JAR?
-		String conduit = getProperty(CONDUIT);
-		if (conduit != null) {
-			Parameters map = parseHeader(conduit);
-			Jar[] result = new Jar[map.size()];
-			int n = 0;
-			for (String file : map.keySet()) {
-				Jar c = new Jar(getFile(file));
-				addClose(c);
-				String name = map.get(file).get("name");
-				if (name != null)
-					c.setName(name);
-
-				result[n++] = c;
-			}
-			return result;
-		}
-
-		List<Jar> result = new ArrayList<Jar>();
-		List<Builder> builders;
-
-		builders = getSubBuilders();
-
-		for (Builder builder : builders) {
-			try {
-				Jar jar = builder.build();
-				jar.setName(builder.getBsn());
-				result.add(jar);
-			}
-			catch (Exception e) {
-				e.printStackTrace();
-				error("Sub Building " + builder.getBsn(), e);
-			}
-			if (builder != this)
-				getInfo(builder, builder.getBsn() + ": ");
-		}
-		return result.toArray(new Jar[result.size()]);
-	}
-
-	/**
-	 * Answer a list of builders that represent this file or a list of files
-	 * specified in -sub. This list can be empty. These builders represents to
-	 * be created artifacts and are each scoped to such an artifacts. The
-	 * builders can be used to build the bundles or they can be used to find out
-	 * information about the to be generated bundles.
-	 * 
-	 * @return List of 0..n builders representing artifacts.
-	 * @throws Exception
-	 */
-	public List<Builder> getSubBuilders() throws Exception {
-		String sub = getProperty(SUB);
-		if (sub == null || sub.trim().length() == 0 || EMPTY_HEADER.equals(sub))
-			return Arrays.asList(this);
-
-		List<Builder> builders = new ArrayList<Builder>();
-		if (isTrue(getProperty(NOBUNDLES)))
-			return builders;
-
-		Parameters subsMap = parseHeader(sub);
-		for (Iterator<String> i = subsMap.keySet().iterator(); i.hasNext();) {
-			File file = getFile(i.next());
-			if (file.isFile()) {
-				builders.add(getSubBuilder(file));
-				i.remove();
-			}
-		}
-
-		Instructions instructions = new Instructions(subsMap);
-
-		List<File> members = new ArrayList<File>(Arrays.asList(getBase().listFiles()));
-
-		nextFile: while (members.size() > 0) {
-
-			File file = members.remove(0);
-
-			// Check if the file is one of our parents
-			Processor p = this;
-			while (p != null) {
-				if (file.equals(p.getPropertiesFile()))
-					continue nextFile;
-				p = p.getParent();
-			}
-
-			for (Iterator<Instruction> i = instructions.keySet().iterator(); i.hasNext();) {
-
-				Instruction instruction = i.next();
-				if (instruction.matches(file.getName())) {
-
-					if (!instruction.isNegated()) {
-						builders.add(getSubBuilder(file));
-					}
-
-					// Because we matched (even though we could be negated)
-					// we skip any remaining searches
-					continue nextFile;
-				}
-			}
-		}
-		return builders;
-	}
-
-	public Builder getSubBuilder(File file) throws Exception {
-		Builder builder = getSubBuilder();
-		if (builder != null) {
-			builder.setProperties(file);
-			addClose(builder);
-		}
-		return builder;
-	}
-
-	public Builder getSubBuilder() throws Exception {
-		Builder builder = new Builder(this);
-		builder.setBase(getBase());
-
-		for (Jar file : getClasspath()) {
-			builder.addClasspath(file);
-		}
-
-		return builder;
-	}
-
-	/**
-	 * A macro to convert a maven version to an OSGi version
-	 */
-
-	public String _maven_version(String args[]) {
-		if (args.length > 2)
-			error("${maven_version} macro receives too many arguments " + Arrays.toString(args));
-		else if (args.length < 2)
-			error("${maven_version} macro has no arguments, use ${maven_version;1.2.3-SNAPSHOT}");
-		else {
-			return cleanupVersion(args[1]);
-		}
-		return null;
-	}
-
-	public String _permissions(String args[]) {
-		StringBuilder sb = new StringBuilder();
-
-		for (String arg : args) {
-			if ("packages".equals(arg) || "all".equals(arg)) {
-				for (PackageRef imp : getImports().keySet()) {
-					if (!imp.isJava()) {
-						sb.append("(org.osgi.framework.PackagePermission \"");
-						sb.append(imp);
-						sb.append("\" \"import\")\r\n");
-					}
-				}
-				for (PackageRef exp : getExports().keySet()) {
-					sb.append("(org.osgi.framework.PackagePermission \"");
-					sb.append(exp);
-					sb.append("\" \"export\")\r\n");
-				}
-			} else if ("admin".equals(arg) || "all".equals(arg)) {
-				sb.append("(org.osgi.framework.AdminPermission)");
-			} else if ("permissions".equals(arg))
-				;
-			else
-				error("Invalid option in ${permissions}: %s", arg);
-		}
-		return sb.toString();
-	}
-
-	/**
-     * 
-     */
-	public void removeBundleSpecificHeaders() {
-		Set<String> set = new HashSet<String>(Arrays.asList(BUNDLE_SPECIFIC_HEADERS));
-		setForceLocal(set);
-	}
-
-	/**
-	 * Check if the given resource is in scope of this bundle. That is, it
-	 * checks if the Include-Resource includes this resource or if it is a class
-	 * file it is on the class path and the Export-Package or Private-Package
-	 * include this resource.
-	 * 
-	 * @param f
-	 * @return
-	 */
-	public boolean isInScope(Collection<File> resources) throws Exception {
-		Parameters clauses = parseHeader(getProperty(Constants.EXPORT_PACKAGE));
-		clauses.putAll(parseHeader(getProperty(Constants.PRIVATE_PACKAGE)));
-		if (isTrue(getProperty(Constants.UNDERTEST))) {
-			clauses.putAll(parseHeader(getProperty(Constants.TESTPACKAGES, "test;presence:=optional")));
-		}
-
-		Collection<String> ir = getIncludedResourcePrefixes();
-
-		Instructions instructions = new Instructions(clauses);
-
-		for (File r : resources) {
-			String cpEntry = getClasspathEntrySuffix(r);
-
-			if (cpEntry != null) {
-
-				if (cpEntry.equals("")) // Meaning we actually have a CPE
-					return true;
-
-				String pack = Descriptors.getPackage(cpEntry);
-				Instruction i = matches(instructions, pack, null, r.getName());
-				if (i != null)
-					return !i.isNegated();
-			}
-
-			// Check if this resource starts with one of the I-C header
-			// paths.
-			String path = r.getAbsolutePath();
-			for (String p : ir) {
-				if (path.startsWith(p))
-					return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Extra the paths for the directories and files that are used in the
-	 * Include-Resource header.
-	 * 
-	 * @return
-	 */
-	private Collection<String> getIncludedResourcePrefixes() {
-		List<String> prefixes = new ArrayList<String>();
-		Parameters includeResource = getIncludeResource();
-		for (Entry<String,Attrs> p : includeResource.entrySet()) {
-			if (p.getValue().containsKey("literal"))
-				continue;
-
-			Matcher m = IR_PATTERN.matcher(p.getKey());
-			if (m.matches()) {
-				File f = getFile(m.group(1));
-				prefixes.add(f.getAbsolutePath());
-			}
-		}
-		return prefixes;
-	}
-
-	/**
-	 * Answer the string of the resource that it has in the container. It is
-	 * possible that the resource is a classpath entry. In that case an empty
-	 * string is returned.
-	 * 
-	 * @param resource
-	 *            The resource to look for
-	 * @return A suffix on the classpath or "" if the resource is a class path
-	 *         entry
-	 * @throws Exception
-	 */
-	public String getClasspathEntrySuffix(File resource) throws Exception {
-		for (Jar jar : getClasspath()) {
-			File source = jar.getSource();
-			if (source != null) {
-
-				source = source.getCanonicalFile();
-				String sourcePath = source.getAbsolutePath();
-				String resourcePath = resource.getAbsolutePath();
-				if (sourcePath.equals(resourcePath))
-					return ""; // Matches a classpath entry
-
-				if (resourcePath.startsWith(sourcePath)) {
-					// Make sure that the path name is translated correctly
-					// i.e. on Windows the \ must be translated to /
-					String filePath = resourcePath.substring(sourcePath.length() + 1);
-
-					return filePath.replace(File.separatorChar, '/');
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * doNotCopy The doNotCopy variable maintains a patter for files that should
-	 * not be copied. There is a default {@link #DEFAULT_DO_NOT_COPY} but this
-	 * ca be overridden with the {@link Constants#DONOTCOPY} property.
-	 */
-
-	public boolean doNotCopy(String v) {
-		return getDoNotCopy().matcher(v).matches();
-	}
-
-	public Pattern getDoNotCopy() {
-		if (xdoNotCopy == null) {
-			String string = null;
-			try {
-				string = getProperty(DONOTCOPY, DEFAULT_DO_NOT_COPY);
-				xdoNotCopy = Pattern.compile(string);
-			}
-			catch (Exception e) {
-				error("Invalid value for %s, value is %s", DONOTCOPY, string);
-				xdoNotCopy = Pattern.compile(DEFAULT_DO_NOT_COPY);
-			}
-		}
-		return xdoNotCopy;
-	}
-
-	/**
-	 */
-
-	static MakeBnd			makeBnd				= new MakeBnd();
-	static MakeCopy			makeCopy			= new MakeCopy();
-	static ServiceComponent	serviceComponent	= new ServiceComponent();
-	static DSAnnotations	dsAnnotations		= new DSAnnotations();
-	static MetatypePlugin	metatypePlugin		= new MetatypePlugin();
-
-	@Override
-	protected void setTypeSpecificPlugins(Set<Object> list) {
-		list.add(makeBnd);
-		list.add(makeCopy);
-		list.add(serviceComponent);
-		list.add(dsAnnotations);
-		list.add(metatypePlugin);
-		super.setTypeSpecificPlugins(list);
-	}
-
-	/**
-	 * Diff this bundle to another bundle for the given packages.
-	 * 
-	 * @throws Exception
-	 */
-
-	public void doDiff(@SuppressWarnings("unused") Jar dot) throws Exception {
-		Parameters diffs = parseHeader(getProperty("-diff"));
-		if (diffs.isEmpty())
-			return;
-
-		trace("diff %s", diffs);
-
-		if (tree == null)
-			tree = differ.tree(this);
-
-		for (Entry<String,Attrs> entry : diffs.entrySet()) {
-			String path = entry.getKey();
-			File file = getFile(path);
-			if (!file.isFile()) {
-				error("Diffing against %s that is not a file", file);
-				continue;
-			}
-
-			boolean full = entry.getValue().get("--full") != null;
-			boolean warning = entry.getValue().get("--warning") != null;
-
-			Tree other = differ.tree(file);
-			Diff api = tree.diff(other).get("<api>");
-			Instructions instructions = new Instructions(entry.getValue().get("--pack"));
-
-			trace("diff against %s --full=%s --pack=%s --warning=%s", file, full, instructions);
-			for (Diff p : api.getChildren()) {
-				String pname = p.getName();
-				if (p.getType() == Type.PACKAGE && instructions.matches(pname)) {
-					if (p.getDelta() != Delta.UNCHANGED) {
-
-						if (!full)
-							if (warning)
-								warning("Differ %s", p);
-							else
-								error("Differ %s", p);
-						else {
-							if (warning)
-								warning("Diff found a difference in %s for packages %s", file, instructions);
-							else
-								error("Diff found a difference in %s for packages %s", file, instructions);
-							show(p, "", warning);
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Show the diff recursively
-	 * 
-	 * @param p
-	 * @param i
-	 */
-	private void show(Diff p, String indent, boolean warning) {
-		Delta d = p.getDelta();
-		if (d == Delta.UNCHANGED)
-			return;
-
-		if (warning)
-			warning("%s%s", indent, p);
-		else
-			error("%s%s", indent, p);
-
-		indent = indent + " ";
-		switch (d) {
-			case CHANGED :
-			case MAJOR :
-			case MINOR :
-			case MICRO :
-				break;
-
-			default :
-				return;
-		}
-		for (Diff c : p.getChildren())
-			show(c, indent, warning);
-	}
-
-	/**
-	 * Base line against a previous version
-	 * 
-	 * @throws Exception
-	 */
-
-	private void doBaseline(Jar dot) throws Exception {
-		Parameters diffs = parseHeader(getProperty("-baseline"));
-		if (diffs.isEmpty())
-			return;
-
-		System.err.printf("baseline %s%n", diffs);
-
-		Jar other = getBaselineJar();
-		if (other == null) {
-			return;
-		}
-		Baseline baseline = new Baseline(this, differ);
-		Set<Info> infos = baseline.baseline(dot, other, null);
-		for (Info info : infos) {
-			if (info.mismatch) {
-				error("%s %-50s %-10s %-10s %-10s %-10s %-10s\n", info.mismatch ? '*' : ' ', info.packageName,
-						info.packageDiff.getDelta(), info.newerVersion, info.olderVersion, info.suggestedVersion,
-						info.suggestedIfProviders == null ? "-" : info.suggestedIfProviders);
-			}
-		}
-	}
-
-	public void addSourcepath(Collection<File> sourcepath) {
-		for (File f : sourcepath) {
-			addSourcepath(f);
-		}
-	}
-
-	public Jar getBaselineJar() throws Exception {
-
-		List<RepositoryPlugin> repos = getPlugins(RepositoryPlugin.class);
-
-		Parameters diffs = parseHeader(getProperty("-baseline"));
-		File baselineFile = null;
-		if (diffs.isEmpty()) {
-			String repoName = getProperty("-baseline-repo");
-			if (repoName == null) {
-				return null;
-			}
-			for (RepositoryPlugin repo : repos) {
-				if (repoName.equals(repo.getName())) {
-					baselineFile = repo.get(getBsn(), null, Strategy.HIGHEST, null);
-					break;
-				}
-			}
-		} else {
-
-			String bsn = null;
-			String version = null;
-			for (Entry<String,Attrs> entry : diffs.entrySet()) {
-				bsn = entry.getKey();
-				if ("@".equals(bsn)) {
-					bsn = getBsn();
-				}
-				version = entry.getValue().get(Constants.VERSION_ATTRIBUTE);
-				break;
-			}
-	
-			for (RepositoryPlugin repo : repos) {
-				if (version == null) {
-					baselineFile = repo.get(bsn, null, Strategy.HIGHEST, null);
-				} else {
-					baselineFile = repo.get(bsn, version, Strategy.EXACT, null);
-				}
-				if (baselineFile != null) {
-					break;
-				}
-			}
-		}
-		if (baselineFile == null) {
-			return new Jar(".");
-		}
-		return new Jar(baselineFile);
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/BundleId.java b/bundleplugin/src/main/java/aQute/lib/osgi/BundleId.java
deleted file mode 100644
index 87fc25f..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/BundleId.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package aQute.lib.osgi;
-
-/**
- * Holds the bundle bsn + version pair
- */
-public class BundleId implements Comparable<BundleId> {
-	final String	bsn;
-	final String	version;
-
-	public BundleId(String bsn, String version) {
-		this.bsn = bsn.trim();
-		this.version = version.trim();
-	}
-
-	public String getVersion() {
-		return version;
-	}
-
-	public String getBsn() {
-		return bsn;
-	}
-
-	public boolean isValid() {
-		return Verifier.isVersion(version) && Verifier.isBsn(bsn);
-	}
-
-	public boolean equals(Object o) {
-		return this == o || ((o instanceof BundleId) && compareTo((BundleId) o) == 0);
-	}
-
-	public int hashCode() {
-		return bsn.hashCode() ^ version.hashCode();
-	}
-
-	public int compareTo(BundleId other) {
-		int result = bsn.compareTo(other.bsn);
-		if (result != 0)
-			return result;
-
-		return version.compareTo(other.version);
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/ClassDataCollector.java b/bundleplugin/src/main/java/aQute/lib/osgi/ClassDataCollector.java
deleted file mode 100644
index 04a8406..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/ClassDataCollector.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package aQute.lib.osgi;
-
-import aQute.lib.osgi.Descriptors.TypeRef;
-
-public class ClassDataCollector {
-	public void classBegin(@SuppressWarnings("unused") int access, @SuppressWarnings("unused") TypeRef name) {}
-
-	public boolean classStart(int access, TypeRef className) {
-		classBegin(access, className);
-		return true;
-	}
-
-	public void extendsClass(@SuppressWarnings("unused") TypeRef zuper) throws Exception {}
-
-	public void implementsInterfaces(@SuppressWarnings("unused") TypeRef[] interfaces) throws Exception {}
-
-	public void addReference(@SuppressWarnings("unused") TypeRef ref) {}
-
-	public void annotation(@SuppressWarnings("unused") Annotation annotation) {}
-
-	public void parameter(@SuppressWarnings("unused") int p) {}
-
-	public void method(@SuppressWarnings("unused") Clazz.MethodDef defined) {}
-
-	public void field(@SuppressWarnings("unused") Clazz.FieldDef defined) {}
-
-	public void reference(@SuppressWarnings("unused") Clazz.MethodDef referenced) {}
-
-	public void reference(@SuppressWarnings("unused") Clazz.FieldDef referenced) {}
-
-	public void classEnd() throws Exception {}
-
-	public void deprecated() throws Exception {}
-
-	/**
-	 * The EnclosingMethod attribute
-	 * 
-	 * @param cName
-	 *            The name of the enclosing class, never null. Name is with
-	 *            slashes.
-	 * @param mName
-	 *            The name of the enclosing method in the class with cName or
-	 *            null
-	 * @param mDescriptor
-	 *            The descriptor of this type
-	 */
-	public void enclosingMethod(TypeRef cName, String mName, String mDescriptor) {
-
-	}
-
-	/**
-	 * The InnerClass attribute
-	 * 
-	 * @param innerClass
-	 *            The name of the inner class (with slashes). Can be null.
-	 * @param outerClass
-	 *            The name of the outer class (with slashes) Can be null.
-	 * @param innerName
-	 *            The name inside the outer class, can be null.
-	 * @param modifiers
-	 *            The access flags
-	 * @throws Exception
-	 */
-	public void innerClass(TypeRef innerClass, TypeRef outerClass, String innerName, @SuppressWarnings("unused") int innerClassAccessFlags)
-			throws Exception {}
-
-	public void signature(@SuppressWarnings("unused") String signature) {}
-
-	public void constant(@SuppressWarnings("unused") Object object) {}
-
-	public void memberEnd() {}
-
-	public void version(@SuppressWarnings("unused") int minor, @SuppressWarnings("unused") int major) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void referenceMethod(@SuppressWarnings("unused")
-	int access, @SuppressWarnings("unused")
-	TypeRef className, @SuppressWarnings("unused")
-	String method, @SuppressWarnings("unused") String descriptor) {
-		// TODO Auto-generated method stub
-
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Clazz.java b/bundleplugin/src/main/java/aQute/lib/osgi/Clazz.java
deleted file mode 100755
index 87ce8a5..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Clazz.java
+++ /dev/null
@@ -1,1624 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.lang.annotation.*;
-import java.lang.reflect.*;
-import java.nio.*;
-import java.util.*;
-import java.util.regex.*;
-
-import aQute.lib.osgi.Descriptors.Descriptor;
-import aQute.lib.osgi.Descriptors.PackageRef;
-import aQute.lib.osgi.Descriptors.TypeRef;
-import aQute.libg.generics.*;
-
-public class Clazz {
-
-	static Pattern	METHOD_DESCRIPTOR	= Pattern.compile("\\((.*)\\)(.+)");
-
-	public class ClassConstant {
-		int	cname;
-
-		public ClassConstant(int class_index) {
-			this.cname = class_index;
-		}
-
-		public String getName() {
-			return (String) pool[cname];
-		}
-	}
-
-	public static enum JAVA {
-		JDK1_1(45, "JRE-1.1"), JDK1_2(46, "J2SE-1.2"), //
-		JDK1_3(47, "J2SE-1.3"), //
-		JDK1_4(48, "J2SE-1.4"), //
-		J2SE5(49, "J2SE-1.5"), //
-		J2SE6(50, "JavaSE-1.6"), //
-		OpenJDK7(51, "JavaSE-1.7"), //
-		UNKNOWN(Integer.MAX_VALUE, "<>")//
-		;
-
-		final int		major;
-		final String	ee;
-
-		JAVA(int major, String ee) {
-			this.major = major;
-			this.ee = ee;
-		}
-
-		static JAVA format(int n) {
-			for (JAVA e : JAVA.values())
-				if (e.major == n)
-					return e;
-			return UNKNOWN;
-		}
-
-		public int getMajor() {
-			return major;
-		}
-
-		public boolean hasAnnotations() {
-			return major >= J2SE5.major;
-		}
-
-		public boolean hasGenerics() {
-			return major >= J2SE5.major;
-		}
-
-		public boolean hasEnums() {
-			return major >= J2SE5.major;
-		}
-
-		public static JAVA getJava(int major, @SuppressWarnings("unused") int minor) {
-			for (JAVA j : JAVA.values()) {
-				if (j.major == major)
-					return j;
-			}
-			return UNKNOWN;
-		}
-
-		public String getEE() {
-			return ee;
-		}
-	}
-
-	public static enum QUERY {
-		IMPLEMENTS, EXTENDS, IMPORTS, NAMED, ANY, VERSION, CONCRETE, ABSTRACT, PUBLIC, ANNOTATED, RUNTIMEANNOTATIONS, CLASSANNOTATIONS;
-
-	}
-
-	public final static EnumSet<QUERY>	HAS_ARGUMENT	= EnumSet.of(QUERY.IMPLEMENTS, QUERY.EXTENDS, QUERY.IMPORTS,
-																QUERY.NAMED, QUERY.VERSION, QUERY.ANNOTATED);
-
-	/**
-	 * <pre>
-	 * ACC_PUBLIC 0x0001 Declared public; may be accessed from outside its
-	 * package. 
-	 * ACC_FINAL 0x0010 Declared final; no subclasses allowed.
-	 * ACC_SUPER 0x0020 Treat superclass methods specially when invoked by the
-	 * invokespecial instruction. 
-	 * ACC_INTERFACE 0x0200 Is an interface, not a
-	 * class. 
-	 * ACC_ABSTRACT 0x0400 Declared abstract; may not be instantiated.
-	 * </pre>
-	 * 
-	 * @param mod
-	 */
-	final static int					ACC_PUBLIC		= 0x0001;												// Declared
-	// public;
-	// may
-	// be
-	// accessed
-	// from outside its package.
-	final static int					ACC_FINAL		= 0x0010;												// Declared
-	// final;
-	// no
-	// subclasses
-	// allowed.
-	final static int					ACC_SUPER		= 0x0020;												// Treat
-	// superclass
-	// methods
-	// specially when invoked by the
-	// invokespecial instruction.
-	final static int					ACC_INTERFACE	= 0x0200;												// Is
-	// an
-	// interface,
-	// not
-	// a
-	// classs
-	final static int					ACC_ABSTRACT	= 0x0400;												// Declared
-
-	// a thing not in the source code
-	final static int					ACC_SYNTHETIC	= 0x1000;
-	final static int					ACC_ANNOTATION	= 0x2000;
-	final static int					ACC_ENUM		= 0x4000;
-
-	static protected class Assoc {
-		Assoc(byte tag, int a, int b) {
-			this.tag = tag;
-			this.a = a;
-			this.b = b;
-		}
-
-		byte	tag;
-		int		a;
-		int		b;
-	}
-
-	public class Def {
-		final int		access;
-		Set<TypeRef>	annotations;
-
-		public Def(int access) {
-			this.access = access;
-		}
-
-		public int getAccess() {
-			return access;
-		}
-
-		public boolean isEnum() {
-			return (access & ACC_ENUM) != 0;
-		}
-
-		public boolean isPublic() {
-			return Modifier.isPublic(access);
-		}
-
-		public boolean isAbstract() {
-			return Modifier.isAbstract(access);
-		}
-
-		public boolean isProtected() {
-			return Modifier.isProtected(access);
-		}
-
-		public boolean isFinal() {
-			return Modifier.isFinal(access) || Clazz.this.isFinal();
-		}
-
-		public boolean isStatic() {
-			return Modifier.isStatic(access);
-		}
-
-		public boolean isPrivate() {
-			return Modifier.isPrivate(access);
-		}
-
-		public boolean isNative() {
-			return Modifier.isNative(access);
-		}
-
-		public boolean isTransient() {
-			return Modifier.isTransient(access);
-		}
-
-		public boolean isVolatile() {
-			return Modifier.isVolatile(access);
-		}
-
-		public boolean isInterface() {
-			return Modifier.isInterface(access);
-		}
-
-		public boolean isSynthetic() {
-			return (access & ACC_SYNTHETIC) != 0;
-		}
-
-		void addAnnotation(Annotation a) {
-			if (annotations == null)
-				annotations = Create.set();
-			annotations.add(analyzer.getTypeRef(a.name.getBinary()));
-		}
-
-		public Collection<TypeRef> getAnnotations() {
-			return annotations;
-		}
-	}
-
-	public class FieldDef extends Def {
-		final String		name;
-		final Descriptor	descriptor;
-		String				signature;
-		Object				constant;
-		boolean				deprecated;
-
-		public boolean isDeprecated() {
-			return deprecated;
-		}
-
-		public void setDeprecated(boolean deprecated) {
-			this.deprecated = deprecated;
-		}
-
-		public FieldDef(int access, String name, String descriptor) {
-			super(access);
-			this.name = name;
-			this.descriptor = analyzer.getDescriptor(descriptor);
-		}
-
-		public String getName() {
-			return name;
-		}
-
-		public String toString() {
-			return getName();
-		}
-
-		public TypeRef getType() {
-			return descriptor.getType();
-		}
-
-		public TypeRef getContainingClass() {
-			return getClassName();
-		}
-
-		public Descriptor getDescriptor() {
-			return descriptor;
-		}
-
-		public void setConstant(Object o) {
-			this.constant = o;
-		}
-
-		public Object getConstant() {
-			return this.constant;
-		}
-
-		// TODO change to use proper generics
-		public String getGenericReturnType() {
-			String use = descriptor.toString();
-			if (signature != null)
-				use = signature;
-
-			Matcher m = METHOD_DESCRIPTOR.matcher(use);
-			if (!m.matches())
-				throw new IllegalArgumentException("Not a valid method descriptor: " + descriptor);
-
-			String returnType = m.group(2);
-			return objectDescriptorToFQN(returnType);
-		}
-
-		public String getSignature() {
-			return signature;
-		}
-
-	}
-
-	public class MethodDef extends FieldDef {
-		public MethodDef(int access, String method, String descriptor) {
-			super(access, method, descriptor);
-		}
-
-		public boolean isConstructor() {
-			return name.equals("<init>") || name.equals("<clinit>");
-		}
-
-		public TypeRef[] getPrototype() {
-			return descriptor.getPrototype();
-		}
-
-	}
-
-	final static byte	SkipTable[]	= { //
-			0, // 0 non existent
-			-1, // 1 CONSTANT_utf8 UTF 8, handled in
-			// method
-			-1, // 2
-			4, // 3 CONSTANT_Integer
-			4, // 4 CONSTANT_Float
-			8, // 5 CONSTANT_Long (index +=2!)
-			8, // 6 CONSTANT_Double (index +=2!)
-			-1, // 7 CONSTANT_Class
-			2, // 8 CONSTANT_String
-			4, // 9 CONSTANT_FieldRef
-			4, // 10 CONSTANT_MethodRef
-			4, // 11 CONSTANT_InterfaceMethodRef
-			4, // 12 CONSTANT_NameAndType
-			-1, // 13 Not defined
-			-1, // 14 Not defined
-			3, // 15 CONSTANT_MethodHandle
-			2, // 16 CONSTANT_MethodType
-			-1, // 17 Not defined
-			4, // 18 CONSTANT_InvokeDynamic
-									};
-
-	boolean				hasRuntimeAnnotations;
-	boolean				hasClassAnnotations;
-
-	TypeRef				className;
-	Object				pool[];
-	int					intPool[];
-	Set<PackageRef>		imports		= Create.set();
-	String				path;
-	int					minor		= 0;
-	int					major		= 0;
-	int					innerAccess	= -1;
-	int					accessx		= 0;
-	String				sourceFile;
-	Set<TypeRef>		xref;
-	Set<Integer>		classes;
-	Set<Integer>		descriptors;
-	Set<TypeRef>		annotations;
-	int					forName		= 0;
-	int					class$		= 0;
-	TypeRef[]			interfaces;
-	TypeRef				zuper;
-	ClassDataCollector	cd			= null;
-	Resource			resource;
-	FieldDef			last		= null;
-	boolean				deprecated;
-
-	final Analyzer		analyzer;
-
-	public Clazz(Analyzer analyzer, String path, Resource resource) {
-		this.path = path;
-		this.resource = resource;
-		this.analyzer = analyzer;
-	}
-
-	public Set<TypeRef> parseClassFile() throws Exception {
-		return parseClassFileWithCollector(null);
-	}
-
-	public Set<TypeRef> parseClassFile(InputStream in) throws Exception {
-		return parseClassFile(in, null);
-	}
-
-	public Set<TypeRef> parseClassFileWithCollector(ClassDataCollector cd) throws Exception {
-		InputStream in = resource.openInputStream();
-		try {
-			return parseClassFile(in, cd);
-		}
-		finally {
-			in.close();
-		}
-	}
-
-	public Set<TypeRef> parseClassFile(InputStream in, ClassDataCollector cd) throws Exception {
-		DataInputStream din = new DataInputStream(in);
-		try {
-			this.cd = cd;
-			return parseClassFile(din);
-		}
-		finally {
-			cd = null;
-			din.close();
-		}
-	}
-
-	Set<TypeRef> parseClassFile(DataInputStream in) throws Exception {
-		xref = new HashSet<TypeRef>();
-		classes = new HashSet<Integer>();
-		descriptors = new HashSet<Integer>();
-
-		boolean crawl = cd != null; // Crawl the byte code if we have a
-		// collector
-		int magic = in.readInt();
-		if (magic != 0xCAFEBABE)
-			throw new IOException("Not a valid class file (no CAFEBABE header)");
-
-		minor = in.readUnsignedShort(); // minor version
-		major = in.readUnsignedShort(); // major version
-		if (cd != null)
-			cd.version(minor, major);
-		int count = in.readUnsignedShort();
-		pool = new Object[count];
-		intPool = new int[count];
-
-		process: for (int poolIndex = 1; poolIndex < count; poolIndex++) {
-			byte tag = in.readByte();
-			switch (tag) {
-				case 0 :
-					break process;
-				case 1 :
-					constantUtf8(in, poolIndex);
-					break;
-
-				case 3 :
-					constantInteger(in, poolIndex);
-					break;
-
-				case 4 :
-					constantFloat(in, poolIndex);
-					break;
-
-				// For some insane optimization reason are
-				// the long and the double two entries in the
-				// constant pool. See 4.4.5
-				case 5 :
-					constantLong(in, poolIndex);
-					poolIndex++;
-					break;
-
-				case 6 :
-					constantDouble(in, poolIndex);
-					poolIndex++;
-					break;
-
-				case 7 :
-					constantClass(in, poolIndex);
-					break;
-
-				case 8 :
-					constantString(in, poolIndex);
-					break;
-
-				case 10 : // Method ref
-				case 11 : // Interface Method ref
-					methodRef(in, poolIndex);
-					break;
-
-				// Name and Type
-				case 12 :
-					nameAndType(in, poolIndex, tag);
-					break;
-
-				// We get the skip count for each record type
-				// from the SkipTable. This will also automatically
-				// abort when
-				default :
-					if (tag == 2)
-						throw new IOException("Invalid tag " + tag);
-					in.skipBytes(SkipTable[tag]);
-					break;
-			}
-		}
-
-		pool(pool, intPool);
-		/*
-		 * Parse after the constant pool, code thanks to Hans Christian
-		 * Falkenberg
-		 */
-
-		accessx = in.readUnsignedShort(); // access
-
-		int this_class = in.readUnsignedShort();
-		className = analyzer.getTypeRef((String) pool[intPool[this_class]]);
-
-		try {
-
-			if (cd != null) {
-				if (!cd.classStart(accessx, className))
-					return null;
-			}
-
-			int super_class = in.readUnsignedShort();
-			String superName = (String) pool[intPool[super_class]];
-			if (superName != null) {
-				zuper = analyzer.getTypeRef(superName);
-			}
-
-			if (zuper != null) {
-				referTo(zuper);
-				if (cd != null)
-					cd.extendsClass(zuper);
-			}
-
-			int interfacesCount = in.readUnsignedShort();
-			if (interfacesCount > 0) {
-				interfaces = new TypeRef[interfacesCount];
-				for (int i = 0; i < interfacesCount; i++)
-					interfaces[i] = analyzer.getTypeRef((String) pool[intPool[in.readUnsignedShort()]]);
-				if (cd != null)
-					cd.implementsInterfaces(interfaces);
-			}
-
-			int fieldsCount = in.readUnsignedShort();
-			for (int i = 0; i < fieldsCount; i++) {
-				int access_flags = in.readUnsignedShort(); // skip access flags
-				int name_index = in.readUnsignedShort();
-				int descriptor_index = in.readUnsignedShort();
-
-				// Java prior to 1.5 used a weird
-				// static variable to hold the com.X.class
-				// result construct. If it did not find it
-				// it would create a variable class$com$X
-				// that would be used to hold the class
-				// object gotten with Class.forName ...
-				// Stupidly, they did not actively use the
-				// class name for the field type, so bnd
-				// would not see a reference. We detect
-				// this case and add an artificial descriptor
-				String name = pool[name_index].toString(); // name_index
-				if (name.startsWith("class$")) {
-					crawl = true;
-				}
-				if (cd != null)
-					cd.field(last = new FieldDef(access_flags, name, pool[descriptor_index].toString()));
-				descriptors.add(Integer.valueOf(descriptor_index));
-				doAttributes(in, ElementType.FIELD, false);
-			}
-
-			//
-			// Check if we have to crawl the code to find
-			// the ldc(_w) <string constant> invokestatic Class.forName
-			// if so, calculate the method ref index so we
-			// can do this efficiently
-			//
-			if (crawl) {
-				forName = findMethodReference("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
-				class$ = findMethodReference(className.getBinary(), "class$", "(Ljava/lang/String;)Ljava/lang/Class;");
-			} else if (major == 48) {
-				forName = findMethodReference("java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
-				if (forName > 0) {
-					crawl = true;
-					class$ = findMethodReference(className.getBinary(), "class$",
-							"(Ljava/lang/String;)Ljava/lang/Class;");
-				}
-			}
-
-			// There are some serious changes in the
-			// class file format. So we do not do any crawling
-			// it has also become less important
-			if (major >= JAVA.OpenJDK7.major)
-				crawl = false;
-
-			//
-			// Handle the methods
-			//
-			int methodCount = in.readUnsignedShort();
-			for (int i = 0; i < methodCount; i++) {
-				int access_flags = in.readUnsignedShort();
-				int name_index = in.readUnsignedShort();
-				int descriptor_index = in.readUnsignedShort();
-				descriptors.add(Integer.valueOf(descriptor_index));
-				String name = pool[name_index].toString();
-				String descriptor = pool[descriptor_index].toString();
-				if (cd != null) {
-					MethodDef mdef = new MethodDef(access_flags, name, descriptor);
-					last = mdef;
-					cd.method(mdef);
-				}
-
-				if ("<init>".equals(name)) {
-					doAttributes(in, ElementType.CONSTRUCTOR, crawl);
-				} else {
-					doAttributes(in, ElementType.METHOD, crawl);
-				}
-			}
-			if (cd != null)
-				cd.memberEnd();
-
-			doAttributes(in, ElementType.TYPE, false);
-
-			//
-			// Now iterate over all classes we found and
-			// parse those as well. We skip duplicates
-			//
-
-			for (int n : classes) {
-				String descr = (String) pool[n];
-
-				TypeRef clazz = analyzer.getTypeRef(descr);
-				referTo(clazz);
-			}
-
-			//
-			// Parse all the descriptors we found
-			//
-
-			for (Iterator<Integer> e = descriptors.iterator(); e.hasNext();) {
-				Integer index = e.next();
-				String prototype = (String) pool[index.intValue()];
-				if (prototype != null)
-					parseDescriptor(prototype);
-				else
-					System.err.println("Unrecognized descriptor: " + index);
-			}
-			Set<TypeRef> xref = this.xref;
-			reset();
-			return xref;
-		}
-		finally {
-			if (cd != null)
-				cd.classEnd();
-		}
-	}
-
-	private void constantFloat(DataInputStream in, int poolIndex) throws IOException {
-		if (cd != null)
-			pool[poolIndex] = in.readFloat(); // ALU
-		else
-			in.skipBytes(4);
-	}
-
-	private void constantInteger(DataInputStream in, int poolIndex) throws IOException {
-		intPool[poolIndex] = in.readInt();
-		if (cd != null)
-			pool[poolIndex] = intPool[poolIndex];
-	}
-
-	protected void pool(@SuppressWarnings("unused") Object[] pool, @SuppressWarnings("unused") int[] intPool) {}
-
-	/**
-	 * @param in
-	 * @param poolIndex
-	 * @param tag
-	 * @throws IOException
-	 */
-	protected void nameAndType(DataInputStream in, int poolIndex, byte tag) throws IOException {
-		int name_index = in.readUnsignedShort();
-		int descriptor_index = in.readUnsignedShort();
-		descriptors.add(Integer.valueOf(descriptor_index));
-		pool[poolIndex] = new Assoc(tag, name_index, descriptor_index);
-	}
-
-	/**
-	 * @param in
-	 * @param poolIndex
-	 * @param tag
-	 * @throws IOException
-	 */
-	private void methodRef(DataInputStream in, int poolIndex) throws IOException {
-		int class_index = in.readUnsignedShort();
-		int name_and_type_index = in.readUnsignedShort();
-		pool[poolIndex] = new Assoc((byte) 10, class_index, name_and_type_index);
-	}
-
-	/**
-	 * @param in
-	 * @param poolIndex
-	 * @throws IOException
-	 */
-	private void constantString(DataInputStream in, int poolIndex) throws IOException {
-		int string_index = in.readUnsignedShort();
-		intPool[poolIndex] = string_index;
-	}
-
-	/**
-	 * @param in
-	 * @param poolIndex
-	 * @throws IOException
-	 */
-	protected void constantClass(DataInputStream in, int poolIndex) throws IOException {
-		int class_index = in.readUnsignedShort();
-		classes.add(Integer.valueOf(class_index));
-		intPool[poolIndex] = class_index;
-		ClassConstant c = new ClassConstant(class_index);
-		pool[poolIndex] = c;
-	}
-
-	/**
-	 * @param in
-	 * @throws IOException
-	 */
-	protected void constantDouble(DataInputStream in, int poolIndex) throws IOException {
-		if (cd != null)
-			pool[poolIndex] = in.readDouble();
-		else
-			in.skipBytes(8);
-	}
-
-	/**
-	 * @param in
-	 * @throws IOException
-	 */
-	protected void constantLong(DataInputStream in, int poolIndex) throws IOException {
-		if (cd != null) {
-			pool[poolIndex] = in.readLong();
-		} else
-			in.skipBytes(8);
-	}
-
-	/**
-	 * @param in
-	 * @param poolIndex
-	 * @throws IOException
-	 */
-	protected void constantUtf8(DataInputStream in, int poolIndex) throws IOException {
-		// CONSTANT_Utf8
-
-		String name = in.readUTF();
-		pool[poolIndex] = name;
-	}
-
-	/**
-	 * Find a method reference in the pool that points to the given class,
-	 * methodname and descriptor.
-	 * 
-	 * @param clazz
-	 * @param methodname
-	 * @param descriptor
-	 * @return index in constant pool
-	 */
-	private int findMethodReference(String clazz, String methodname, String descriptor) {
-		for (int i = 1; i < pool.length; i++) {
-			if (pool[i] instanceof Assoc) {
-				Assoc methodref = (Assoc) pool[i];
-				if (methodref.tag == 10) {
-					// Method ref
-					int class_index = methodref.a;
-					int class_name_index = intPool[class_index];
-					if (clazz.equals(pool[class_name_index])) {
-						int name_and_type_index = methodref.b;
-						Assoc name_and_type = (Assoc) pool[name_and_type_index];
-						if (name_and_type.tag == 12) {
-							// Name and Type
-							int name_index = name_and_type.a;
-							int type_index = name_and_type.b;
-							if (methodname.equals(pool[name_index])) {
-								if (descriptor.equals(pool[type_index])) {
-									return i;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * Called for each attribute in the class, field, or method.
-	 * 
-	 * @param in
-	 *            The stream
-	 * @throws Exception
-	 */
-	private void doAttributes(DataInputStream in, ElementType member, boolean crawl) throws Exception {
-		int attributesCount = in.readUnsignedShort();
-		for (int j = 0; j < attributesCount; j++) {
-			// skip name CONSTANT_Utf8 pointer
-			doAttribute(in, member, crawl);
-		}
-	}
-
-	/**
-	 * Process a single attribute, if not recognized, skip it.
-	 * 
-	 * @param in
-	 *            the data stream
-	 * @throws Exception
-	 */
-	private void doAttribute(DataInputStream in, ElementType member, boolean crawl) throws Exception {
-		int attribute_name_index = in.readUnsignedShort();
-		String attributeName = (String) pool[attribute_name_index];
-		long attribute_length = in.readInt();
-		attribute_length &= 0xFFFFFFFF;
-		if ("Deprecated".equals(attributeName)) {
-			if (cd != null)
-				cd.deprecated();
-		} else if ("RuntimeVisibleAnnotations".equals(attributeName))
-			doAnnotations(in, member, RetentionPolicy.RUNTIME);
-		else if ("RuntimeVisibleParameterAnnotations".equals(attributeName))
-			doParameterAnnotations(in, member, RetentionPolicy.RUNTIME);
-		else if ("RuntimeInvisibleAnnotations".equals(attributeName))
-			doAnnotations(in, member, RetentionPolicy.CLASS);
-		else if ("RuntimeInvisibleParameterAnnotations".equals(attributeName))
-			doParameterAnnotations(in, member, RetentionPolicy.CLASS);
-		else if ("InnerClasses".equals(attributeName))
-			doInnerClasses(in);
-		else if ("EnclosingMethod".equals(attributeName))
-			doEnclosingMethod(in);
-		else if ("SourceFile".equals(attributeName))
-			doSourceFile(in);
-		else if ("Code".equals(attributeName) && crawl)
-			doCode(in);
-		else if ("Signature".equals(attributeName))
-			doSignature(in, member);
-		else if ("ConstantValue".equals(attributeName))
-			doConstantValue(in);
-		else {
-			if (attribute_length > 0x7FFFFFFF) {
-				throw new IllegalArgumentException("Attribute > 2Gb");
-			}
-			in.skipBytes((int) attribute_length);
-		}
-	}
-
-	/**
-	 * <pre>
-	 * EnclosingMethod_attribute { 
-	 * 	u2 attribute_name_index; 
-	 * 	u4 attribute_length; 
-	 * 	u2 class_index
-	 * 	u2 method_index;
-	 * }
-	 * </pre>
-	 * 
-	 * @param in
-	 * @throws IOException
-	 */
-	private void doEnclosingMethod(DataInputStream in) throws IOException {
-		int cIndex = in.readShort();
-		int mIndex = in.readShort();
-
-		if (cd != null) {
-			int nameIndex = intPool[cIndex];
-			TypeRef cName = analyzer.getTypeRef((String) pool[nameIndex]);
-
-			String mName = null;
-			String mDescriptor = null;
-
-			if (mIndex != 0) {
-				Assoc nameAndType = (Assoc) pool[mIndex];
-				mName = (String) pool[nameAndType.a];
-				mDescriptor = (String) pool[nameAndType.b];
-			}
-			cd.enclosingMethod(cName, mName, mDescriptor);
-		}
-	}
-
-	/**
-	 * <pre>
-	 * InnerClasses_attribute {
-	 * 	u2 attribute_name_index; 
-	 * 	u4 attribute_length; 
-	 * 	u2 number_of_classes; {	
-	 * 		u2 inner_class_info_index;
-	 * 		u2 outer_class_info_index; 
-	 * 		u2 inner_name_index; 
-	 * 		u2 inner_class_access_flags;
-	 * 	} classes[number_of_classes];
-	 * }
-	 * </pre>
-	 * 
-	 * @param in
-	 * @throws Exception
-	 */
-	private void doInnerClasses(DataInputStream in) throws Exception {
-		int number_of_classes = in.readShort();
-		for (int i = 0; i < number_of_classes; i++) {
-			int inner_class_info_index = in.readShort();
-			int outer_class_info_index = in.readShort();
-			int inner_name_index = in.readShort();
-			int inner_class_access_flags = in.readShort() & 0xFFFF;
-
-			if (cd != null) {
-				TypeRef innerClass = null;
-				TypeRef outerClass = null;
-				String innerName = null;
-
-				if (inner_class_info_index != 0) {
-					int nameIndex = intPool[inner_class_info_index];
-					innerClass = analyzer.getTypeRef((String) pool[nameIndex]);
-				}
-
-				if (outer_class_info_index != 0) {
-					int nameIndex = intPool[outer_class_info_index];
-					outerClass = analyzer.getTypeRef((String) pool[nameIndex]);
-				}
-
-				if (inner_name_index != 0)
-					innerName = (String) pool[inner_name_index];
-
-				cd.innerClass(innerClass, outerClass, innerName, inner_class_access_flags);
-			}
-		}
-	}
-
-	/**
-	 * Handle a signature
-	 * 
-	 * <pre>
-	 * Signature_attribute { 
-	 *     u2 attribute_name_index; 
-	 *     u4 attribute_length; 
-	 *     u2 signature_index; 
-	 *     }
-	 * </pre>
-	 * 
-	 * @param member
-	 */
-
-	void doSignature(DataInputStream in, ElementType member) throws IOException {
-		int signature_index = in.readUnsignedShort();
-		String signature = (String) pool[signature_index];
-
-		// s.println("Signature " + signature );
-
-		// // The type signature is kind of weird,
-		// // lets skip it for now. Seems to be some kind of
-		// // type variable name index but it does not seem to
-		// // conform to the language specification.
-		// if (member != ElementType.TYPE)
-		parseDescriptor(signature);
-
-		if (last != null)
-			last.signature = signature;
-
-		if (cd != null)
-			cd.signature(signature);
-	}
-
-	/**
-	 * Handle a constant value call the data collector with it
-	 */
-	void doConstantValue(DataInputStream in) throws IOException {
-		int constantValue_index = in.readUnsignedShort();
-		if (cd == null)
-			return;
-
-		Object object = pool[constantValue_index];
-		if (object == null)
-			object = pool[intPool[constantValue_index]];
-
-		last.constant = object;
-		cd.constant(object);
-	}
-
-	/**
-	 * <pre>
-	 * Code_attribute {
-	 * 		u2 attribute_name_index;
-	 * 		u4 attribute_length;
-	 * 		u2 max_stack;
-	 * 		u2 max_locals;
-	 * 		u4 code_length;
-	 * 		u1 code[code_length];
-	 * 		u2 exception_table_length;
-	 * 		{    	u2 start_pc;
-	 * 		      	u2 end_pc;
-	 * 		      	u2  handler_pc;
-	 * 		      	u2  catch_type;
-	 * 		}	exception_table[exception_table_length];
-	 * 		u2 attributes_count;
-	 * 		attribute_info attributes[attributes_count];
-	 * 	}
-	 * </pre>
-	 * 
-	 * @param in
-	 * @param pool
-	 * @throws Exception
-	 */
-	private void doCode(DataInputStream in) throws Exception {
-		/* int max_stack = */in.readUnsignedShort();
-		/* int max_locals = */in.readUnsignedShort();
-		int code_length = in.readInt();
-		byte code[] = new byte[code_length];
-		in.readFully(code);
-		crawl(code);
-		int exception_table_length = in.readUnsignedShort();
-		in.skipBytes(exception_table_length * 8);
-		doAttributes(in, ElementType.METHOD, false);
-	}
-
-	/**
-	 * We must find Class.forName references ...
-	 * 
-	 * @param code
-	 */
-	protected void crawl(byte[] code) {
-		ByteBuffer bb = ByteBuffer.wrap(code);
-		bb.order(ByteOrder.BIG_ENDIAN);
-		int lastReference = -1;
-
-		while (bb.remaining() > 0) {
-			int instruction = 0xFF & bb.get();
-			switch (instruction) {
-				case OpCodes.ldc :
-					lastReference = 0xFF & bb.get();
-					break;
-
-				case OpCodes.ldc_w :
-					lastReference = 0xFFFF & bb.getShort();
-					break;
-
-				case OpCodes.invokespecial : {
-					int mref = 0xFFFF & bb.getShort();
-					if (cd != null)
-						getMethodDef(0, mref);
-					break;
-				}
-
-				case OpCodes.invokevirtual : {
-					int mref = 0xFFFF & bb.getShort();
-					if (cd != null)
-						getMethodDef(0, mref);
-					break;
-				}
-
-				case OpCodes.invokeinterface : {
-					int mref = 0xFFFF & bb.getShort();
-					if (cd != null)
-						getMethodDef(0, mref);
-					break;
-				}
-
-				case OpCodes.invokestatic : {
-					int methodref = 0xFFFF & bb.getShort();
-					if (cd != null)
-						getMethodDef(0, methodref);
-
-					if ((methodref == forName || methodref == class$) && lastReference != -1
-							&& pool[intPool[lastReference]] instanceof String) {
-						String fqn = (String) pool[intPool[lastReference]];
-						if (!fqn.equals("class") && fqn.indexOf('.') > 0) {
-							TypeRef clazz = analyzer.getTypeRefFromFQN(fqn);
-							referTo(clazz);
-						}
-						lastReference = -1;
-					}
-					break;
-				}
-
-				case OpCodes.tableswitch :
-					// Skip to place divisible by 4
-					while ((bb.position() & 0x3) != 0)
-						bb.get();
-					/* int deflt = */
-					bb.getInt();
-					int low = bb.getInt();
-					int high = bb.getInt();
-					try {
-						bb.position(bb.position() + (high - low + 1) * 4);
-					}
-					catch (Exception e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-					}
-					lastReference = -1;
-					break;
-
-				case OpCodes.lookupswitch :
-					// Skip to place divisible by 4
-					while ((bb.position() & 0x3) != 0)
-						bb.get();
-					/* deflt = */
-					bb.getInt();
-					int npairs = bb.getInt();
-					bb.position(bb.position() + npairs * 8);
-					lastReference = -1;
-					break;
-
-				default :
-					lastReference = -1;
-					bb.position(bb.position() + OpCodes.OFFSETS[instruction]);
-			}
-		}
-	}
-
-	private void doSourceFile(DataInputStream in) throws IOException {
-		int sourcefile_index = in.readUnsignedShort();
-		this.sourceFile = pool[sourcefile_index].toString();
-	}
-
-	private void doParameterAnnotations(DataInputStream in, ElementType member, RetentionPolicy policy)
-			throws IOException {
-		int num_parameters = in.readUnsignedByte();
-		for (int p = 0; p < num_parameters; p++) {
-			if (cd != null)
-				cd.parameter(p);
-			doAnnotations(in, member, policy);
-		}
-	}
-
-	private void doAnnotations(DataInputStream in, ElementType member, RetentionPolicy policy) throws IOException {
-		int num_annotations = in.readUnsignedShort(); // # of annotations
-		for (int a = 0; a < num_annotations; a++) {
-			if (cd == null)
-				doAnnotation(in, member, policy, false);
-			else {
-				Annotation annotion = doAnnotation(in, member, policy, true);
-				cd.annotation(annotion);
-			}
-		}
-	}
-
-	private Annotation doAnnotation(DataInputStream in, ElementType member, RetentionPolicy policy, boolean collect)
-			throws IOException {
-		int type_index = in.readUnsignedShort();
-		if (annotations == null)
-			annotations = new HashSet<TypeRef>();
-
-		TypeRef tr = analyzer.getTypeRef(pool[type_index].toString());
-		annotations.add(tr);
-
-		if (policy == RetentionPolicy.RUNTIME) {
-			descriptors.add(Integer.valueOf(type_index));
-			hasRuntimeAnnotations = true;
-		} else {
-			hasClassAnnotations = true;
-		}
-		TypeRef name = analyzer.getTypeRef((String) pool[type_index]);
-		int num_element_value_pairs = in.readUnsignedShort();
-		Map<String,Object> elements = null;
-		for (int v = 0; v < num_element_value_pairs; v++) {
-			int element_name_index = in.readUnsignedShort();
-			String element = (String) pool[element_name_index];
-			Object value = doElementValue(in, member, policy, collect);
-			if (collect) {
-				if (elements == null)
-					elements = new LinkedHashMap<String,Object>();
-				elements.put(element, value);
-			}
-		}
-		if (collect)
-			return new Annotation(name, elements, member, policy);
-		return null;
-	}
-
-	private Object doElementValue(DataInputStream in, ElementType member, RetentionPolicy policy, boolean collect)
-			throws IOException {
-		char tag = (char) in.readUnsignedByte();
-		switch (tag) {
-			case 'B' : // Byte
-			case 'C' : // Character
-			case 'I' : // Integer
-			case 'S' : // Short
-				int const_value_index = in.readUnsignedShort();
-				return intPool[const_value_index];
-
-			case 'D' : // Double
-			case 'F' : // Float
-			case 's' : // String
-			case 'J' : // Long
-				const_value_index = in.readUnsignedShort();
-				return pool[const_value_index];
-
-			case 'Z' : // Boolean
-				const_value_index = in.readUnsignedShort();
-				return pool[const_value_index] == null || pool[const_value_index].equals(0) ? false : true;
-
-			case 'e' : // enum constant
-				int type_name_index = in.readUnsignedShort();
-				if (policy == RetentionPolicy.RUNTIME)
-					descriptors.add(Integer.valueOf(type_name_index));
-				int const_name_index = in.readUnsignedShort();
-				return pool[const_name_index];
-
-			case 'c' : // Class
-				int class_info_index = in.readUnsignedShort();
-				if (policy == RetentionPolicy.RUNTIME)
-					descriptors.add(Integer.valueOf(class_info_index));
-				return pool[class_info_index];
-
-			case '@' : // Annotation type
-				return doAnnotation(in, member, policy, collect);
-
-			case '[' : // Array
-				int num_values = in.readUnsignedShort();
-				Object[] result = new Object[num_values];
-				for (int i = 0; i < num_values; i++) {
-					result[i] = doElementValue(in, member, policy, collect);
-				}
-				return result;
-
-			default :
-				throw new IllegalArgumentException("Invalid value for Annotation ElementValue tag " + tag);
-		}
-	}
-
-	/**
-	 * Add a new package reference.
-	 * 
-	 * @param packageRef
-	 *            A '.' delimited package name
-	 */
-	void referTo(TypeRef typeRef) {
-		if (xref != null)
-			xref.add(typeRef);
-		if (typeRef.isPrimitive())
-			return;
-
-		PackageRef packageRef = typeRef.getPackageRef();
-		if (packageRef.isPrimitivePackage())
-			return;
-
-		imports.add(packageRef);
-	}
-
-	/**
-	 * This method parses a descriptor and adds the package of the descriptor to
-	 * the referenced packages. The syntax of the descriptor is:
-	 * 
-	 * <pre>
-	 *   descriptor ::= ( '(' reference * ')' )? reference
-	 *   reference  ::= 'L' classname ( '&lt;' references '&gt;' )? ';' | 'B' | 'Z' | ... | '+' | '-' | '['
-	 * </pre>
-	 * 
-	 * This methods uses heavy recursion to parse the descriptor and a roving
-	 * pointer to limit the creation of string objects.
-	 * 
-	 * @param descriptor
-	 *            The to be parsed descriptor
-	 * @param rover
-	 *            The pointer to start at
-	 */
-	public void parseDescriptor(String descriptor) {
-		// Some descriptors are weird, they start with a generic
-		// declaration that contains ':', not sure what they mean ...
-		int rover = 0;
-		if (descriptor.charAt(0) == '<') {
-			rover = parseFormalTypeParameters(descriptor, rover);
-		}
-
-		if (descriptor.charAt(rover) == '(') {
-			rover = parseReferences(descriptor, rover + 1, ')');
-			rover++;
-		}
-		parseReferences(descriptor, rover, (char) 0);
-	}
-
-	/**
-	 * Parse a sequence of references. A sequence ends with a given character or
-	 * when the string ends.
-	 * 
-	 * @param descriptor
-	 *            The whole descriptor.
-	 * @param rover
-	 *            The index in the descriptor
-	 * @param delimiter
-	 *            The end character or 0
-	 * @return the last index processed, one character after the delimeter
-	 */
-	int parseReferences(String descriptor, int rover, char delimiter) {
-		int r = rover;
-		while (r < descriptor.length() && descriptor.charAt(r) != delimiter) {
-			r = parseReference(descriptor, r);
-		}
-		return r;
-	}
-
-	/**
-	 * Parse a single reference. This can be a single character or an object
-	 * reference when it starts with 'L'.
-	 * 
-	 * @param descriptor
-	 *            The descriptor
-	 * @param rover
-	 *            The place to start
-	 * @return The return index after the reference
-	 */
-	int parseReference(String descriptor, int rover) {
-		int r = rover;
-		char c = descriptor.charAt(r);
-		while (c == '[')
-			c = descriptor.charAt(++r);
-
-		if (c == '<') {
-			r = parseReferences(descriptor, r + 1, '>');
-		} else if (c == 'T') {
-			// Type variable name
-			r++;
-			while (descriptor.charAt(r) != ';')
-				r++;
-		} else if (c == 'L') {
-			StringBuilder sb = new StringBuilder();
-			r++;
-			while ((c = descriptor.charAt(r)) != ';') {
-				if (c == '<') {
-					r = parseReferences(descriptor, r + 1, '>');
-				} else
-					sb.append(c);
-				r++;
-			}
-			TypeRef ref = analyzer.getTypeRef(sb.toString());
-			if (cd != null)
-				cd.addReference(ref);
-
-			referTo(ref);
-		} else {
-			if ("+-*BCDFIJSZV".indexOf(c) < 0)
-				;// System.err.println("Should not skip: " + c);
-		}
-
-		// this skips a lot of characters
-		// [, *, +, -, B, etc.
-
-		return r + 1;
-	}
-
-	/**
-	 * FormalTypeParameters
-	 * 
-	 * @param descriptor
-	 * @param index
-	 * @return
-	 */
-	private int parseFormalTypeParameters(String descriptor, int index) {
-		index++;
-		while (descriptor.charAt(index) != '>') {
-			// Skip IDENTIFIER
-			index = descriptor.indexOf(':', index) + 1;
-			if (index == 0)
-				throw new IllegalArgumentException("Expected IDENTIFIER: " + descriptor);
-
-			// ClassBound? InterfaceBounds
-
-			char c = descriptor.charAt(index);
-
-			// Class Bound?
-			if (c == 'L' || c == 'T') {
-				index = parseReference(descriptor, index); // class reference
-				c = descriptor.charAt(index);
-			}
-
-			// Interface Bounds
-			while (c == ':') {
-				index++;
-				index = parseReference(descriptor, index);
-				c = descriptor.charAt(index);
-			} // for each interface
-
-		} // for each formal parameter
-		return index + 1; // skip >
-	}
-
-	public Set<PackageRef> getReferred() {
-		return imports;
-	}
-
-	public String getAbsolutePath() {
-		return path;
-	}
-
-	public String getSourceFile() {
-		return sourceFile;
-	}
-
-	/**
-	 * .class construct for different compilers sun 1.1 Detect static variable
-	 * class$com$acme$MyClass 1.2 " 1.3 " 1.4 " 1.5 ldc_w (class) 1.6 " eclipse
-	 * 1.1 class$0, ldc (string), invokestatic Class.forName 1.2 " 1.3 " 1.5 ldc
-	 * (class) 1.6 " 1.5 and later is not an issue, sun pre 1.5 is easy to
-	 * detect the static variable that decodes the class name. For eclipse, the
-	 * class$0 gives away we have a reference encoded in a string.
-	 * compilerversions/compilerversions.jar contains test versions of all
-	 * versions/compilers.
-	 */
-
-	public void reset() {
-		pool = null;
-		intPool = null;
-		xref = null;
-		classes = null;
-		descriptors = null;
-	}
-
-	public boolean is(QUERY query, Instruction instr, Analyzer analyzer) throws Exception {
-		switch (query) {
-			case ANY :
-				return true;
-
-			case NAMED :
-				if (instr.matches(getClassName().getDottedOnly()))
-					return !instr.isNegated();
-				return false;
-
-			case VERSION :
-				String v = major + "." + minor;
-				if (instr.matches(v))
-					return !instr.isNegated();
-				return false;
-
-			case IMPLEMENTS :
-				for (int i = 0; interfaces != null && i < interfaces.length; i++) {
-					if (instr.matches(interfaces[i].getDottedOnly()))
-						return !instr.isNegated();
-				}
-				break;
-
-			case EXTENDS :
-				if (zuper == null)
-					return false;
-
-				if (instr.matches(zuper.getDottedOnly()))
-					return !instr.isNegated();
-				break;
-
-			case PUBLIC :
-				return Modifier.isPublic(accessx);
-
-			case CONCRETE :
-				return !Modifier.isAbstract(accessx);
-
-			case ANNOTATED :
-				if (annotations == null)
-					return false;
-
-				for (TypeRef annotation : annotations) {
-					if (instr.matches(annotation.getFQN()))
-						return !instr.isNegated();
-				}
-
-				return false;
-
-			case RUNTIMEANNOTATIONS :
-				return hasClassAnnotations;
-			case CLASSANNOTATIONS :
-				return hasClassAnnotations;
-
-			case ABSTRACT :
-				return Modifier.isAbstract(accessx);
-
-			case IMPORTS :
-				for (PackageRef imp : imports) {
-					if (instr.matches(imp.getFQN()))
-						return !instr.isNegated();
-				}
-		}
-
-		if (zuper == null)
-			return false;
-
-		Clazz clazz = analyzer.findClass(zuper);
-		if (clazz == null)
-			return false;
-
-		return clazz.is(query, instr, analyzer);
-	}
-
-	public String toString() {
-		return className.getFQN();
-	}
-
-	/**
-	 * Called when crawling the byte code and a method reference is found
-	 */
-	void getMethodDef(int access, int methodRefPoolIndex) {
-		if (methodRefPoolIndex == 0)
-			return;
-
-		Object o = pool[methodRefPoolIndex];
-		if (o != null && o instanceof Assoc) {
-			Assoc assoc = (Assoc) o;
-			if (assoc.tag == 10) {
-				int string_index = intPool[assoc.a];
-				TypeRef className = analyzer.getTypeRef((String) pool[string_index]);
-				int name_and_type_index = assoc.b;
-				Assoc name_and_type = (Assoc) pool[name_and_type_index];
-				if (name_and_type.tag == 12) {
-					// Name and Type
-					int name_index = name_and_type.a;
-					int type_index = name_and_type.b;
-					String method = (String) pool[name_index];
-					String descriptor = (String) pool[type_index];
-					cd.referenceMethod(access, className, method, descriptor);
-				} else
-					throw new IllegalArgumentException(
-							"Invalid class file (or parsing is wrong), assoc is not type + name (12)");
-			} else
-				throw new IllegalArgumentException(
-						"Invalid class file (or parsing is wrong), Assoc is not method ref! (10)");
-		} else
-			throw new IllegalArgumentException("Invalid class file (or parsing is wrong), Not an assoc at a method ref");
-	}
-
-	public boolean isPublic() {
-		return Modifier.isPublic(accessx);
-	}
-
-	public boolean isProtected() {
-		return Modifier.isProtected(accessx);
-	}
-
-	public boolean isEnum() {
-		return zuper != null && zuper.getBinary().equals("java/lang/Enum");
-	}
-
-	public JAVA getFormat() {
-		return JAVA.format(major);
-
-	}
-
-	public static String objectDescriptorToFQN(String string) {
-		if (string.startsWith("L") && string.endsWith(";"))
-			return string.substring(1, string.length() - 1).replace('/', '.');
-
-		switch (string.charAt(0)) {
-			case 'V' :
-				return "void";
-			case 'B' :
-				return "byte";
-			case 'C' :
-				return "char";
-			case 'I' :
-				return "int";
-			case 'S' :
-				return "short";
-			case 'D' :
-				return "double";
-			case 'F' :
-				return "float";
-			case 'J' :
-				return "long";
-			case 'Z' :
-				return "boolean";
-			case '[' : // Array
-				return objectDescriptorToFQN(string.substring(1)) + "[]";
-		}
-		throw new IllegalArgumentException("Invalid type character in descriptor " + string);
-	}
-
-	public static String unCamel(String id) {
-		StringBuilder out = new StringBuilder();
-		for (int i = 0; i < id.length(); i++) {
-			char c = id.charAt(i);
-			if (c == '_' || c == '$' || c == '.') {
-				if (out.length() > 0 && !Character.isWhitespace(out.charAt(out.length() - 1)))
-					out.append(' ');
-				continue;
-			}
-
-			int n = i;
-			while (n < id.length() && Character.isUpperCase(id.charAt(n))) {
-				n++;
-			}
-			if (n == i)
-				out.append(id.charAt(i));
-			else {
-				boolean tolower = (n - i) == 1;
-				if (i > 0 && !Character.isWhitespace(out.charAt(out.length() - 1)))
-					out.append(' ');
-
-				for (; i < n;) {
-					if (tolower)
-						out.append(Character.toLowerCase(id.charAt(i)));
-					else
-						out.append(id.charAt(i));
-					i++;
-				}
-				i--;
-			}
-		}
-		if (id.startsWith("."))
-			out.append(" *");
-		out.replace(0, 1, Character.toUpperCase(out.charAt(0)) + "");
-		return out.toString();
-	}
-
-	public boolean isInterface() {
-		return Modifier.isInterface(accessx);
-	}
-
-	public boolean isAbstract() {
-		return Modifier.isAbstract(accessx);
-	}
-
-	public int getAccess() {
-		if (innerAccess == -1)
-			return accessx;
-		return innerAccess;
-	}
-
-	public TypeRef getClassName() {
-		return className;
-	}
-
-	/**
-	 * To provide an enclosing instance
-	 * 
-	 * @param access
-	 * @param name
-	 * @param descriptor
-	 * @return
-	 */
-	public MethodDef getMethodDef(int access, String name, String descriptor) {
-		return new MethodDef(access, name, descriptor);
-	}
-
-	public TypeRef getSuper() {
-		return zuper;
-	}
-
-	public String getFQN() {
-		return className.getFQN();
-	}
-
-	public TypeRef[] getInterfaces() {
-		return interfaces;
-	}
-
-	public void setInnerAccess(int access) {
-		innerAccess = access;
-	}
-
-	public boolean isFinal() {
-		return Modifier.isFinal(accessx);
-	}
-
-	public void setDeprecated(boolean b) {
-		deprecated = b;
-	}
-
-	public boolean isDeprecated() {
-		return deprecated;
-	}
-
-	public boolean isAnnotation() {
-		return (accessx & ACC_ANNOTATION) != 0;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/CombinedResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/CombinedResource.java
deleted file mode 100644
index 3886c48..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/CombinedResource.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.*;
-
-public class CombinedResource extends WriteResource {
-	final List<Resource>	resources		= new ArrayList<Resource>();
-	long					lastModified	= 0;
-
-	@Override
-	public void write(final OutputStream out) throws IOException, Exception {
-		OutputStream unclosable = new FilterOutputStream(out) {
-			public void close() {
-				// Ignore
-			}
-		};
-		for (Resource r : resources) {
-			r.write(unclosable);
-			unclosable.flush();
-		}
-	}
-
-	@Override
-	public long lastModified() {
-		return lastModified;
-	}
-
-	public void addResource(Resource r) {
-		lastModified = Math.max(lastModified, r.lastModified());
-		resources.add(r);
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/CommandResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/CommandResource.java
deleted file mode 100644
index 47ba4ac..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/CommandResource.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-
-import aQute.libg.command.*;
-
-public class CommandResource extends WriteResource {
-	final long		lastModified;
-	final Builder	domain;
-	final String	command;
-
-	public CommandResource(String command, Builder domain, long lastModified) {
-		this.lastModified = lastModified;
-		this.domain = domain;
-		this.command = command;
-	}
-
-	@Override
-	public void write(OutputStream out) throws IOException, Exception {
-		StringBuilder errors = new StringBuilder();
-		StringBuilder stdout = new StringBuilder();
-		try {
-			domain.trace("executing command %s", command);
-			Command cmd = new Command("sh");
-			cmd.inherit();
-			String oldpath = cmd.var("PATH");
-
-			String path = domain.getProperty("-PATH");
-			if (path != null) {
-				path = path.replaceAll("\\s*,\\s*", File.pathSeparator);
-				path = path.replaceAll("\\$\\{@\\}", oldpath);
-				cmd.var("PATH", path);
-				domain.trace("PATH: %s", path);
-			}
-			OutputStreamWriter osw = new OutputStreamWriter(out, "UTF-8");
-			int result = cmd.execute(command, stdout, errors);
-			osw.append(stdout);
-			osw.flush();
-			if (result != 0) {
-				domain.error("executing command failed %s %s", command, stdout + "\n" + errors);
-			}
-		}
-		catch (Exception e) {
-			domain.error("executing command failed %s %s", command, e.getMessage());
-		}
-	}
-
-	@Override
-	public long lastModified() {
-		return lastModified;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java b/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
deleted file mode 100644
index 767e516..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
+++ /dev/null
@@ -1,311 +0,0 @@
-package aQute.lib.osgi;
-
-import java.nio.charset.*;
-import java.util.*;
-import java.util.regex.*;
-
-public interface Constants {
-	/*
-	 * Defined in OSGi
-	 */
-	/**
-	 * @syntax Bundle-ActivationPolicy ::= policy ( ’;’ directive )* policy ::=
-	 *         ’lazy’
-	 */
-	String							BND_ADDXMLTOTEST							= "Bnd-AddXMLToTest";
-	String							BUNDLE_ACTIVATIONPOLICY						= "Bundle-ActivationPolicy";
-	String							BUNDLE_ACTIVATOR							= "Bundle-Activator";
-	String							BUNDLE_BLUEPRINT							= "Bundle-Copyright";
-	String							BUNDLE_CATEGORY								= "Bundle-Category";
-	String							BUNDLE_CLASSPATH							= "Bundle-ClassPath";
-	String							BUNDLE_CONTACTADDRESS						= "Bundle-ContactAddress";
-	String							BUNDLE_COPYRIGHT							= "Bundle-Copyright";
-	String							BUNDLE_DESCRIPTION							= "Bundle-Description";
-	String							BUNDLE_DOCURL								= "Bundle-DocURL";
-	String							BUNDLE_ICON									= "Bundle-Icon";
-	String							BUNDLE_LICENSE								= "Bundle-License";
-	String							BUNDLE_LOCALIZATION							= "Bundle-Localization";
-	String							BUNDLE_MANIFESTVERSION						= "Bundle-ManifestVersion";
-	String							BUNDLE_NAME									= "Bundle-Name";
-	String							BUNDLE_NATIVECODE							= "Bundle-NativeCode";
-	String							BUNDLE_REQUIREDEXECUTIONENVIRONMENT			= "Bundle-RequiredExecutionEnvironment";
-	String							BUNDLE_SYMBOLICNAME							= "Bundle-SymbolicName";
-	String							BUNDLE_UPDATELOCATION						= "Bundle-UpdateLocation";
-	String							BUNDLE_VENDOR								= "Bundle-Vendor";
-	String							BUNDLE_VERSION								= "Bundle-Version";
-	String							DYNAMICIMPORT_PACKAGE						= "DynamicImport-Package";
-	String							EXPORT_PACKAGE								= "Export-Package";
-	String							EXPORT_SERVICE								= "Export-Service";
-	String							FRAGMENT_HOST								= "Fragment-Host";
-	String							IMPORT_PACKAGE								= "Import-Package";
-	String							IMPORT_SERVICE								= "Import-Service";
-	String							PROVIDE_CAPABILITY							= "Provide-Capability";
-	String							REQUIRE_BUNDLE								= "Require-Bundle";
-	String							REQUIRE_CAPABILITY							= "Require-Capability";
-	String							SERVICE_COMPONENT							= "Service-Component";
-
-	String							PRIVATE_PACKAGE								= "Private-Package";
-	String							IGNORE_PACKAGE								= "Ignore-Package";
-	String							INCLUDE_RESOURCE							= "Include-Resource";
-	String							CONDITIONAL_PACKAGE							= "Conditional-Package";
-	String							BND_LASTMODIFIED							= "Bnd-LastModified";
-	String							CREATED_BY									= "Created-By";
-	String							TOOL										= "Tool";
-	String							TESTCASES									= "Test-Cases";
-        /**
-         * @deprecated Use {@link Constants#TESTCASES}.
-         */
-        @Deprecated
-        String                                                  TESTSUITES                                                                      = "Test-Suites";
-	String							SIGNATURE_TEST								= "-signaturetest";
-
-	String							headers[]									= {
-			BUNDLE_ACTIVATOR, BUNDLE_CONTACTADDRESS, BUNDLE_COPYRIGHT, BUNDLE_DESCRIPTION, BUNDLE_DOCURL,
-			BUNDLE_LOCALIZATION, BUNDLE_NATIVECODE, BUNDLE_VENDOR, BUNDLE_VERSION, BUNDLE_LICENSE, BUNDLE_CLASSPATH,
-			SERVICE_COMPONENT, EXPORT_PACKAGE, IMPORT_PACKAGE, BUNDLE_LOCALIZATION, BUNDLE_MANIFESTVERSION,
-			BUNDLE_NAME, BUNDLE_NATIVECODE, BUNDLE_REQUIREDEXECUTIONENVIRONMENT, BUNDLE_SYMBOLICNAME, BUNDLE_VERSION,
-			FRAGMENT_HOST, PRIVATE_PACKAGE, IGNORE_PACKAGE, INCLUDE_RESOURCE, REQUIRE_BUNDLE, IMPORT_SERVICE,
-			EXPORT_SERVICE, CONDITIONAL_PACKAGE, BND_LASTMODIFIED, TESTCASES, SIGNATURE_TEST, REQUIRE_CAPABILITY,
-			PROVIDE_CAPABILITY
-																				};
-
-	String							BUILDPATH									= "-buildpath";
-	String							BUILDPACKAGES								= "-buildpackages";
-	String							BUMPPOLICY									= "-bumppolicy";
-	String							CONDUIT										= "-conduit";
-	String							COMPILER_SOURCE								= "-source";
-	String							COMPILER_TARGET								= "-target";
-	String							DEPENDSON									= "-dependson";
-	String							DEPLOY										= "-deploy";
-	String							DEPLOYREPO									= "-deployrepo";
-	String							DIGESTS										= "-digests";
-	String							DSANNOTATIONS								= "-dsannotations";
-	String							DONOTCOPY									= "-donotcopy";
-	String							DEBUG										= "-debug";
-	String							EXPORT_CONTENTS								= "-exportcontents";
-	String							FAIL_OK										= "-failok";
-	String							INCLUDE										= "-include";
-	String							INCLUDERESOURCE								= "-includeresource";
-	String							MAKE										= "-make";
-	String							METATYPE									= "-metatype";
-	String							MANIFEST									= "-manifest";
-	String							SAVEMANIFEST								= "-savemanifest";
-	String							NAMESECTION									= "-namesection";
-	String							NODEFAULTVERSION							= "-nodefaultversion";
-	String							NOEXTRAHEADERS								= "-noextraheaders";
-	String							NOMANIFEST									= "-nomanifest";
-	String							NOUSES										= "-nouses";
-	String							NOBUNDLES									= "-nobundles";
-	String							PEDANTIC									= "-pedantic";
-	String							PLUGIN										= "-plugin";
-	String							PLUGINPATH									= "-pluginpath";
-	String							POM											= "-pom";
-	String							RELEASEREPO									= "-releaserepo";
-	String							REMOVEHEADERS								= "-removeheaders";
-	String							RESOURCEONLY								= "-resourceonly";
-	String							SOURCES										= "-sources";
-	String							SOURCEPATH									= "-sourcepath";
-	String							SUB											= "-sub";
-	String							RUNPROPERTIES								= "-runproperties";
-	String							RUNSYSTEMPACKAGES							= "-runsystempackages";
-	String							RUNBUNDLES									= "-runbundles";
-	String							RUNREPOS									= "-runrepos";
-
-	/**
-	 * @deprecated This is for support of the legacy OBR requirement format, use {@link #RUNREQUIRES} for new format.
-	 */
-	@Deprecated
-	String							RUNREQUIRE									= "-runrequire";
-	
-	String							RUNREQUIRES									= "-runrequires";
-	
-	String							RUNEE										= "-runee";
-	String							RUNPATH										= "-runpath";
-	String							RUNSTORAGE									= "-runstorage";
-	String							RUNBUILDS									= "-runbuilds";
-	String							RUNPATH_MAIN_DIRECTIVE						= "main:";
-	String							RUNPATH_LAUNCHER_DIRECTIVE					= "launcher:";
-	String							RUNVM										= "-runvm";
-	String							RUNTRACE									= "-runtrace";
-	String							RUNFRAMEWORK								= "-runframework";
-	String							RUNTIMEOUT									= "-runtimeout";
-	String							SNAPSHOT									= "-snapshot";
-	String							RUNFRAMEWORK_SERVICES						= "services";
-	String							RUNFRAMEWORK_NONE							= "none";
-	String							REPORTNEWER									= "-reportnewer";
-	String							SIGN										= "-sign";
-	String							TESTPACKAGES								= "-testpackages";
-	String							TESTREPORT									= "-testreport";
-	String							TESTPATH									= "-testpath";
-	String							TESTCONTINUOUS								= "-testcontinuous";
-	String							UNDERTEST									= "-undertest";
-	String							VERBOSE										= "-verbose";
-	String							PROVIDER_POLICY								= "-provider-policy";
-	String							CONSUMER_POLICY								= "-consumer-policy";
-	String							WAB											= "-wab";
-	String							WABLIB										= "-wablib";
-	String							REQUIRE_BND									= "-require-bnd";
-
-	// Deprecated
-	String							CLASSPATH									= "-classpath";
-	String							OUTPUT										= "-output";
-
-	String							options[]									= {
-			BUILDPATH, BUMPPOLICY, CONDUIT, CLASSPATH, CONSUMER_POLICY, DEPENDSON, DONOTCOPY, EXPORT_CONTENTS, FAIL_OK,
-			INCLUDE, INCLUDERESOURCE, MAKE, MANIFEST, NOEXTRAHEADERS, NOUSES, NOBUNDLES, PEDANTIC, PLUGIN, POM,
-			PROVIDER_POLICY, REMOVEHEADERS, RESOURCEONLY, SOURCES, SOURCEPATH, SOURCES, SOURCEPATH, SUB, RUNBUNDLES,
-			RUNPATH, RUNSYSTEMPACKAGES, RUNPROPERTIES, REPORTNEWER, UNDERTEST, TESTPATH, TESTPACKAGES, TESTREPORT,
-			VERBOSE, NOMANIFEST, DEPLOYREPO, RELEASEREPO, SAVEMANIFEST, RUNVM, WAB, WABLIB, RUNFRAMEWORK, RUNTRACE,
-			TESTCONTINUOUS, SNAPSHOT, NAMESECTION, DIGESTS, DSANNOTATIONS
-																				};
-
-	// Ignore bundle specific headers. These bundles do not make
-	// a lot of sense to inherit
-	String[]						BUNDLE_SPECIFIC_HEADERS						= new String[] {
-			INCLUDE_RESOURCE, BUNDLE_ACTIVATOR, BUNDLE_CLASSPATH, BUNDLE_NAME, BUNDLE_NATIVECODE, BUNDLE_SYMBOLICNAME,
-			IMPORT_PACKAGE, EXPORT_PACKAGE, DYNAMICIMPORT_PACKAGE, FRAGMENT_HOST, REQUIRE_BUNDLE, PRIVATE_PACKAGE,
-			EXPORT_CONTENTS, TESTCASES, NOMANIFEST, SIGNATURE_TEST, WAB, WABLIB, REQUIRE_CAPABILITY,
-			PROVIDE_CAPABILITY, DSANNOTATIONS, SERVICE_COMPONENT
-																				};
-
-	char							DUPLICATE_MARKER							= '~';
-	String							SPECIFICATION_VERSION						= "specification-version";
-	String							SPLIT_PACKAGE_DIRECTIVE						= "-split-package:";
-	String							IMPORT_DIRECTIVE							= "-import:";
-	String							NO_IMPORT_DIRECTIVE							= "-noimport:";
-	String							REMOVE_ATTRIBUTE_DIRECTIVE					= "-remove-attribute:";
-	String							LIB_DIRECTIVE								= "lib:";
-	String							NOANNOTATIONS								= "-noannotations";
-	String							COMMAND_DIRECTIVE							= "command:";
-	String							USES_DIRECTIVE								= "uses:";
-	String							MANDATORY_DIRECTIVE							= "mandatory:";
-	String							INCLUDE_DIRECTIVE							= "include:";
-	String							PROVIDE_DIRECTIVE							= "provide:";
-	String							EXCLUDE_DIRECTIVE							= "exclude:";
-	String							PRESENCE_DIRECTIVE							= "presence:";
-	String							PRIVATE_DIRECTIVE							= "private:";
-	String							SINGLETON_DIRECTIVE							= "singleton:";
-	String							EXTENSION_DIRECTIVE							= "extension:";
-	String							VISIBILITY_DIRECTIVE						= "visibility:";
-	String							FRAGMENT_ATTACHMENT_DIRECTIVE				= "fragment-attachment:";
-	String							RESOLUTION_DIRECTIVE						= "resolution:";
-	String							PATH_DIRECTIVE								= "path:";
-	String							SIZE_ATTRIBUTE								= "size";
-	String							LINK_ATTRIBUTE								= "link";
-	String							NAME_ATTRIBUTE								= "name";
-	String							DESCRIPTION_ATTRIBUTE						= "description";
-	String							OSNAME_ATTRIBUTE							= "osname";
-	String							OSVERSION_ATTRIBUTE							= "osversion";
-	String							PROCESSOR_ATTRIBUTE							= "processor";
-	String							LANGUAGE_ATTRIBUTE							= "language";
-	String							SELECTION_FILTER_ATTRIBUTE					= "selection-filter";
-	String							BLUEPRINT_WAIT_FOR_DEPENDENCIES_ATTRIBUTE	= "blueprint.wait-for-dependencies";
-	String							BLUEPRINT_TIMEOUT_ATTRIBUTE					= "blueprint.timeout";
-	String							VERSION_ATTRIBUTE							= "version";
-	String							BUNDLE_SYMBOLIC_NAME_ATTRIBUTE				= "bundle-symbolic-name";
-	String							BUNDLE_VERSION_ATTRIBUTE					= "bundle-version";
-	String							FROM_DIRECTIVE								= "from:";
-
-	String							KEYSTORE_LOCATION_DIRECTIVE					= "keystore:";
-	String							KEYSTORE_PROVIDER_DIRECTIVE					= "provider:";
-	String							KEYSTORE_PASSWORD_DIRECTIVE					= "password:";
-	String							SIGN_PASSWORD_DIRECTIVE						= "sign-password:";
-
-	String							NONE										= "none";
-
-	String							directives[]								= {
-			SPLIT_PACKAGE_DIRECTIVE, NO_IMPORT_DIRECTIVE, IMPORT_DIRECTIVE, RESOLUTION_DIRECTIVE, INCLUDE_DIRECTIVE,
-			USES_DIRECTIVE, EXCLUDE_DIRECTIVE, KEYSTORE_LOCATION_DIRECTIVE, KEYSTORE_PROVIDER_DIRECTIVE,
-			KEYSTORE_PASSWORD_DIRECTIVE, SIGN_PASSWORD_DIRECTIVE, COMMAND_DIRECTIVE, NOANNOTATIONS, LIB_DIRECTIVE,
-			RUNPATH_LAUNCHER_DIRECTIVE, FROM_DIRECTIVE, PRIVATE_DIRECTIVE
-
-																				// TODO
-																				};
-
-	String							USES_USES									= "<<USES>>";
-	String							CURRENT_USES								= "@uses";
-	String							IMPORT_REFERENCE							= "reference";
-	String							IMPORT_PRIVATE								= "private";
-	String[]						importDirectives							= {
-			IMPORT_REFERENCE, IMPORT_PRIVATE
-																				};
-
-	static final Pattern			VALID_PROPERTY_TYPES						= Pattern
-																						.compile("(String|Long|Double|Float|Integer|Byte|Character|Boolean|Short)");
-
-	String							DEFAULT_BND_EXTENSION						= ".bnd";
-	String							DEFAULT_JAR_EXTENSION						= ".jar";
-	String							DEFAULT_BAR_EXTENSION						= ".bar";
-	String							DEFAULT_BNDRUN_EXTENSION					= ".bndrun";
-	String[]						METAPACKAGES								= {
-			"META-INF", "OSGI-INF", "OSGI-OPT"
-																				};
-
-	String							CURRENT_VERSION								= "@";
-	String							CURRENT_PACKAGE								= "@package";
-
-	String							BUILDFILES									= "buildfiles";
-
-	String							EMPTY_HEADER								= "<<EMPTY>>";
-
-	String							EMBEDDED_REPO								= "/embedded-repo.jar";
-	String							LAUNCHER_PLUGIN								= "Launcher-Plugin";
-	String							TESTER_PLUGIN								= "Tester-Plugin";
-
-	String							DEFAULT_LAUNCHER_BSN						= "biz.aQute.launcher";
-	String							DEFAULT_TESTER_BSN							= "biz.aQute.junit";
-
-	String							DEFAULT_DO_NOT_COPY							= "CVS|\\.svn|\\.git|\\.DS_Store";
-
-	Charset							DEFAULT_CHARSET								= Charset.forName("UTF8");
-	String							VERSION_FILTER								= "version";
-	String							PROVIDER_TYPE_DIRECTIVE						= "x-provider-type:";
-	/**
-	 * Component constants
-	 */
-	public final static String		NAMESPACE_STEM								= "http://www.osgi.org/xmlns/scr";
-	public final static String		JIDENTIFIER									= "<<identifier>>";
-	public final static String		COMPONENT_NAME								= "name:";
-	public final static String		COMPONENT_FACTORY							= "factory:";
-	public final static String		COMPONENT_SERVICEFACTORY					= "servicefactory:";
-	public final static String		COMPONENT_IMMEDIATE							= "immediate:";
-	public final static String		COMPONENT_ENABLED							= "enabled:";
-	public final static String		COMPONENT_DYNAMIC							= "dynamic:";
-	public final static String		COMPONENT_MULTIPLE							= "multiple:";
-	public final static String		COMPONENT_PROVIDE							= "provide:";
-	public final static String		COMPONENT_OPTIONAL							= "optional:";
-	public final static String		COMPONENT_PROPERTIES						= "properties:";
-	public final static String		COMPONENT_IMPLEMENTATION					= "implementation:";
-	public final static String		COMPONENT_DESIGNATE							= "designate:";
-	public final static String		COMPONENT_DESIGNATEFACTORY					= "designateFactory:";
-	public final static String		COMPONENT_DESCRIPTORS						= ".descriptors:";
-
-	// v1.1.0
-	public final static String		COMPONENT_VERSION							= "version:";
-	public final static String		COMPONENT_CONFIGURATION_POLICY				= "configuration-policy:";
-	public final static String		COMPONENT_MODIFIED							= "modified:";
-	public final static String		COMPONENT_ACTIVATE							= "activate:";
-	public final static String		COMPONENT_DEACTIVATE						= "deactivate:";
-
-	final static Map<String,String>	EMPTY										= Collections.emptyMap();
-
-	public final static String[]	componentDirectives							= new String[] {
-			COMPONENT_FACTORY, COMPONENT_IMMEDIATE, COMPONENT_ENABLED, COMPONENT_DYNAMIC, COMPONENT_MULTIPLE,
-			COMPONENT_PROVIDE, COMPONENT_OPTIONAL, COMPONENT_PROPERTIES, COMPONENT_IMPLEMENTATION,
-			COMPONENT_SERVICEFACTORY, COMPONENT_VERSION, COMPONENT_CONFIGURATION_POLICY, COMPONENT_MODIFIED,
-			COMPONENT_ACTIVATE, COMPONENT_DEACTIVATE, COMPONENT_NAME, COMPONENT_DESCRIPTORS, COMPONENT_DESIGNATE,
-			COMPONENT_DESIGNATEFACTORY
-																				};
-
-	public final static Set<String>	SET_COMPONENT_DIRECTIVES					= new HashSet<String>(
-																						Arrays.asList(componentDirectives));
-
-	public final static Set<String>	SET_COMPONENT_DIRECTIVES_1_1				= //
-																				new HashSet<String>(Arrays.asList(
-																						COMPONENT_VERSION,
-																						COMPONENT_CONFIGURATION_POLICY,
-																						COMPONENT_MODIFIED,
-																						COMPONENT_ACTIVATE,
-																						COMPONENT_DEACTIVATE));
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Descriptors.java b/bundleplugin/src/main/java/aQute/lib/osgi/Descriptors.java
deleted file mode 100644
index f9c6a31..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Descriptors.java
+++ /dev/null
@@ -1,557 +0,0 @@
-package aQute.lib.osgi;
-
-import java.util.*;
-
-import aQute.libg.generics.*;
-
-public class Descriptors {
-	Map<String,TypeRef>		typeRefCache		= Create.map();
-	Map<String,Descriptor>	descriptorCache		= Create.map();
-	Map<String,PackageRef>	packageCache		= Create.map();
-
-	// MUST BE BEFORE PRIMITIVES, THEY USE THE DEFAULT PACKAGE!!
-	final static PackageRef	DEFAULT_PACKAGE		= new PackageRef();
-	final static PackageRef	PRIMITIVE_PACKAGE	= new PackageRef();
-
-	final static TypeRef	VOID				= new ConcreteRef("V", "void", PRIMITIVE_PACKAGE);
-	final static TypeRef	BOOLEAN				= new ConcreteRef("Z", "boolean", PRIMITIVE_PACKAGE);
-	final static TypeRef	BYTE				= new ConcreteRef("B", "byte", PRIMITIVE_PACKAGE);
-	final static TypeRef	CHAR				= new ConcreteRef("C", "char", PRIMITIVE_PACKAGE);
-	final static TypeRef	SHORT				= new ConcreteRef("S", "short", PRIMITIVE_PACKAGE);
-	final static TypeRef	INTEGER				= new ConcreteRef("I", "int", PRIMITIVE_PACKAGE);
-	final static TypeRef	LONG				= new ConcreteRef("J", "long", PRIMITIVE_PACKAGE);
-	final static TypeRef	DOUBLE				= new ConcreteRef("D", "double", PRIMITIVE_PACKAGE);
-	final static TypeRef	FLOAT				= new ConcreteRef("F", "float", PRIMITIVE_PACKAGE);
-
-	{
-		packageCache.put("", DEFAULT_PACKAGE);
-	}
-
-	public interface TypeRef extends Comparable<TypeRef> {
-		String getBinary();
-
-		String getFQN();
-
-		String getPath();
-
-		boolean isPrimitive();
-
-		TypeRef getComponentTypeRef();
-
-		TypeRef getClassRef();
-
-		PackageRef getPackageRef();
-
-		String getShortName();
-
-		boolean isJava();
-
-		boolean isObject();
-
-		String getSourcePath();
-
-		String getDottedOnly();
-
-	}
-
-	public static class PackageRef implements Comparable<PackageRef> {
-		final String	binaryName;
-		final String	fqn;
-		final boolean	java;
-
-		PackageRef(String binaryName) {
-			this.binaryName = fqnToBinary(binaryName);
-			this.fqn = binaryToFQN(binaryName);
-			this.java = this.fqn.startsWith("java."); // &&
-														// !this.fqn.equals("java.sql)"
-
-			// For some reason I excluded java.sql but the classloader will
-			// delegate anyway. So lost the understanding why I did it??
-		}
-
-		PackageRef() {
-			this.binaryName = "";
-			this.fqn = ".";
-			this.java = false;
-		}
-
-		public PackageRef getDuplicate() {
-			return new PackageRef(binaryName + Constants.DUPLICATE_MARKER);
-		}
-
-		public String getFQN() {
-			return fqn;
-		}
-
-		public String getBinary() {
-			return binaryName;
-		}
-
-		public String getPath() {
-			return binaryName;
-		}
-
-		public boolean isJava() {
-			return java;
-		}
-
-		public String toString() {
-			return fqn;
-		}
-
-		boolean isDefaultPackage() {
-			return this.fqn.equals(".");
-		}
-
-		boolean isPrimitivePackage() {
-			return this == PRIMITIVE_PACKAGE;
-		}
-
-		public int compareTo(PackageRef other) {
-			return fqn.compareTo(other.fqn);
-		}
-
-		public boolean equals(Object o) {
-			assert o instanceof PackageRef;
-			return o == this;
-		}
-
-		public int hashCode() {
-			return super.hashCode();
-		}
-
-		/**
-		 * Decide if the package is a metadata package.
-		 * 
-		 * @param pack
-		 * @return
-		 */
-		public boolean isMetaData() {
-			if (isDefaultPackage())
-				return true;
-
-			for (int i = 0; i < Constants.METAPACKAGES.length; i++) {
-				if (fqn.startsWith(Constants.METAPACKAGES[i]))
-					return true;
-			}
-			return false;
-		}
-
-	}
-
-	// We "intern" the
-	private static class ConcreteRef implements TypeRef {
-		final String		binaryName;
-		final String		fqn;
-		final boolean		primitive;
-		final PackageRef	packageRef;
-
-		ConcreteRef(PackageRef packageRef, String binaryName) {
-			if (packageRef.getFQN().length() < 2)
-				System.err.println("in default pack? " + binaryName);
-			this.binaryName = binaryName;
-			this.fqn = binaryToFQN(binaryName);
-			this.primitive = false;
-			this.packageRef = packageRef;
-		}
-
-		ConcreteRef(String binaryName, String fqn, PackageRef pref) {
-			this.binaryName = binaryName;
-			this.fqn = fqn;
-			this.primitive = true;
-			this.packageRef = pref;
-		}
-
-		public String getBinary() {
-			return binaryName;
-		}
-
-		public String getPath() {
-			return binaryName + ".class";
-		}
-
-		public String getSourcePath() {
-			return binaryName + ".java";
-		}
-
-		public String getFQN() {
-			return fqn;
-		}
-
-		public String getDottedOnly() {
-			return fqn.replace('$', '.');
-		}
-
-		public boolean isPrimitive() {
-			return primitive;
-		}
-
-		public TypeRef getComponentTypeRef() {
-			return null;
-		}
-
-		public TypeRef getClassRef() {
-			return this;
-		}
-
-		public PackageRef getPackageRef() {
-			return packageRef;
-		}
-
-		public String getShortName() {
-			int n = binaryName.lastIndexOf('/');
-			return binaryName.substring(n + 1);
-		}
-
-		public boolean isJava() {
-			return packageRef.isJava();
-		}
-
-		public String toString() {
-			return fqn;
-		}
-
-		public boolean isObject() {
-			return fqn.equals("java.lang.Object");
-		}
-
-		public boolean equals(Object other) {
-			assert other instanceof TypeRef;
-			return this == other;
-		}
-
-		public int compareTo(TypeRef other) {
-			if (this == other)
-				return 0;
-			return fqn.compareTo(other.getFQN());
-		}
-
-		@Override
-		public int hashCode() {
-			return super.hashCode();
-		}
-
-	}
-
-	private static class ArrayRef implements TypeRef {
-		final TypeRef	component;
-
-		ArrayRef(TypeRef component) {
-			this.component = component;
-		}
-
-		public String getBinary() {
-			return "[" + component.getBinary();
-		}
-
-		public String getFQN() {
-			return component.getFQN() + "[]";
-		}
-
-		public String getPath() {
-			return component.getPath();
-		}
-
-		public String getSourcePath() {
-			return component.getSourcePath();
-		}
-
-		public boolean isPrimitive() {
-			return false;
-		}
-
-		public TypeRef getComponentTypeRef() {
-			return component;
-		}
-
-		public TypeRef getClassRef() {
-			return component.getClassRef();
-		}
-
-		public boolean equals(Object other) {
-			if (other == null || other.getClass() != getClass())
-				return false;
-
-			return component.equals(((ArrayRef) other).component);
-		}
-
-		public PackageRef getPackageRef() {
-			return component.getPackageRef();
-		}
-
-		public String getShortName() {
-			return component.getShortName() + "[]";
-		}
-
-		public boolean isJava() {
-			return component.isJava();
-		}
-
-		public String toString() {
-			return component.toString() + "[]";
-		}
-
-		public boolean isObject() {
-			return false;
-		}
-
-		public String getDottedOnly() {
-			return component.getDottedOnly();
-		}
-
-		public int compareTo(TypeRef other) {
-			if (this == other)
-				return 0;
-
-			return getFQN().compareTo(other.getFQN());
-		}
-
-		@Override
-		public int hashCode() {
-			return super.hashCode();
-		}
-
-	}
-
-	public TypeRef getTypeRef(String binaryClassName) {
-		assert !binaryClassName.endsWith(".class");
-
-		TypeRef ref = typeRefCache.get(binaryClassName);
-		if (ref != null)
-			return ref;
-
-		if (binaryClassName.startsWith("[")) {
-			ref = getTypeRef(binaryClassName.substring(1));
-			ref = new ArrayRef(ref);
-		} else {
-			if (binaryClassName.length() >= 1) {
-				switch (binaryClassName.charAt(0)) {
-					case 'V' :
-						return VOID;
-					case 'B' :
-						return BYTE;
-					case 'C' :
-						return CHAR;
-					case 'I' :
-						return INTEGER;
-					case 'S' :
-						return SHORT;
-					case 'D' :
-						return DOUBLE;
-					case 'F' :
-						return FLOAT;
-					case 'J' :
-						return LONG;
-					case 'Z' :
-						return BOOLEAN;
-					case 'L' :
-						binaryClassName = binaryClassName.substring(1, binaryClassName.length() - 1);
-						break;
-				}
-				// falls trough for other 1 letter class names
-			}
-			ref = typeRefCache.get(binaryClassName);
-			if (ref != null)
-				return ref;
-
-			PackageRef pref;
-			int n = binaryClassName.lastIndexOf('/');
-			if (n < 0)
-				pref = DEFAULT_PACKAGE;
-			else
-				pref = getPackageRef(binaryClassName.substring(0, n));
-
-			ref = new ConcreteRef(pref, binaryClassName);
-		}
-
-		typeRefCache.put(binaryClassName, ref);
-		return ref;
-	}
-
-	public PackageRef getPackageRef(String binaryPackName) {
-		if (binaryPackName.indexOf('.') >= 0) {
-			binaryPackName = binaryPackName.replace('.', '/');
-		}
-		PackageRef ref = packageCache.get(binaryPackName);
-		if (ref != null)
-			return ref;
-
-		ref = new PackageRef(binaryPackName);
-		packageCache.put(binaryPackName, ref);
-		return ref;
-	}
-
-	public Descriptor getDescriptor(String descriptor) {
-		Descriptor d = descriptorCache.get(descriptor);
-		if (d != null)
-			return d;
-		d = new Descriptor(descriptor);
-		descriptorCache.put(descriptor, d);
-		return d;
-	}
-
-	public class Descriptor {
-		final TypeRef	type;
-		final TypeRef[]	prototype;
-		final String	descriptor;
-
-		Descriptor(String descriptor) {
-			this.descriptor = descriptor;
-			int index = 0;
-			List<TypeRef> types = Create.list();
-			if (descriptor.charAt(index) == '(') {
-				index++;
-				while (descriptor.charAt(index) != ')') {
-					index = parse(types, descriptor, index);
-				}
-				index++; // skip )
-				prototype = types.toArray(new TypeRef[types.size()]);
-				types.clear();
-			} else
-				prototype = null;
-
-			index = parse(types, descriptor, index);
-			type = types.get(0);
-		}
-
-		int parse(List<TypeRef> types, String descriptor, int index) {
-			char c;
-			StringBuilder sb = new StringBuilder();
-			while ((c = descriptor.charAt(index++)) == '[') {
-				sb.append('[');
-			}
-
-			switch (c) {
-				case 'L' :
-					while ((c = descriptor.charAt(index++)) != ';') {
-						// TODO
-						sb.append(c);
-					}
-					break;
-
-				case 'V' :
-				case 'B' :
-				case 'C' :
-				case 'I' :
-				case 'S' :
-				case 'D' :
-				case 'F' :
-				case 'J' :
-				case 'Z' :
-					sb.append(c);
-					break;
-
-				default :
-					throw new IllegalArgumentException("Invalid type in descriptor: " + c + " from " + descriptor + "["
-							+ index + "]");
-			}
-			types.add(getTypeRef(sb.toString()));
-			return index;
-		}
-
-		public TypeRef getType() {
-			return type;
-		}
-
-		public TypeRef[] getPrototype() {
-			return prototype;
-		}
-
-		public boolean equals(Object other) {
-			if (other == null || other.getClass() != getClass())
-				return false;
-
-			return Arrays.equals(prototype, ((Descriptor) other).prototype) && type == ((Descriptor) other).type;
-		}
-
-		public int hashCode() {
-			return prototype == null ? type.hashCode() : type.hashCode() ^ Arrays.hashCode(prototype);
-		}
-
-		public String toString() {
-			return descriptor;
-		}
-	}
-
-	/**
-	 * Return the short name of a FQN
-	 */
-
-	public static String getShortName(String fqn) {
-		assert fqn.indexOf('/') < 0;
-
-		int n = fqn.lastIndexOf('.');
-		if (n >= 0) {
-			return fqn.substring(n + 1);
-		}
-		return fqn;
-	}
-
-	public static String binaryToFQN(String binary) {
-		StringBuilder sb = new StringBuilder();
-		for (int i = 0, l = binary.length(); i < l; i++) {
-			char c = binary.charAt(i);
-
-			if (c == '/')
-				sb.append('.');
-			else
-				sb.append(c);
-		}
-		String result = sb.toString();
-		assert result.length() > 0;
-		return result;
-	}
-
-	public static String fqnToBinary(String binary) {
-		return binary.replace('.', '/');
-	}
-
-	public static String getPackage(String binaryNameOrFqn) {
-		int n = binaryNameOrFqn.lastIndexOf('/');
-		if (n >= 0)
-			return binaryNameOrFqn.substring(0, n).replace('/', '.');
-
-		n = binaryNameOrFqn.lastIndexOf(".");
-		if (n >= 0)
-			return binaryNameOrFqn.substring(0, n);
-
-		return ".";
-	}
-
-	public static String fqnToPath(String s) {
-		return fqnToBinary(s) + ".class";
-	}
-
-	public TypeRef getTypeRefFromFQN(String fqn) {
-		if (fqn.equals("boolean"))
-			return BOOLEAN;
-
-		if (fqn.equals("byte"))
-			return BOOLEAN;
-
-		if (fqn.equals("char"))
-			return CHAR;
-
-		if (fqn.equals("short"))
-			return SHORT;
-
-		if (fqn.equals("int"))
-			return INTEGER;
-
-		if (fqn.equals("long"))
-			return LONG;
-
-		if (fqn.equals("float"))
-			return FLOAT;
-
-		if (fqn.equals("double"))
-			return DOUBLE;
-
-		return getTypeRef(fqnToBinary(fqn));
-	}
-
-	public TypeRef getTypeRefFromPath(String path) {
-		assert path.endsWith(".class");
-		return getTypeRef(path.substring(0, path.length() - 6));
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Domain.java b/bundleplugin/src/main/java/aQute/lib/osgi/Domain.java
deleted file mode 100644
index e705534..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Domain.java
+++ /dev/null
@@ -1,265 +0,0 @@
-package aQute.lib.osgi;
-
-import static aQute.lib.osgi.Constants.*;
-
-import java.util.*;
-import java.util.jar.*;
-
-import aQute.libg.header.*;
-import aQute.libg.version.*;
-import aQute.service.reporter.*;
-
-/**
- * This class abstracts domains that have properties holding OSGi meta data. It
- * provides access to the keys, the set method and the get method. It then
- * provides convenient methods to access these properties via semantic methods.
- */
-public abstract class Domain implements Iterable<String> {
-
-	public abstract String get(String key);
-
-	public String get(String key, String deflt) {
-		String result = get(key);
-		if (result != null)
-			return result;
-		return deflt;
-	}
-
-	public abstract void set(String key, String value);
-
-	public abstract Iterator<String> iterator();
-
-	public static Domain domain(final Manifest manifest) {
-		Attributes attrs = manifest.getMainAttributes();
-		return domain(attrs);
-	}
-
-	public static Domain domain(final Attributes attrs) {
-		return new Domain() {
-
-			@Override
-			public String get(String key) {
-				return attrs.getValue(key);
-			}
-
-			@Override
-			public void set(String key, String value) {
-				attrs.putValue(key, value);
-			}
-
-			@Override
-			public Iterator<String> iterator() {
-				final Iterator<Object> it = attrs.keySet().iterator();
-
-				return new Iterator<String>() {
-
-					public boolean hasNext() {
-						return it.hasNext();
-					}
-
-					public String next() {
-						return it.next().toString();
-					}
-
-					public void remove() {
-						it.remove();
-					}
-				};
-			}
-		};
-	}
-
-	public static Domain domain(final Processor processor) {
-		return new Domain() {
-
-			@Override
-			public String get(String key) {
-				return processor.getProperty(key);
-			}
-
-			@Override
-			public String get(String key, String deflt) {
-				return processor.getProperty(key, deflt);
-			}
-
-			@Override
-			public void set(String key, String value) {
-				processor.setProperty(key, value);
-			}
-
-			@Override
-			public Iterator<String> iterator() {
-				final Iterator<String> it = processor.getPropertyKeys(true).iterator();
-
-				return new Iterator<String>() {
-					String	current;
-
-					public boolean hasNext() {
-						return it.hasNext();
-					}
-
-					public String next() {
-						return current = it.next().toString();
-					}
-
-					public void remove() {
-						processor.getProperties().remove(current);
-					}
-				};
-			}
-		};
-	}
-
-	public static Domain domain(final Map<String,String> map) {
-		return new Domain() {
-
-			@Override
-			public String get(String key) {
-				return map.get(key);
-			}
-
-			@Override
-			public void set(String key, String value) {
-				map.put(key, value);
-			}
-
-			@Override
-			public Iterator<String> iterator() {
-				return map.keySet().iterator();
-			}
-		};
-	}
-
-	public Parameters getParameters(String key, Reporter reporter) {
-		return new Parameters(get(key), reporter);
-	}
-
-	public Parameters getParameters(String key) {
-		return new Parameters(get(key));
-	}
-
-	public Parameters getParameters(String key, String deflt) {
-		return new Parameters(get(key, deflt));
-	}
-
-	public Parameters getParameters(String key, String deflt, Reporter reporter) {
-		return new Parameters(get(key, deflt), reporter);
-	}
-
-	public Parameters getImportPackage() {
-		return getParameters(IMPORT_PACKAGE);
-	}
-
-	public Parameters getExportPackage() {
-		return getParameters(EXPORT_PACKAGE);
-	}
-
-	public Parameters getBundleClassPath() {
-		return getParameters(BUNDLE_CLASSPATH);
-	}
-
-	public Parameters getPrivatePackage() {
-		return getParameters(PRIVATE_PACKAGE);
-	}
-
-	public Parameters getIncludeResource() {
-		Parameters ic = getParameters(INCLUDE_RESOURCE);
-		ic.putAll(getParameters(INCLUDERESOURCE));
-		return ic;
-	}
-
-	public Parameters getDynamicImportPackage() {
-		return getParameters(DYNAMICIMPORT_PACKAGE);
-	}
-
-	public Parameters getExportContents() {
-		return getParameters(EXPORT_CONTENTS);
-	}
-
-	public String getBundleActivator() {
-		return get(BUNDLE_ACTIVATOR);
-	}
-
-	public void setPrivatePackage(String s) {
-		if (s != null)
-			set(PRIVATE_PACKAGE, s);
-	}
-
-	public void setIncludeResource(String s) {
-		if (s != null)
-			set(INCLUDE_RESOURCE, s);
-	}
-
-	public void setBundleActivator(String s) {
-		if (s != null)
-			set(BUNDLE_ACTIVATOR, s);
-	}
-
-	public void setExportPackage(String s) {
-		if (s != null)
-			set(EXPORT_PACKAGE, s);
-	}
-
-	public void setImportPackage(String s) {
-		if (s != null)
-			set(IMPORT_PACKAGE, s);
-	}
-
-	public void setBundleClasspath(String s) {
-		if (s != null)
-			set(BUNDLE_CLASSPATH, s);
-	}
-
-	public Parameters getBundleClasspath() {
-		return getParameters(BUNDLE_CLASSPATH);
-	}
-
-	public void setBundleRequiredExecutionEnvironment(String s) {
-		if (s != null)
-			set(BUNDLE_REQUIREDEXECUTIONENVIRONMENT, s);
-	}
-
-	public Parameters getBundleRequiredExecutionEnvironment() {
-		return getParameters(BUNDLE_REQUIREDEXECUTIONENVIRONMENT);
-	}
-
-	public void setSources(boolean b) {
-		if (b)
-			set(SOURCES, "true");
-		else
-			set(SOURCES, "false");
-	}
-
-	public boolean isSources() {
-		return Processor.isTrue(get(SOURCES));
-	}
-
-	public String getBundleSymbolicName() {
-		return get(BUNDLE_SYMBOLICNAME);
-	}
-
-	public void setBundleSymbolicName(String s) {
-		set(BUNDLE_SYMBOLICNAME, s);
-	}
-
-	public String getBundleVersion() {
-		return get(BUNDLE_VERSION);
-	}
-
-	public void setBundleVersion(String version) {
-		Version v = new Version(version);
-		set(BUNDLE_VERSION, v.toString());
-	}
-
-	public void setBundleVersion(Version version) {
-		set(BUNDLE_VERSION, version.toString());
-	}
-
-	public void setFailOk(boolean b) {
-		set(FAIL_OK, b + "");
-	}
-
-	public boolean isFailOk() {
-		return Processor.isTrue(get(FAIL_OK));
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/EmbeddedResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/EmbeddedResource.java
deleted file mode 100755
index 3aff084..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/EmbeddedResource.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.zip.*;
-
-import aQute.lib.io.*;
-
-public class EmbeddedResource implements Resource {
-	byte	data[];
-	long	lastModified;
-	String	extra;
-
-	public EmbeddedResource(byte data[], long lastModified) {
-		this.data = data;
-		this.lastModified = lastModified;
-	}
-
-	public InputStream openInputStream() throws FileNotFoundException {
-		return new ByteArrayInputStream(data);
-	}
-
-	public void write(OutputStream out) throws IOException {
-		out.write(data);
-	}
-
-	public String toString() {
-		return ":" + data.length + ":";
-	}
-
-	public static void build(Jar jar, InputStream in, long lastModified) throws IOException {
-		ZipInputStream jin = new ZipInputStream(in);
-		ZipEntry entry = jin.getNextEntry();
-		while (entry != null) {
-			if (!entry.isDirectory()) {
-				byte data[] = collect(jin);
-				jar.putResource(entry.getName(), new EmbeddedResource(data, lastModified), true);
-			}
-			entry = jin.getNextEntry();
-		}
-		IO.drain(in);
-		jin.close();
-	}
-
-	/**
-	 * Convenience method to turn an inputstream into a byte array. The method
-	 * uses a recursive algorithm to minimize memory usage.
-	 * 
-	 * @param in
-	 *            stream with data
-	 * @param offset
-	 *            where we are in the stream
-	 * @returns byte array filled with data
-	 */
-	static byte[] collect(InputStream in) throws IOException {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		copy(in, out);
-		return out.toByteArray();
-	}
-
-	static void copy(InputStream in, OutputStream out) throws IOException {
-		int available = in.available();
-		if (available <= 10000)
-			available = 64000;
-		byte[] buffer = new byte[available];
-		int size;
-		while ((size = in.read(buffer)) > 0)
-			out.write(buffer, 0, size);
-	}
-
-	public long lastModified() {
-		return lastModified;
-	}
-
-	public static void build(Jar sub, Resource resource) throws Exception {
-		InputStream in = resource.openInputStream();
-		try {
-			build(sub, in, resource.lastModified());
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}
-		finally {
-			in.close();
-		}
-	}
-
-	public String getExtra() {
-		return extra;
-	}
-
-	public void setExtra(String extra) {
-		this.extra = extra;
-	}
-
-	public long size() {
-		return data.length;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/FileResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/FileResource.java
deleted file mode 100755
index 4d2459d..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/FileResource.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.regex.*;
-
-public class FileResource implements Resource {
-	File	file;
-	String	extra;
-
-	public FileResource(File file) {
-		this.file = file;
-	}
-
-	public InputStream openInputStream() throws FileNotFoundException {
-		return new FileInputStream(file);
-	}
-
-	public static void build(Jar jar, File directory, Pattern doNotCopy) {
-		traverse(jar, directory.getAbsolutePath().length(), directory, doNotCopy);
-	}
-
-	public String toString() {
-		return ":" + file.getName() + ":";
-	}
-
-	public void write(OutputStream out) throws Exception {
-		copy(this, out);
-	}
-
-	static synchronized void copy(Resource resource, OutputStream out) throws Exception {
-		InputStream in = resource.openInputStream();
-		try {
-			byte buffer[] = new byte[20000];
-			int size = in.read(buffer);
-			while (size > 0) {
-				out.write(buffer, 0, size);
-				size = in.read(buffer);
-			}
-		}
-		finally {
-			in.close();
-		}
-	}
-
-	static void traverse(Jar jar, int rootlength, File directory, Pattern doNotCopy) {
-		if (doNotCopy != null && doNotCopy.matcher(directory.getName()).matches())
-			return;
-		jar.updateModified(directory.lastModified(), "Dir change");
-
-		File files[] = directory.listFiles();
-		for (int i = 0; i < files.length; i++) {
-			if (files[i].isDirectory())
-				traverse(jar, rootlength, files[i], doNotCopy);
-			else {
-				String path = files[i].getAbsolutePath().substring(rootlength + 1);
-				if (File.separatorChar != '/')
-					path = path.replace(File.separatorChar, '/');
-				jar.putResource(path, new FileResource(files[i]), true);
-			}
-		}
-	}
-
-	public long lastModified() {
-		return file.lastModified();
-	}
-
-	public String getExtra() {
-		return extra;
-	}
-
-	public void setExtra(String extra) {
-		this.extra = extra;
-	}
-
-	public long size() {
-		return (int) file.length();
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Instruction.java b/bundleplugin/src/main/java/aQute/lib/osgi/Instruction.java
deleted file mode 100755
index bfb80bb..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Instruction.java
+++ /dev/null
@@ -1,184 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.regex.*;
-
-public class Instruction {
-
-	public static class Filter implements FileFilter {
-
-		private Instruction	instruction;
-		private boolean		recursive;
-		private Pattern		doNotCopy;
-
-		public Filter(Instruction instruction, boolean recursive, Pattern doNotCopy) {
-			this.instruction = instruction;
-			this.recursive = recursive;
-			this.doNotCopy = doNotCopy;
-		}
-
-		public Filter(Instruction instruction, boolean recursive) {
-			this(instruction, recursive, Pattern.compile(Constants.DEFAULT_DO_NOT_COPY));
-		}
-
-		public boolean isRecursive() {
-			return recursive;
-		}
-
-		public boolean accept(File pathname) {
-			if (doNotCopy != null && doNotCopy.matcher(pathname.getName()).matches()) {
-				return false;
-			}
-
-			if (pathname.isDirectory() && isRecursive()) {
-				return true;
-			}
-
-			if (instruction == null) {
-				return true;
-			}
-			return !instruction.isNegated() == instruction.matches(pathname.getName());
-		}
-	}
-
-	transient Pattern	pattern;
-	transient boolean	optional;
-
-	final String		input;
-	final String		match;
-	final boolean		negated;
-	final boolean		duplicate;
-	final boolean		literal;
-	final boolean		any;
-
-	public Instruction(String input) {
-		this.input = input;
-
-		String s = Processor.removeDuplicateMarker(input);
-		duplicate = !s.equals(input);
-
-		if (s.startsWith("!")) {
-			negated = true;
-			s = s.substring(1);
-		} else
-			negated = false;
-
-		if (input.equals("*")) {
-			any = true;
-			literal = false;
-			match = null;
-			return;
-		}
-
-		any = false;
-		if (s.startsWith("=")) {
-			match = s.substring(1);
-			literal = true;
-		} else {
-			boolean wildcards = false;
-
-			StringBuilder sb = new StringBuilder();
-			loop: for (int c = 0; c < s.length(); c++) {
-				switch (s.charAt(c)) {
-					case '.' :
-						// If we end in a wildcard .* then we need to
-						// also include the last full package. I.e.
-						// com.foo.* includes com.foo (unlike OSGi)
-						if (c == s.length() - 2 && '*' == s.charAt(c + 1)) {
-							sb.append("(\\..*)?");
-							wildcards = true;
-							break loop;
-						}
-						sb.append("\\.");
-
-						break;
-					case '*' :
-						sb.append(".*");
-						wildcards = true;
-						break;
-					case '$' :
-						sb.append("\\$");
-						break;
-					case '?' :
-						sb.append(".?");
-						wildcards = true;
-						break;
-					case '|' :
-						sb.append('|');
-						wildcards = true;
-						break;
-					default :
-						sb.append(s.charAt(c));
-						break;
-				}
-			}
-
-			if (!wildcards) {
-				literal = true;
-				match = s;
-			} else {
-				literal = false;
-				match = sb.toString();
-			}
-		}
-
-	}
-
-	public boolean matches(String value) {
-		if (any)
-			return true;
-
-		if (literal)
-			return match.equals(value);
-		return getMatcher(value).matches();
-	}
-
-	public boolean isNegated() {
-		return negated;
-	}
-
-	public String getPattern() {
-		return match;
-	}
-
-	public String getInput() {
-		return input;
-	}
-
-	public String toString() {
-		return input;
-	}
-
-	public Matcher getMatcher(String value) {
-		if (pattern == null) {
-			pattern = Pattern.compile(match);
-		}
-		return pattern.matcher(value);
-	}
-
-	public void setOptional() {
-		optional = true;
-	}
-
-	public boolean isOptional() {
-		return optional;
-	}
-
-	public boolean isLiteral() {
-		return literal;
-	}
-
-	public String getLiteral() {
-		assert literal;
-		return match;
-	}
-
-	public boolean isDuplicate() {
-		return duplicate;
-	}
-
-	public boolean isAny() {
-		return any;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Instructions.java b/bundleplugin/src/main/java/aQute/lib/osgi/Instructions.java
deleted file mode 100644
index 6ac56dd..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Instructions.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package aQute.lib.osgi;
-
-import java.util.*;
-
-import aQute.libg.header.*;
-
-public class Instructions implements Map<Instruction,Attrs> {
-	private LinkedHashMap<Instruction,Attrs>	map;
-	static Map<Instruction,Attrs>				EMPTY	= Collections.emptyMap();
-
-	public Instructions(Instructions other) {
-		if (other.map != null && !other.map.isEmpty()) {
-			map = new LinkedHashMap<Instruction,Attrs>(other.map);
-		}
-	}
-
-	public Instructions(Collection<String> other) {
-		if (other != null)
-			for (String s : other) {
-				put(new Instruction(s), null);
-			}
-	}
-
-	public Instructions() {}
-
-	public Instructions(Parameters contained) {
-		append(contained);
-	}
-
-	public Instructions(String h) {
-		this(new Parameters(h));
-	}
-
-	public void clear() {
-		map.clear();
-	}
-
-	public boolean containsKey(Instruction name) {
-		if (map == null)
-			return false;
-
-		return map.containsKey(name);
-	}
-
-	@Deprecated
-	public boolean containsKey(Object name) {
-		assert name instanceof Instruction;
-		if (map == null)
-			return false;
-
-		return map.containsKey(name);
-	}
-
-	public boolean containsValue(Attrs value) {
-		if (map == null)
-			return false;
-
-		return map.containsValue(value);
-	}
-
-	@Deprecated
-	public boolean containsValue(Object value) {
-		assert value instanceof Attrs;
-		if (map == null)
-			return false;
-
-		return map.containsValue(value);
-	}
-
-	public Set<java.util.Map.Entry<Instruction,Attrs>> entrySet() {
-		if (map == null)
-			return EMPTY.entrySet();
-
-		return map.entrySet();
-	}
-
-	@Deprecated
-	public Attrs get(Object key) {
-		assert key instanceof Instruction;
-		if (map == null)
-			return null;
-
-		return map.get(key);
-	}
-
-	public Attrs get(Instruction key) {
-		if (map == null)
-			return null;
-
-		return map.get(key);
-	}
-
-	public boolean isEmpty() {
-		return map == null || map.isEmpty();
-	}
-
-	public Set<Instruction> keySet() {
-		if (map == null)
-			return EMPTY.keySet();
-
-		return map.keySet();
-	}
-
-	public Attrs put(Instruction key, Attrs value) {
-		if (map == null)
-			map = new LinkedHashMap<Instruction,Attrs>();
-
-		return map.put(key, value);
-	}
-
-	public void putAll(Map< ? extends Instruction, ? extends Attrs> map) {
-		if (this.map == null) {
-			if (map.isEmpty())
-				return;
-			this.map = new LinkedHashMap<Instruction,Attrs>();
-		}
-		this.map.putAll(map);
-	}
-
-	@Deprecated
-	public Attrs remove(Object var0) {
-		assert var0 instanceof Instruction;
-		if (map == null)
-			return null;
-
-		return map.remove(var0);
-	}
-
-	public Attrs remove(Instruction 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() {
-		return map == null ? "{}" : map.toString();
-	}
-
-	public void append(Parameters other) {
-		for (Map.Entry<String,Attrs> e : other.entrySet()) {
-			put(new Instruction(e.getKey()), e.getValue());
-		}
-	}
-
-	public <T> Collection<T> select(Collection<T> set, boolean emptyIsAll) {
-		return select(set, null, emptyIsAll);
-	}
-
-	public <T> Collection<T> select(Collection<T> set, Set<Instruction> unused, boolean emptyIsAll) {
-		List<T> input = new ArrayList<T>(set);
-		if (emptyIsAll && isEmpty())
-			return input;
-
-		List<T> result = new ArrayList<T>();
-
-		for (Instruction instruction : keySet()) {
-			boolean used = false;
-			for (Iterator<T> o = input.iterator(); o.hasNext();) {
-				T oo = o.next();
-				String s = oo.toString();
-				if (instruction.matches(s)) {
-					if (!instruction.isNegated())
-						result.add(oo);
-					o.remove();
-					used = true;
-				}
-			}
-			if (!used && unused != null)
-				unused.add(instruction);
-		}
-		return result;
-	}
-
-	public <T> Collection<T> reject(Collection<T> set) {
-		List<T> input = new ArrayList<T>(set);
-		List<T> result = new ArrayList<T>();
-
-		for (Instruction instruction : keySet()) {
-			for (Iterator<T> o = input.iterator(); o.hasNext();) {
-				T oo = o.next();
-				String s = oo.toString();
-				if (instruction.matches(s)) {
-					if (instruction.isNegated())
-						result.add(oo);
-					o.remove();
-				} else
-					result.add(oo);
-
-			}
-		}
-		return result;
-	}
-
-	public boolean matches(String value) {
-		if (size() == 0)
-			return true;
-
-		for (Instruction i : keySet()) {
-			if (i.matches(value)) {
-				if (i.isNegated())
-					return false; // we deny this one explicitly
-				return true; // we allow it explicitly
-			}
-		}
-		return false;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Jar.java b/bundleplugin/src/main/java/aQute/lib/osgi/Jar.java
deleted file mode 100755
index 725b065..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Jar.java
+++ /dev/null
@@ -1,782 +0,0 @@
-package aQute.lib.osgi;
-
-import static aQute.lib.io.IO.*;
-
-import java.io.*;
-import java.security.*;
-import java.util.*;
-import java.util.jar.*;
-import java.util.regex.*;
-import java.util.zip.*;
-
-import aQute.lib.base64.*;
-import aQute.lib.io.*;
-import aQute.service.reporter.*;
-
-public class Jar implements Closeable {
-	public enum Compression {
-		DEFLATE, STORE
-	}
-
-	public static final Object[]			EMPTY_ARRAY	= new Jar[0];
-	final Map<String,Resource>				resources	= new TreeMap<String,Resource>();
-	final Map<String,Map<String,Resource>>	directories	= new TreeMap<String,Map<String,Resource>>();
-	Manifest								manifest;
-	boolean									manifestFirst;
-	String									name;
-	File									source;
-	ZipFile									zipFile;
-	long									lastModified;
-	String									lastModifiedReason;
-	Reporter								reporter;
-	boolean									doNotTouchManifest;
-	boolean									nomanifest;
-	Compression								compression	= Compression.DEFLATE;
-	boolean									closed;
-
-	public Jar(String name) {
-		this.name = name;
-	}
-
-	public Jar(String name, File dirOrFile, Pattern doNotCopy) throws ZipException, IOException {
-		this(name);
-		source = dirOrFile;
-		if (dirOrFile.isDirectory())
-			FileResource.build(this, dirOrFile, doNotCopy);
-		else if (dirOrFile.isFile()) {
-			zipFile = ZipResource.build(this, dirOrFile);
-		} else {
-			throw new IllegalArgumentException("A Jar can only accept a valid file or directory: " + dirOrFile);
-		}
-	}
-
-	public Jar(String name, InputStream in, long lastModified) throws IOException {
-		this(name);
-		EmbeddedResource.build(this, in, lastModified);
-	}
-
-	public Jar(String name, String path) throws IOException {
-		this(name);
-		File f = new File(path);
-		InputStream in = new FileInputStream(f);
-		EmbeddedResource.build(this, in, f.lastModified());
-		in.close();
-	}
-
-	public Jar(File f) throws IOException {
-		this(getName(f), f, null);
-	}
-
-	/**
-	 * Make the JAR file name the project name if we get a src or bin directory.
-	 * 
-	 * @param f
-	 * @return
-	 */
-	private static String getName(File f) {
-		f = f.getAbsoluteFile();
-		String name = f.getName();
-		if (name.equals("bin") || name.equals("src"))
-			return f.getParentFile().getName();
-		if (name.endsWith(".jar"))
-			name = name.substring(0, name.length() - 4);
-		return name;
-	}
-
-	public Jar(String string, InputStream resourceAsStream) throws IOException {
-		this(string, resourceAsStream, 0);
-	}
-
-	public Jar(String string, File file) throws ZipException, IOException {
-		this(string, file, Pattern.compile(Constants.DEFAULT_DO_NOT_COPY));
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String toString() {
-		return "Jar:" + name;
-	}
-
-	public boolean putResource(String path, Resource resource) {
-		check();
-		return putResource(path, resource, true);
-	}
-
-	public boolean putResource(String path, Resource resource, boolean overwrite) {
-		check();
-		updateModified(resource.lastModified(), path);
-		while (path.startsWith("/"))
-			path = path.substring(1);
-
-		if (path.equals("META-INF/MANIFEST.MF")) {
-			manifest = null;
-			if (resources.isEmpty())
-				manifestFirst = true;
-		}
-		String dir = getDirectory(path);
-		Map<String,Resource> s = directories.get(dir);
-		if (s == null) {
-			s = new TreeMap<String,Resource>();
-			directories.put(dir, s);
-			int n = dir.lastIndexOf('/');
-			while (n > 0) {
-				String dd = dir.substring(0, n);
-				if (directories.containsKey(dd))
-					break;
-				directories.put(dd, null);
-				n = dd.lastIndexOf('/');
-			}
-		}
-		boolean duplicate = s.containsKey(path);
-		if (!duplicate || overwrite) {
-			resources.put(path, resource);
-			s.put(path, resource);
-		}
-		return duplicate;
-	}
-
-	public Resource getResource(String path) {
-		check();
-		if (resources == null)
-			return null;
-		return resources.get(path);
-	}
-
-	private String getDirectory(String path) {
-		check();
-		int n = path.lastIndexOf('/');
-		if (n < 0)
-			return "";
-
-		return path.substring(0, n);
-	}
-
-	public Map<String,Map<String,Resource>> getDirectories() {
-		check();
-		return directories;
-	}
-
-	public Map<String,Resource> getResources() {
-		check();
-		return resources;
-	}
-
-	public boolean addDirectory(Map<String,Resource> directory, boolean overwrite) {
-		check();
-		boolean duplicates = false;
-		if (directory == null)
-			return false;
-
-		for (Map.Entry<String,Resource> entry : directory.entrySet()) {
-			String key = entry.getKey();
-			if (!key.endsWith(".java")) {
-				duplicates |= putResource(key, entry.getValue(), overwrite);
-			}
-		}
-		return duplicates;
-	}
-
-	public Manifest getManifest() throws Exception {
-		check();
-		if (manifest == null) {
-			Resource manifestResource = getResource("META-INF/MANIFEST.MF");
-			if (manifestResource != null) {
-				InputStream in = manifestResource.openInputStream();
-				manifest = new Manifest(in);
-				in.close();
-			}
-		}
-		return manifest;
-	}
-
-	public boolean exists(String path) {
-		check();
-		return resources.containsKey(path);
-	}
-
-	public void setManifest(Manifest manifest) {
-		check();
-		manifestFirst = true;
-		this.manifest = manifest;
-	}
-
-	public void setManifest(File file) throws IOException {
-		check();
-		FileInputStream fin = new FileInputStream(file);
-		try {
-			Manifest m = new Manifest(fin);
-			setManifest(m);
-		}
-		finally {
-			fin.close();
-		}
-	}
-
-	public void write(File file) throws Exception {
-		check();
-		try {
-			OutputStream out = new FileOutputStream(file);
-			try {
-				write(out);
-			}
-			finally {
-				IO.close(out);
-			}
-			return;
-
-		}
-		catch (Exception t) {
-			file.delete();
-			throw t;
-		}
-	}
-
-	public void write(String file) throws Exception {
-		check();
-		write(new File(file));
-	}
-
-	public void write(OutputStream out) throws Exception {
-		check();
-		ZipOutputStream jout = nomanifest || doNotTouchManifest ? new ZipOutputStream(out) : new JarOutputStream(out);
-
-		switch (compression) {
-			case STORE :
-				jout.setMethod(ZipOutputStream.DEFLATED);
-				break;
-
-			default :
-				// default is DEFLATED
-		}
-
-		Set<String> done = new HashSet<String>();
-
-		Set<String> directories = new HashSet<String>();
-		if (doNotTouchManifest) {
-			Resource r = getResource("META-INF/MANIFEST.MF");
-			if (r != null) {
-				writeResource(jout, directories, "META-INF/MANIFEST.MF", r);
-				done.add("META-INF/MANIFEST.MF");
-			}
-		} else
-			doManifest(done, jout);
-
-		for (Map.Entry<String,Resource> entry : getResources().entrySet()) {
-			// Skip metainf contents
-			if (!done.contains(entry.getKey()))
-				writeResource(jout, directories, entry.getKey(), entry.getValue());
-		}
-		jout.finish();
-	}
-
-	private void doManifest(Set<String> done, ZipOutputStream jout) throws Exception {
-		check();
-		if (nomanifest)
-			return;
-
-		JarEntry ze = new JarEntry("META-INF/MANIFEST.MF");
-		jout.putNextEntry(ze);
-		writeManifest(jout);
-		jout.closeEntry();
-		done.add(ze.getName());
-	}
-
-	/**
-	 * Cleanup the manifest for writing. Cleaning up consists of adding a space
-	 * after any \n to prevent the manifest to see this newline as a delimiter.
-	 * 
-	 * @param out
-	 *            Output
-	 * @throws IOException
-	 */
-
-	public void writeManifest(OutputStream out) throws Exception {
-		check();
-		writeManifest(getManifest(), out);
-	}
-
-	public static void writeManifest(Manifest manifest, OutputStream out) throws IOException {
-		if (manifest == null)
-			return;
-
-		manifest = clean(manifest);
-		outputManifest(manifest, out);
-	}
-
-	/**
-	 * Unfortunately we have to write our own manifest :-( because of a stupid
-	 * bug in the manifest code. It tries to handle UTF-8 but the way it does it
-	 * it makes the bytes platform dependent. So the following code outputs the
-	 * manifest. A Manifest consists of
-	 * 
-	 * <pre>
-	 *   'Manifest-Version: 1.0\r\n'
-	 *   main-attributes *
-	 *   \r\n
-	 *   name-section
-	 *   
-	 *   main-attributes ::= attributes
-	 *   attributes      ::= key ': ' value '\r\n'
-	 *   name-section    ::= 'Name: ' name '\r\n' attributes
-	 * </pre>
-	 * 
-	 * Lines in the manifest should not exceed 72 bytes (! this is where the
-	 * manifest screwed up as well when 16 bit unicodes were used).
-	 * <p>
-	 * As a bonus, we can now sort the manifest!
-	 */
-	static byte[]	CONTINUE	= new byte[] {
-			'\r', '\n', ' '
-								};
-
-	/**
-	 * Main function to output a manifest properly in UTF-8.
-	 * 
-	 * @param manifest
-	 *            The manifest to output
-	 * @param out
-	 *            The output stream
-	 * @throws IOException
-	 *             when something fails
-	 */
-	public static void outputManifest(Manifest manifest, OutputStream out) throws IOException {
-		writeEntry(out, "Manifest-Version", "1.0");
-		attributes(manifest.getMainAttributes(), out);
-
-		TreeSet<String> keys = new TreeSet<String>();
-		for (Object o : manifest.getEntries().keySet())
-			keys.add(o.toString());
-
-		for (String key : keys) {
-			write(out, 0, "\r\n");
-			writeEntry(out, "Name", key);
-			attributes(manifest.getAttributes(key), out);
-		}
-		out.flush();
-	}
-
-	/**
-	 * Write out an entry, handling proper unicode and line length constraints
-	 */
-	private static void writeEntry(OutputStream out, String name, String value) throws IOException {
-		int n = write(out, 0, name + ": ");
-		write(out, n, value);
-		write(out, 0, "\r\n");
-	}
-
-	/**
-	 * Convert a string to bytes with UTF8 and then output in max 72 bytes
-	 * 
-	 * @param out
-	 *            the output string
-	 * @param i
-	 *            the current width
-	 * @param s
-	 *            the string to output
-	 * @return the new width
-	 * @throws IOException
-	 *             when something fails
-	 */
-	private static int write(OutputStream out, int i, String s) throws IOException {
-		byte[] bytes = s.getBytes("UTF8");
-		return write(out, i, bytes);
-	}
-
-	/**
-	 * Write the bytes but ensure that the line length does not exceed 72
-	 * characters. If it is more than 70 characters, we just put a cr/lf +
-	 * space.
-	 * 
-	 * @param out
-	 *            The output stream
-	 * @param width
-	 *            The nr of characters output in a line before this method
-	 *            started
-	 * @param bytes
-	 *            the bytes to output
-	 * @return the nr of characters in the last line
-	 * @throws IOException
-	 *             if something fails
-	 */
-	private static int write(OutputStream out, int width, byte[] bytes) throws IOException {
-		int w = width;
-		for (int i = 0; i < bytes.length; i++) {
-			if (w >= 72) { // we need to add the \n\r!
-				out.write(CONTINUE);
-				w = 1;
-			}
-			out.write(bytes[i]);
-			w++;
-		}
-		return w;
-	}
-
-	/**
-	 * Output an Attributes map. We will sort this map before outputing.
-	 * 
-	 * @param value
-	 *            the attrbutes
-	 * @param out
-	 *            the output stream
-	 * @throws IOException
-	 *             when something fails
-	 */
-	private static void attributes(Attributes value, OutputStream out) throws IOException {
-		TreeMap<String,String> map = new TreeMap<String,String>(String.CASE_INSENSITIVE_ORDER);
-		for (Map.Entry<Object,Object> entry : value.entrySet()) {
-			map.put(entry.getKey().toString(), entry.getValue().toString());
-		}
-
-		map.remove("Manifest-Version"); // get rid of
-		// manifest
-		// version
-		for (Map.Entry<String,String> entry : map.entrySet()) {
-			writeEntry(out, entry.getKey(), entry.getValue());
-		}
-	}
-
-	private static Manifest clean(Manifest org) {
-
-		Manifest result = new Manifest();
-		for (Map.Entry< ? , ? > entry : org.getMainAttributes().entrySet()) {
-			String nice = clean((String) entry.getValue());
-			result.getMainAttributes().put(entry.getKey(), nice);
-		}
-		for (String name : org.getEntries().keySet()) {
-			Attributes attrs = result.getAttributes(name);
-			if (attrs == null) {
-				attrs = new Attributes();
-				result.getEntries().put(name, attrs);
-			}
-
-			for (Map.Entry< ? , ? > entry : org.getAttributes(name).entrySet()) {
-				String nice = clean((String) entry.getValue());
-				attrs.put(entry.getKey(), nice);
-			}
-		}
-		return result;
-	}
-
-	private static String clean(String s) {
-		if (s.indexOf('\n') < 0)
-			return s;
-
-		StringBuilder sb = new StringBuilder(s);
-		for (int i = 0; i < sb.length(); i++) {
-			if (sb.charAt(i) == '\n')
-				sb.insert(++i, ' ');
-		}
-		return sb.toString();
-	}
-
-	private void writeResource(ZipOutputStream jout, Set<String> directories, String path, Resource resource)
-			throws Exception {
-		if (resource == null)
-			return;
-		try {
-			createDirectories(directories, jout, path);
-			ZipEntry ze = new ZipEntry(path);
-			ze.setMethod(ZipEntry.DEFLATED);
-			long lastModified = resource.lastModified();
-			if (lastModified == 0L) {
-				lastModified = System.currentTimeMillis();
-			}
-			ze.setTime(lastModified);
-			if (resource.getExtra() != null)
-				ze.setExtra(resource.getExtra().getBytes("UTF-8"));
-			jout.putNextEntry(ze);
-			resource.write(jout);
-			jout.closeEntry();
-		}
-		catch (Exception e) {
-			throw new Exception("Problem writing resource " + path, e);
-		}
-	}
-
-	void createDirectories(Set<String> directories, ZipOutputStream zip, String name) throws IOException {
-		int index = name.lastIndexOf('/');
-		if (index > 0) {
-			String path = name.substring(0, index);
-			if (directories.contains(path))
-				return;
-			createDirectories(directories, zip, path);
-			ZipEntry ze = new ZipEntry(path + '/');
-			zip.putNextEntry(ze);
-			zip.closeEntry();
-			directories.add(path);
-		}
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Add all the resources in the given jar that match the given filter.
-	 * 
-	 * @param sub
-	 *            the jar
-	 * @param filter
-	 *            a pattern that should match the resoures in sub to be added
-	 */
-	public boolean addAll(Jar sub, Instruction filter) {
-		return addAll(sub, filter, "");
-	}
-
-	/**
-	 * Add all the resources in the given jar that match the given filter.
-	 * 
-	 * @param sub
-	 *            the jar
-	 * @param filter
-	 *            a pattern that should match the resoures in sub to be added
-	 */
-	public boolean addAll(Jar sub, Instruction filter, String destination) {
-		check();
-		boolean dupl = false;
-		for (String name : sub.getResources().keySet()) {
-			if ("META-INF/MANIFEST.MF".equals(name))
-				continue;
-
-			if (filter == null || filter.matches(name) != filter.isNegated())
-				dupl |= putResource(Processor.appendPath(destination, name), sub.getResource(name), true);
-		}
-		return dupl;
-	}
-
-	public void close() {
-		this.closed = true;
-		if (zipFile != null)
-			try {
-				zipFile.close();
-			}
-			catch (IOException e) {
-				// Ignore
-			}
-		resources.clear();
-		directories.clear();
-		manifest = null;
-		source = null;
-	}
-
-	public long lastModified() {
-		return lastModified;
-	}
-
-	public void updateModified(long time, String reason) {
-		if (time > lastModified) {
-			lastModified = time;
-			lastModifiedReason = reason;
-		}
-	}
-
-	public void setReporter(Reporter reporter) {
-		this.reporter = reporter;
-	}
-
-	public boolean hasDirectory(String path) {
-		check();
-		return directories.get(path) != null;
-	}
-
-	public List<String> getPackages() {
-		check();
-		List<String> list = new ArrayList<String>(directories.size());
-
-		for (Map.Entry<String,Map<String,Resource>> i : directories.entrySet()) {
-			if (i.getValue() != null) {
-				String path = i.getKey();
-				String pack = path.replace('/', '.');
-				list.add(pack);
-			}
-		}
-		return list;
-	}
-
-	public File getSource() {
-		check();
-		return source;
-	}
-
-	public boolean addAll(Jar src) {
-		check();
-		return addAll(src, null);
-	}
-
-	public boolean rename(String oldPath, String newPath) {
-		check();
-		Resource resource = remove(oldPath);
-		if (resource == null)
-			return false;
-
-		return putResource(newPath, resource);
-	}
-
-	public Resource remove(String path) {
-		check();
-		Resource resource = resources.remove(path);
-		String dir = getDirectory(path);
-		Map<String,Resource> mdir = directories.get(dir);
-		// must be != null
-		mdir.remove(path);
-		return resource;
-	}
-
-	/**
-	 * Make sure nobody touches the manifest! If the bundle is signed, we do not
-	 * want anybody to touch the manifest after the digests have been
-	 * calculated.
-	 */
-	public void setDoNotTouchManifest() {
-		doNotTouchManifest = true;
-	}
-
-	/**
-	 * Calculate the checksums and set them in the manifest.
-	 */
-
-	public void calcChecksums(String algorithms[]) throws Exception {
-		check();
-		if (algorithms == null)
-			algorithms = new String[] {
-					"SHA", "MD5"
-			};
-
-		Manifest m = getManifest();
-		if (m == null) {
-			m = new Manifest();
-			setManifest(m);
-		}
-
-		MessageDigest digests[] = new MessageDigest[algorithms.length];
-		int n = 0;
-		for (String algorithm : algorithms)
-			digests[n++] = MessageDigest.getInstance(algorithm);
-
-		byte buffer[] = new byte[30000];
-
-		for (Map.Entry<String,Resource> entry : resources.entrySet()) {
-
-			// Skip the manifest
-			if (entry.getKey().equals("META-INF/MANIFEST.MF"))
-				continue;
-
-			Resource r = entry.getValue();
-			Attributes attributes = m.getAttributes(entry.getKey());
-			if (attributes == null) {
-				attributes = new Attributes();
-				getManifest().getEntries().put(entry.getKey(), attributes);
-			}
-			InputStream in = r.openInputStream();
-			try {
-				for (MessageDigest d : digests)
-					d.reset();
-				int size = in.read(buffer);
-				while (size > 0) {
-					for (MessageDigest d : digests)
-						d.update(buffer, 0, size);
-					size = in.read(buffer);
-				}
-			}
-			finally {
-				in.close();
-			}
-			for (MessageDigest d : digests)
-				attributes.putValue(d.getAlgorithm() + "-Digest", Base64.encodeBase64(d.digest()));
-		}
-	}
-
-	Pattern	BSN	= Pattern.compile("\\s*([-\\w\\d\\._]+)\\s*;?.*");
-
-	public String getBsn() throws Exception {
-		check();
-		Manifest m = getManifest();
-		if (m == null)
-			return null;
-
-		String s = m.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
-		if (s == null)
-			return null;
-
-		Matcher matcher = BSN.matcher(s);
-		if (matcher.matches()) {
-			return matcher.group(1);
-		}
-		return null;
-	}
-
-	public String getVersion() throws Exception {
-		check();
-		Manifest m = getManifest();
-		if (m == null)
-			return null;
-
-		String s = m.getMainAttributes().getValue(Constants.BUNDLE_VERSION);
-		if (s == null)
-			return null;
-
-		return s.trim();
-	}
-
-	/**
-	 * Expand the JAR file to a directory.
-	 * 
-	 * @param dir
-	 *            the dst directory, is not required to exist
-	 * @throws Exception
-	 *             if anything does not work as expected.
-	 */
-	public void expand(File dir) throws Exception {
-		check();
-		dir = dir.getAbsoluteFile();
-		dir.mkdirs();
-		if (!dir.isDirectory()) {
-			throw new IllegalArgumentException("Not a dir: " + dir.getAbsolutePath());
-		}
-
-		for (Map.Entry<String,Resource> entry : getResources().entrySet()) {
-			File f = getFile(dir, entry.getKey());
-			f.getParentFile().mkdirs();
-			IO.copy(entry.getValue().openInputStream(), f);
-		}
-	}
-
-	/**
-	 * Make sure we have a manifest
-	 * 
-	 * @throws Exception
-	 */
-	public void ensureManifest() throws Exception {
-		if (getManifest() != null)
-			return;
-		manifest = new Manifest();
-	}
-
-	/**
-	 * Answer if the manifest was the first entry
-	 */
-
-	public boolean isManifestFirst() {
-		return manifestFirst;
-	}
-
-	public void copy(Jar srce, String path, boolean overwrite) {
-		check();
-		addDirectory(srce.getDirectories().get(path), overwrite);
-	}
-
-	public void setCompression(Compression compression) {
-		this.compression = compression;
-	}
-
-	public Compression hasCompression() {
-		return this.compression;
-	}
-
-	void check() {
-		if (closed)
-			throw new RuntimeException("Already closed " + name);
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/JarResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/JarResource.java
deleted file mode 100755
index c51aba3..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/JarResource.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-
-public class JarResource extends WriteResource {
-	Jar		jar;
-	long	size	= -1;
-
-	public JarResource(Jar jar) {
-		this.jar = jar;
-	}
-
-	public long lastModified() {
-		return jar.lastModified();
-	}
-
-	public void write(OutputStream out) throws Exception {
-		try {
-			jar.write(out);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-	}
-
-	public Jar getJar() {
-		return jar;
-	}
-
-	public String toString() {
-		return ":" + jar.getName() + ":";
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java b/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
deleted file mode 100755
index 8730b69..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
+++ /dev/null
@@ -1,976 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.net.*;
-import java.text.*;
-import java.util.*;
-import java.util.regex.*;
-
-import aQute.lib.collections.*;
-import aQute.lib.io.*;
-import aQute.libg.sed.*;
-import aQute.libg.version.*;
-
-/**
- * Provide a macro processor. This processor can replace variables in strings
- * based on a properties and a domain. The domain can implement functions that
- * start with a "_" and take args[], the names of these functions are available
- * as functions in the macro processor (without the _). Macros can nest to any
- * depth but may not contain loops. Add POSIX macros: ${#parameter} String
- * length. ${parameter%word} Remove smallest suffix pattern. ${parameter%%word}
- * Remove largest suffix pattern. ${parameter#word} Remove smallest prefix
- * pattern. ${parameter##word} Remove largest prefix pattern.
- */
-public class Macro implements Replacer {
-	Processor	domain;
-	Object		targets[];
-	boolean		flattening;
-
-	public Macro(Processor domain, Object... targets) {
-		this.domain = domain;
-		this.targets = targets;
-		if (targets != null) {
-			for (Object o : targets) {
-				assert o != null;
-			}
-		}
-	}
-
-	public String process(String line, Processor source) {
-		return process(line, new Link(source, null, line));
-	}
-
-	String process(String line, Link link) {
-		StringBuilder sb = new StringBuilder();
-		process(line, 0, '\u0000', '\u0000', sb, link);
-		return sb.toString();
-	}
-
-	int process(CharSequence org, int index, char begin, char end, StringBuilder result, Link link) {
-		StringBuilder line = new StringBuilder(org);
-		int nesting = 1;
-
-		StringBuilder variable = new StringBuilder();
-		outer: while (index < line.length()) {
-			char c1 = line.charAt(index++);
-			if (c1 == end) {
-				if (--nesting == 0) {
-					result.append(replace(variable.toString(), link));
-					return index;
-				}
-			} else if (c1 == begin)
-				nesting++;
-			else if (c1 == '\\' && index < line.length() - 1 && line.charAt(index) == '$') {
-				// remove the escape backslash and interpret the dollar
-				// as a
-				// literal
-				index++;
-				variable.append('$');
-				continue outer;
-			} else if (c1 == '$' && index < line.length() - 2) {
-				char c2 = line.charAt(index);
-				char terminator = getTerminator(c2);
-				if (terminator != 0) {
-					index = process(line, index + 1, c2, terminator, variable, link);
-					continue outer;
-				}
-			} else if (c1 == '.' && index < line.length() && line.charAt(index) == '/') {
-				// Found the sequence ./
-				if (index == 1 || Character.isWhitespace(line.charAt(index - 2))) {
-					// make sure it is preceded by whitespace or starts at begin
-					index++;
-					variable.append(domain.getBase().getAbsolutePath());
-					variable.append('/');
-					continue outer;
-				}
-			}
-			variable.append(c1);
-		}
-		result.append(variable);
-		return index;
-	}
-
-	public static char getTerminator(char c) {
-		switch (c) {
-			case '(' :
-				return ')';
-			case '[' :
-				return ']';
-			case '{' :
-				return '}';
-			case '<' :
-				return '>';
-			case '\u00ab' : // Guillemet double << >>
-				return '\u00bb';
-			case '\u2039' : // Guillemet single
-				return '\u203a';
-		}
-		return 0;
-	}
-
-	protected String replace(String key, Link link) {
-		if (link != null && link.contains(key))
-			return "${infinite:" + link.toString() + "}";
-
-		if (key != null) {
-			key = key.trim();
-			if (key.length() > 0) {
-				Processor source = domain;
-				String value = null;
-
-				if (key.indexOf(';') < 0) {
-					Instruction ins = new Instruction(key);
-					if (!ins.isLiteral()) {
-						SortedList<String> sortedList = SortedList.fromIterator(domain.iterator());
-						StringBuilder sb = new StringBuilder();
-						String del = "";
-						for (String k : sortedList) {
-							if (ins.matches(k)) {
-								String v = replace(k, new Link(source, link, key));
-								if (v != null) {
-									sb.append(del);
-									del = ",";
-									sb.append(v);
-								}
-							}
-						}
-						return sb.toString();
-					}
-				}
-				while (value == null && source != null) {
-					value = source.getProperties().getProperty(key);
-					source = source.getParent();
-				}
-
-				if (value != null)
-					return process(value, new Link(source, link, key));
-
-				value = doCommands(key, link);
-				if (value != null)
-					return process(value, new Link(source, link, key));
-
-				if (key != null && key.trim().length() > 0) {
-					value = System.getProperty(key);
-					if (value != null)
-						return value;
-				}
-				if (!flattening && !key.equals("@"))
-					domain.warning("No translation found for macro: " + key);
-			} else {
-				domain.warning("Found empty macro key");
-			}
-		} else {
-			domain.warning("Found null macro key");
-		}
-		return "${" + key + "}";
-	}
-
-	/**
-	 * Parse the key as a command. A command consist of parameters separated by
-	 * ':'.
-	 * 
-	 * @param key
-	 * @return
-	 */
-	static Pattern	commands	= Pattern.compile("(?<!\\\\);");
-
-	private String doCommands(String key, Link source) {
-		String[] args = commands.split(key);
-		if (args == null || args.length == 0)
-			return null;
-
-		for (int i = 0; i < args.length; i++)
-			if (args[i].indexOf('\\') >= 0)
-				args[i] = args[i].replaceAll("\\\\;", ";");
-
-		if (args[0].startsWith("^")) {
-			String varname = args[0].substring(1).trim();
-
-			Processor parent = source.start.getParent();
-			if (parent != null)
-				return parent.getProperty(varname);
-			return null;
-		}
-
-		Processor rover = domain;
-		while (rover != null) {
-			String result = doCommand(rover, args[0], args);
-			if (result != null)
-				return result;
-
-			rover = rover.getParent();
-		}
-
-		for (int i = 0; targets != null && i < targets.length; i++) {
-			String result = doCommand(targets[i], args[0], args);
-			if (result != null)
-				return result;
-		}
-
-		return doCommand(this, args[0], args);
-	}
-
-	private String doCommand(Object target, String method, String[] args) {
-		if (target == null)
-			; // System.err.println("Huh? Target should never be null " +
-		// domain);
-		else {
-			String cname = "_" + method.replaceAll("-", "_");
-			try {
-				Method m = target.getClass().getMethod(cname, new Class[] {
-					String[].class
-				});
-				return (String) m.invoke(target, new Object[] {
-					args
-				});
-			}
-			catch (NoSuchMethodException e) {
-				// Ignore
-			}
-			catch (InvocationTargetException e) {
-				if (e.getCause() instanceof IllegalArgumentException) {
-					domain.error("%s, for cmd: %s, arguments; %s", e.getMessage(), method, Arrays.toString(args));
-				} else {
-					domain.warning("Exception in replace: " + e.getCause());
-					e.getCause().printStackTrace();
-				}
-			}
-			catch (Exception e) {
-				domain.warning("Exception in replace: " + e + " method=" + method);
-				e.printStackTrace();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return a unique list where the duplicates are removed.
-	 * 
-	 * @param args
-	 * @return
-	 */
-	static String	_uniqHelp	= "${uniq;<list> ...}";
-
-	public String _uniq(String args[]) {
-		verifyCommand(args, _uniqHelp, null, 1, Integer.MAX_VALUE);
-		Set<String> set = new LinkedHashSet<String>();
-		for (int i = 1; i < args.length; i++) {
-			Processor.split(args[i], set);
-		}
-		return Processor.join(set, ",");
-	}
-
-	public String _pathseparator(@SuppressWarnings("unused") String args[]) {
-		return File.pathSeparator;
-	}
-
-	public String _separator(@SuppressWarnings("unused") String args[]) {
-		return File.separator;
-	}
-
-	public String _filter(String args[]) {
-		return filter(args, false);
-	}
-
-	public String _filterout(String args[]) {
-		return filter(args, true);
-
-	}
-
-	static String	_filterHelp	= "${%s;<list>;<regex>}";
-
-	String filter(String[] args, boolean include) {
-		verifyCommand(args, String.format(_filterHelp, args[0]), null, 3, 3);
-
-		Collection<String> list = new ArrayList<String>(Processor.split(args[1]));
-		Pattern pattern = Pattern.compile(args[2]);
-
-		for (Iterator<String> i = list.iterator(); i.hasNext();) {
-			if (pattern.matcher(i.next()).matches() == include)
-				i.remove();
-		}
-		return Processor.join(list);
-	}
-
-	static String	_sortHelp	= "${sort;<list>...}";
-
-	public String _sort(String args[]) {
-		verifyCommand(args, _sortHelp, null, 2, Integer.MAX_VALUE);
-
-		List<String> result = new ArrayList<String>();
-		for (int i = 1; i < args.length; i++) {
-			Processor.split(args[i], result);
-		}
-		Collections.sort(result);
-		return Processor.join(result);
-	}
-
-	static String	_joinHelp	= "${join;<list>...}";
-
-	public String _join(String args[]) {
-
-		verifyCommand(args, _joinHelp, null, 1, Integer.MAX_VALUE);
-
-		List<String> result = new ArrayList<String>();
-		for (int i = 1; i < args.length; i++) {
-			Processor.split(args[i], result);
-		}
-		return Processor.join(result);
-	}
-
-	static String	_ifHelp	= "${if;<condition>;<iftrue> [;<iffalse>] }";
-
-	public String _if(String args[]) {
-		verifyCommand(args, _ifHelp, null, 3, 4);
-		String condition = args[1].trim();
-		if (!condition.equalsIgnoreCase("false"))
-			if (condition.length() != 0)
-				return args[2];
-
-		if (args.length > 3)
-			return args[3];
-		return "";
-	}
-
-	public String _now(@SuppressWarnings("unused") String args[]) {
-		return new Date().toString();
-	}
-
-	public final static String	_fmodifiedHelp	= "${fmodified;<list of filenames>...}, return latest modification date";
-
-	public String _fmodified(String args[]) throws Exception {
-		verifyCommand(args, _fmodifiedHelp, null, 2, Integer.MAX_VALUE);
-
-		long time = 0;
-		Collection<String> names = new ArrayList<String>();
-		for (int i = 1; i < args.length; i++) {
-			Processor.split(args[i], names);
-		}
-		for (String name : names) {
-			File f = new File(name);
-			if (f.exists() && f.lastModified() > time)
-				time = f.lastModified();
-		}
-		return "" + time;
-	}
-
-	public String _long2date(String args[]) {
-		try {
-			return new Date(Long.parseLong(args[1])).toString();
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-		}
-		return "not a valid long";
-	}
-
-	public String _literal(String args[]) {
-		if (args.length != 2)
-			throw new RuntimeException("Need a value for the ${literal;<value>} macro");
-		return "${" + args[1] + "}";
-	}
-
-	public String _def(String args[]) {
-		if (args.length != 2)
-			throw new RuntimeException("Need a value for the ${def;<value>} macro");
-
-		return domain.getProperty(args[1], "");
-	}
-
-	/**
-	 * replace ; <list> ; regex ; replace
-	 * 
-	 * @param args
-	 * @return
-	 */
-	public String _replace(String args[]) {
-		if (args.length != 4) {
-			domain.warning("Invalid nr of arguments to replace " + Arrays.asList(args));
-			return null;
-		}
-
-		String list[] = args[1].split("\\s*,\\s*");
-		StringBuilder sb = new StringBuilder();
-		String del = "";
-		for (int i = 0; i < list.length; i++) {
-			String element = list[i].trim();
-			if (!element.equals("")) {
-				sb.append(del);
-				sb.append(element.replaceAll(args[2], args[3]));
-				del = ", ";
-			}
-		}
-
-		return sb.toString();
-	}
-
-	public String _warning(String args[]) {
-		for (int i = 1; i < args.length; i++) {
-			domain.warning(process(args[i]));
-		}
-		return "";
-	}
-
-	public String _error(String args[]) {
-		for (int i = 1; i < args.length; i++) {
-			domain.error(process(args[i]));
-		}
-		return "";
-	}
-
-	/**
-	 * toclassname ; <path>.class ( , <path>.class ) *
-	 * 
-	 * @param args
-	 * @return
-	 */
-	static String	_toclassnameHelp	= "${classname;<list of class names>}, convert class paths to FQN class names ";
-
-	public String _toclassname(String args[]) {
-		verifyCommand(args, _toclassnameHelp, null, 2, 2);
-		Collection<String> paths = Processor.split(args[1]);
-
-		List<String> names = new ArrayList<String>(paths.size());
-		for (String path : paths) {
-			if (path.endsWith(".class")) {
-				String name = path.substring(0, path.length() - 6).replace('/', '.');
-				names.add(name);
-			} else if (path.endsWith(".java")) {
-				String name = path.substring(0, path.length() - 5).replace('/', '.');
-				names.add(name);
-			} else {
-				domain.warning("in toclassname, " + args[1] + " is not a class path because it does not end in .class");
-			}
-		}
-		return Processor.join(names, ",");
-	}
-
-	/**
-	 * toclassname ; <path>.class ( , <path>.class ) *
-	 * 
-	 * @param args
-	 * @return
-	 */
-
-	static String	_toclasspathHelp	= "${toclasspath;<list>[;boolean]}, convert a list of class names to paths";
-
-	public String _toclasspath(String args[]) {
-		verifyCommand(args, _toclasspathHelp, null, 2, 3);
-		boolean cl = true;
-		if (args.length > 2)
-			cl = Boolean.valueOf(args[2]);
-
-		Collection<String> names = Processor.split(args[1]);
-		Collection<String> paths = new ArrayList<String>(names.size());
-		for (String name : names) {
-			String path = name.replace('.', '/') + (cl ? ".class" : "");
-			paths.add(path);
-		}
-		return Processor.join(paths, ",");
-	}
-
-	public String _dir(String args[]) {
-		if (args.length < 2) {
-			domain.warning("Need at least one file name for ${dir;...}");
-			return null;
-		}
-		String del = "";
-		StringBuilder sb = new StringBuilder();
-		for (int i = 1; i < args.length; i++) {
-			File f = domain.getFile(args[i]);
-			if (f.exists() && f.getParentFile().exists()) {
-				sb.append(del);
-				sb.append(f.getParentFile().getAbsolutePath());
-				del = ",";
-			}
-		}
-		return sb.toString();
-
-	}
-
-	public String _basename(String args[]) {
-		if (args.length < 2) {
-			domain.warning("Need at least one file name for ${basename;...}");
-			return null;
-		}
-		String del = "";
-		StringBuilder sb = new StringBuilder();
-		for (int i = 1; i < args.length; i++) {
-			File f = domain.getFile(args[i]);
-			if (f.exists() && f.getParentFile().exists()) {
-				sb.append(del);
-				sb.append(f.getName());
-				del = ",";
-			}
-		}
-		return sb.toString();
-
-	}
-
-	public String _isfile(String args[]) {
-		if (args.length < 2) {
-			domain.warning("Need at least one file name for ${isfile;...}");
-			return null;
-		}
-		boolean isfile = true;
-		for (int i = 1; i < args.length; i++) {
-			File f = new File(args[i]).getAbsoluteFile();
-			isfile &= f.isFile();
-		}
-		return isfile ? "true" : "false";
-
-	}
-
-	public String _isdir(String args[]) {
-		if (args.length < 2) {
-			domain.warning("Need at least one file name for ${isdir;...}");
-			return null;
-		}
-		boolean isdir = true;
-		for (int i = 1; i < args.length; i++) {
-			File f = new File(args[i]).getAbsoluteFile();
-			isdir &= f.isDirectory();
-		}
-		return isdir ? "true" : "false";
-
-	}
-
-	public String _tstamp(String args[]) {
-		String format = "yyyyMMddHHmm";
-		long now = System.currentTimeMillis();
-		TimeZone tz = TimeZone.getTimeZone("UTC");
-
-		if (args.length > 1) {
-			format = args[1];
-		}
-		if (args.length > 2) {
-			tz = TimeZone.getTimeZone(args[2]);
-		}
-		if (args.length > 3) {
-			now = Long.parseLong(args[3]);
-		}
-		if (args.length > 4) {
-			domain.warning("Too many arguments for tstamp: " + Arrays.toString(args));
-		}
-
-		SimpleDateFormat sdf = new SimpleDateFormat(format);
-		sdf.setTimeZone(tz);
-
-		return sdf.format(new Date(now));
-	}
-
-	/**
-	 * Wildcard a directory. The lists can contain Instruction that are matched
-	 * against the given directory ${lsr;<dir>;<list>(;<list>)*}
-	 * ${lsa;<dir>;<list>(;<list>)*}
-	 * 
-	 * @author aqute
-	 */
-
-	public String _lsr(String args[]) {
-		return ls(args, true);
-	}
-
-	public String _lsa(String args[]) {
-		return ls(args, false);
-	}
-
-	String ls(String args[], boolean relative) {
-		if (args.length < 2)
-			throw new IllegalArgumentException("the ${ls} macro must at least have a directory as parameter");
-
-		File dir = domain.getFile(args[1]);
-		if (!dir.isAbsolute())
-			throw new IllegalArgumentException("the ${ls} macro directory parameter is not absolute: " + dir);
-
-		if (!dir.exists())
-			throw new IllegalArgumentException("the ${ls} macro directory parameter does not exist: " + dir);
-
-		if (!dir.isDirectory())
-			throw new IllegalArgumentException(
-					"the ${ls} macro directory parameter points to a file instead of a directory: " + dir);
-
-		List<File> files = new ArrayList<File>(new SortedList<File>(dir.listFiles()));
-
-		for (int i = 2; i < args.length; i++) {
-			Instructions filters = new Instructions(args[i]);
-			filters.select(files, true);
-		}
-
-		List<String> result = new ArrayList<String>();
-		for (File file : files)
-			result.add(relative ? file.getName() : file.getAbsolutePath());
-
-		return Processor.join(result, ",");
-	}
-
-	public String _currenttime(@SuppressWarnings("unused") String args[]) {
-		return Long.toString(System.currentTimeMillis());
-	}
-
-	/**
-	 * Modify a version to set a version policy. Thed policy is a mask that is
-	 * mapped to a version.
-	 * 
-	 * <pre>
-	 * +           increment
-	 * -           decrement
-	 * =           maintain
-	 * &tilde;           discard
-	 * 
-	 * ==+      = maintain major, minor, increment micro, discard qualifier
-	 * &tilde;&tilde;&tilde;=     = just get the qualifier
-	 * version=&quot;[${version;==;${@}},${version;=+;${@}})&quot;
-	 * </pre>
-	 * 
-	 * @param args
-	 * @return
-	 */
-	final static String		MASK_STRING			= "[\\-+=~0123456789]{0,3}[=~]?";
-	final static Pattern	MASK				= Pattern.compile(MASK_STRING);
-	final static String		_versionHelp		= "${version;<mask>;<version>}, modify a version\n"
-														+ "<mask> ::= [ M [ M [ M [ MQ ]]]\n"
-														+ "M ::= '+' | '-' | MQ\n" + "MQ ::= '~' | '='";
-	final static Pattern	_versionPattern[]	= new Pattern[] {
-			null, null, MASK, Verifier.VERSION
-												};
-
-	public String _version(String args[]) {
-		verifyCommand(args, _versionHelp, null, 2, 3);
-
-		String mask = args[1];
-
-		Version version = null;
-		if (args.length >= 3)
-			version = new Version(args[2]);
-
-		return version(version, mask);
-	}
-
-	String version(Version version, String mask) {
-		if (version == null) {
-			String v = domain.getProperty("@");
-			if (v == null) {
-				domain.error(
-						"No version specified for ${version} or ${range} and no implicit version ${@} either, mask=%s",
-						mask);
-				v = "0";
-			}
-			version = new Version(v);
-		}
-
-		StringBuilder sb = new StringBuilder();
-		String del = "";
-
-		for (int i = 0; i < mask.length(); i++) {
-			char c = mask.charAt(i);
-			String result = null;
-			if (c != '~') {
-				if (i == 3) {
-					result = version.getQualifier();
-				} else if (Character.isDigit(c)) {
-					// Handle masks like +00, =+0
-					result = String.valueOf(c);
-				} else {
-					int x = version.get(i);
-					switch (c) {
-						case '+' :
-							x++;
-							break;
-						case '-' :
-							x--;
-							break;
-						case '=' :
-							break;
-					}
-					result = Integer.toString(x);
-				}
-				if (result != null) {
-					sb.append(del);
-					del = ".";
-					sb.append(result);
-				}
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Schortcut for version policy
-	 * 
-	 * <pre>
-	 * -provide-policy : ${policy;[==,=+)}
-	 * -consume-policy : ${policy;[==,+)}
-	 * </pre>
-	 * 
-	 * @param args
-	 * @return
-	 */
-
-	static Pattern	RANGE_MASK		= Pattern.compile("(\\[|\\()(" + MASK_STRING + "),(" + MASK_STRING + ")(\\]|\\))");
-	static String	_rangeHelp		= "${range;<mask>[;<version>]}, range for version, if version not specified lookyp ${@}\n"
-											+ "<mask> ::= [ M [ M [ M [ MQ ]]]\n"
-											+ "M ::= '+' | '-' | MQ\n"
-											+ "MQ ::= '~' | '='";
-	static Pattern	_rangePattern[]	= new Pattern[] {
-			null, RANGE_MASK
-									};
-
-	public String _range(String args[]) {
-		verifyCommand(args, _rangeHelp, _rangePattern, 2, 3);
-		Version version = null;
-		if (args.length >= 3)
-			version = new Version(args[2]);
-		else {
-			String v = domain.getProperty("@");
-			if (v == null)
-				return null;
-			version = new Version(v);
-		}
-		String spec = args[1];
-
-		Matcher m = RANGE_MASK.matcher(spec);
-		m.matches();
-		String floor = m.group(1);
-		String floorMask = m.group(2);
-		String ceilingMask = m.group(3);
-		String ceiling = m.group(4);
-
-		String left = version(version, floorMask);
-		String right = version(version, ceilingMask);
-		StringBuilder sb = new StringBuilder();
-		sb.append(floor);
-		sb.append(left);
-		sb.append(",");
-		sb.append(right);
-		sb.append(ceiling);
-
-		String s = sb.toString();
-		VersionRange vr = new VersionRange(s);
-		if (!(vr.includes(vr.getHigh()) || vr.includes(vr.getLow()))) {
-			domain.error("${range} macro created an invalid range %s from %s and mask %s", s, version, spec);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * System command. Execute a command and insert the result.
-	 * 
-	 * @param args
-	 * @param help
-	 * @param patterns
-	 * @param low
-	 * @param high
-	 */
-	public String system_internal(boolean allowFail, String args[]) throws Exception {
-		verifyCommand(args, "${" + (allowFail ? "system-allow-fail" : "system")
-				+ ";<command>[;<in>]}, execute a system command", null, 2, 3);
-		String command = args[1];
-		String input = null;
-
-		if (args.length > 2) {
-			input = args[2];
-		}
-
-		Process process = Runtime.getRuntime().exec(command, null, domain.getBase());
-		if (input != null) {
-			process.getOutputStream().write(input.getBytes("UTF-8"));
-		}
-		process.getOutputStream().close();
-
-		String s = IO.collect(process.getInputStream(), "UTF-8");
-		int exitValue = process.waitFor();
-		if (exitValue != 0)
-			return exitValue + "";
-
-		if (!allowFail && (exitValue != 0)) {
-			domain.error("System command " + command + " failed with " + exitValue);
-		}
-		return s.trim();
-	}
-
-	public String _system(String args[]) throws Exception {
-		return system_internal(false, args);
-	}
-
-	public String _system_allow_fail(String args[]) throws Exception {
-		String result = "";
-		try {
-			result = system_internal(true, args);
-		}
-		catch (Throwable t) {
-			/* ignore */
-		}
-		return result;
-	}
-
-	public String _env(String args[]) {
-		verifyCommand(args, "${env;<name>}, get the environmet variable", null, 2, 2);
-
-		try {
-			return System.getenv(args[1]);
-		}
-		catch (Throwable t) {
-			return null;
-		}
-	}
-
-	/**
-	 * Get the contents of a file.
-	 * 
-	 * @param in
-	 * @return
-	 * @throws IOException
-	 */
-
-	public String _cat(String args[]) throws IOException {
-		verifyCommand(args, "${cat;<in>}, get the content of a file", null, 2, 2);
-		File f = domain.getFile(args[1]);
-		if (f.isFile()) {
-			return IO.collect(f);
-		} else if (f.isDirectory()) {
-			return Arrays.toString(f.list());
-		} else {
-			try {
-				URL url = new URL(args[1]);
-				return IO.collect(url, "UTF-8");
-			}
-			catch (MalformedURLException mfue) {
-				// Ignore here
-			}
-			return null;
-		}
-	}
-
-	public static void verifyCommand(String args[], @SuppressWarnings("unused") String help, Pattern[] patterns, int low, int high) {
-		String message = "";
-		if (args.length > high) {
-			message = "too many arguments";
-		} else if (args.length < low) {
-			message = "too few arguments";
-		} else {
-			for (int i = 0; patterns != null && i < patterns.length && i < args.length; i++) {
-				if (patterns[i] != null) {
-					Matcher m = patterns[i].matcher(args[i]);
-					if (!m.matches())
-						message += String.format("Argument %s (%s) does not match %s%n", i, args[i],
-								patterns[i].pattern());
-				}
-			}
-		}
-		if (message.length() != 0) {
-			StringBuilder sb = new StringBuilder();
-			String del = "${";
-			for (String arg : args) {
-				sb.append(del);
-				sb.append(arg);
-				del = ";";
-			}
-			sb.append("}, is not understood. ");
-			sb.append(message);
-			throw new IllegalArgumentException(sb.toString());
-		}
-	}
-
-	// Helper class to track expansion of variables
-	// on the stack.
-	static class Link {
-		Link		previous;
-		String		key;
-		Processor	start;
-
-		public Link(Processor start, Link previous, String key) {
-			this.previous = previous;
-			this.key = key;
-			this.start = start;
-		}
-
-		public boolean contains(String key) {
-			if (this.key.equals(key))
-				return true;
-
-			if (previous == null)
-				return false;
-
-			return previous.contains(key);
-		}
-
-		public String toString() {
-			StringBuilder sb = new StringBuilder();
-			String del = "[";
-			for (Link r = this; r != null; r = r.previous) {
-				sb.append(del);
-				sb.append(r.key);
-				del = ",";
-			}
-			sb.append("]");
-			return sb.toString();
-		}
-	}
-
-	/**
-	 * Take all the properties and translate them to actual values. This method
-	 * takes the set properties and traverse them over all entries, including
-	 * the default properties for that properties. The values no longer contain
-	 * macros.
-	 * 
-	 * @return A new Properties with the flattened values
-	 */
-	public Properties getFlattenedProperties() {
-		// Some macros only work in a lower processor, so we
-		// do not report unknown macros while flattening
-		flattening = true;
-		try {
-			Properties flattened = new Properties();
-			Properties source = domain.getProperties();
-			for (Enumeration< ? > e = source.propertyNames(); e.hasMoreElements();) {
-				String key = (String) e.nextElement();
-				if (!key.startsWith("_"))
-					if (key.startsWith("-"))
-						flattened.put(key, source.getProperty(key));
-					else
-						flattened.put(key, process(source.getProperty(key)));
-			}
-			return flattened;
-		}
-		finally {
-			flattening = false;
-		}
-	}
-
-	public final static String	_fileHelp	= "${file;<base>;<paths>...}, create correct OS dependent path";
-
-	public String _osfile(String args[]) {
-		verifyCommand(args, _fileHelp, null, 3, 3);
-		File base = new File(args[1]);
-		File f = Processor.getFile(base, args[2]);
-		return f.getAbsolutePath();
-	}
-
-	public String _path(String args[]) {
-		List<String> list = new ArrayList<String>();
-		for (int i = 1; i < args.length; i++) {
-			list.addAll(Processor.split(args[i]));
-		}
-		return Processor.join(list, File.pathSeparator);
-	}
-
-	public static Properties getParent(Properties p) {
-		try {
-			Field f = Properties.class.getDeclaredField("defaults");
-			f.setAccessible(true);
-			return (Properties) f.get(p);
-		}
-		catch (Exception e) {
-			Field[] fields = Properties.class.getFields();
-			System.err.println(Arrays.toString(fields));
-			return null;
-		}
-	}
-
-	public String process(String line) {
-		return process(line, domain);
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/OpCodes.java b/bundleplugin/src/main/java/aQute/lib/osgi/OpCodes.java
deleted file mode 100755
index 17b6d2b..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/OpCodes.java
+++ /dev/null
@@ -1,1250 +0,0 @@
-package aQute.lib.osgi;
-
-public class OpCodes {
-	final static short	nop				= 0x00;			// [No change]
-															// performs
-															// no
-	// operation
-	final static short	aconst_null		= 0x01;			// ? null pushes a
-															// null
-	// reference onto the stack
-	final static short	iconst_m1		= 0x02;			// ? -1 loads the
-															// int
-															// value -1
-	// onto the stack
-	final static short	iconst_0		= 0x03;			// ? 0 loads the int
-															// value 0
-	// onto the stack
-	final static short	iconst_1		= 0x04;			// ? 1 loads the int
-															// value 1
-	// onto the stack
-	final static short	iconst_2		= 0x05;			// ? 2 loads the int
-															// value 2
-	// onto the stack
-	final static short	iconst_3		= 0x06;			// ? 3 loads the int
-															// value 3
-	// onto the stack
-	final static short	iconst_4		= 0x07;			// ? 4 loads the int
-															// value 4
-	// onto the stack
-	final static short	iconst_5		= 0x08;			// ? 5 loads the int
-															// value 5
-	// onto the stack
-	final static short	lconst_0		= 0x09;			// ? 0L pushes the
-															// long
-															// 0 onto
-	// the stack
-	final static short	bipush			= 0x10;			// byte ? value
-															// pushes a
-															// byte
-	// onto the stack as an integer
-	// value
-	final static short	sipush			= 0x11;			// byte1, byte2 ?
-															// value
-															// pushes a
-	// signed integer (byte1 << 8 +
-	// byte2) onto the stack
-	final static short	ldc				= 0x12;			// index ? value
-															// pushes
-															// a
-	// constant #index from a
-	// constant pool (String, int,
-	// float or class type) onto the
-	// stack
-	final static short	ldc_w			= 0x13;			// indexbyte1,
-															// indexbyte2 ?
-	// value pushes a constant
-	// #index from a constant pool
-	// (String, int, float or class
-	// type) onto the stack (wide
-	// index is constructed as
-	// indexbyte1 << 8 + indexbyte2)
-	final static short	ldc2_w			= 0x14;			// indexbyte1,
-															// indexbyte2 ?
-	// value pushes a constant
-	// #index from a constant pool
-	// (double or long) onto the
-	// stack (wide index is
-	// constructed as indexbyte1 <<
-	// 8 + indexbyte2)
-	final static short	iload			= 0x15;			// index ? value
-															// loads
-															// an int
-	// value from a variable #index
-	final static short	lload			= 0x16;			// index ? value
-															// load a
-															// long
-	// value from a local variable
-	// #index
-	final static short	fload			= 0x17;			// index ? value
-															// loads a
-															// float
-	// value from a local variable
-	// #index
-	final static short	dload			= 0x18;			// index ? value
-															// loads a
-															// double
-	// value from a local variable
-	// #index
-	final static short	aload			= 0x19;			// index ? objectref
-															// loads a
-	// reference onto the stack from
-	// a local variable #index
-	final static short	lload_2			= 0x20;			// ? value load a
-															// long
-															// value
-	// from a local variable 2
-	final static short	lload_3			= 0x21;			// ? value load a
-															// long
-															// value
-	// from a local variable 3
-	final static short	fload_0			= 0x22;			// ? value loads a
-															// float
-															// value
-	// from local variable 0
-	final static short	fload_1			= 0x23;			// ? value loads a
-															// float
-															// value
-	// from local variable 1
-	final static short	fload_2			= 0x24;			// ? value loads a
-															// float
-															// value
-	// from local variable 2
-	final static short	fload_3			= 0x25;			// ? value loads a
-															// float
-															// value
-	// from local variable 3
-	final static short	dload_0			= 0x26;			// ? value loads a
-															// double from
-	// local variable 0
-	final static short	dload_1			= 0x27;			// ? value loads a
-															// double from
-	// local variable 1
-	final static short	dload_2			= 0x28;			// ? value loads a
-															// double from
-	// local variable 2
-	final static short	dload_3			= 0x29;			// ? value loads a
-															// double from
-	// local variable 3
-	final static short	faload			= 0x30;			// arrayref, index ?
-															// value loads
-	// a float from an array
-	final static short	daload			= 0x31;			// arrayref, index ?
-															// value loads
-	// a double from an array
-	final static short	aaload			= 0x32;			// arrayref, index ?
-															// value loads
-	// onto the stack a reference
-	// from an array
-	final static short	baload			= 0x33;			// arrayref, index ?
-															// value loads
-	// a byte or Boolean value from
-	// an array
-	final static short	caload			= 0x34;			// arrayref, index ?
-															// value loads
-	// a char from an array
-	final static short	saload			= 0x35;			// arrayref, index ?
-															// value load
-	// short from array
-	final static short	istore			= 0x36;			// index value ?
-															// store
-															// int value
-	// into variable #index
-	final static short	lstore			= 0x37;			// index value ?
-															// store a
-															// long
-	// value in a local variable
-	// #index
-	final static short	fstore			= 0x38;			// index value ?
-															// stores
-															// a float
-	// value into a local variable
-	// #index
-	final static short	dstore			= 0x39;			// index value ?
-															// stores
-															// a double
-	// value into a local variable
-	// #index
-	final static short	lstore_1		= 0x40;			// value ? store a
-															// long
-															// value in
-	// a local variable 1
-	final static short	lstore_2		= 0x41;			// value ? store a
-															// long
-															// value in
-	// a local variable 2
-	final static short	lstore_3		= 0x42;			// value ? store a
-															// long
-															// value in
-	// a local variable 3
-	final static short	fstore_0		= 0x43;			// value ? stores a
-															// float value
-	// into local variable 0
-	final static short	fstore_1		= 0x44;			// value ? stores a
-															// float value
-	// into local variable 1
-	final static short	fstore_2		= 0x45;			// value ? stores a
-															// float value
-	// into local variable 2
-	final static short	fstore_3		= 0x46;			// value ? stores a
-															// float value
-	// into local variable 3
-	final static short	dstore_0		= 0x47;			// value ? stores a
-															// double into
-	// local variable 0
-	final static short	dstore_1		= 0x48;			// value ? stores a
-															// double into
-	// local variable 1
-	final static short	dstore_2		= 0x49;			// value ? stores a
-															// double into
-	// local variable 2
-	final static short	lastore			= 0x50;			// arrayref, index,
-															// value ?
-	// store a long to an array
-	final static short	fastore			= 0x51;			// arreyref, index,
-															// value ?
-	// stores a float in an array
-	final static short	dastore			= 0x52;			// arrayref, index,
-															// value ?
-	// stores a double into an array
-	final static short	aastore			= 0x53;			// arrayref, index,
-															// value ?
-	// stores into a reference to an
-	// array
-	final static short	bastore			= 0x54;			// arrayref, index,
-															// value ?
-	// stores a byte or Boolean
-	// value into an array
-	final static short	castore			= 0x55;			// arrayref, index,
-															// value ?
-	// stores a char into an array
-	final static short	sastore			= 0x56;			// arrayref, index,
-															// value ?
-	// store short to array
-	final static short	pop				= 0x57;			// value ? discards
-															// the
-															// top
-	// value on the stack
-	final static short	pop2			= 0x58;			// {value2, value1}
-															// ?
-															// discards
-	// the top two values on the
-	// stack (or one value, if it is
-	// a double or long)
-	final static short	dup				= 0x59;			// value ? value,
-															// value
-	// duplicates the value on top
-	// of the stack
-	final static short	iadd			= 0x60;			// value1, value2 ?
-															// result adds
-	// two ints together
-	final static short	ladd			= 0x61;			// value1, value2 ?
-															// result add
-	// two longs
-	final static short	fadd			= 0x62;			// value1, value2 ?
-															// result adds
-	// two floats
-	final static short	dadd			= 0x63;			// value1, value2 ?
-															// result adds
-	// two doubles
-	final static short	isub			= 0x64;			// value1, value2 ?
-															// result int
-	// subtract
-	final static short	lsub			= 0x65;			// value1, value2 ?
-															// result
-	// subtract two longs
-	final static short	fsub			= 0x66;			// value1, value2 ?
-															// result
-	// subtracts two floats
-	final static short	dsub			= 0x67;			// value1, value2 ?
-															// result
-	// subtracts a double from
-	// another
-	final static short	imul			= 0x68;			// value1, value2 ?
-															// result
-	// multiply two integers
-	final static short	lmul			= 0x69;			// value1, value2 ?
-															// result
-	// multiplies two longs
-	final static short	irem			= 0x70;			// value1, value2 ?
-															// result
-	// logical int remainder
-	final static short	lrem			= 0x71;			// value1, value2 ?
-															// result
-	// remainder of division of two
-	// longs
-	final static short	frem			= 0x72;			// value1, value2 ?
-															// result gets
-	// the remainder from a division
-	// between two floats
-	final static short	drem			= 0x73;			// value1, value2 ?
-															// result gets
-	// the remainder from a division
-	// between two doubles
-	final static short	ineg			= 0x74;			// value ? result
-															// negate
-															// int
-	final static short	lneg			= 0x75;			// value ? result
-															// negates a long
-	final static short	fneg			= 0x76;			// value ? result
-															// negates a
-	// float
-	final static short	dneg			= 0x77;			// value ? result
-															// negates a
-	// double
-	final static short	ishl			= 0x78;			// value1, value2 ?
-															// result int
-	// shift left
-	final static short	lshl			= 0x79;			// value1, value2 ?
-															// result
-	// bitwise shift left of a long
-	// value1 by value2 positions
-	final static short	ior				= 0x80;			// value1, value2 ?
-															// result
-	// logical int or
-	final static short	lor				= 0x81;			// value1, value2 ?
-															// result
-	// bitwise or of two longs
-	final static short	ixor			= 0x82;			// value1, value2 ?
-															// result int
-	// xor
-	final static short	lxor			= 0x83;			// value1, value2 ?
-															// result
-	// bitwise exclusive or of two
-	// longs
-	final static short	iinc			= 0x84;			// index, const [No
-															// change]
-	// increment local variable
-	// #index by signed byte const
-	final static short	i2l				= 0x85;			// value ? result
-															// converts an
-	// int into a long
-	final static short	i2f				= 0x86;			// value ? result
-															// converts an
-	// int into a float
-	final static short	i2d				= 0x87;			// value ? result
-															// converts an
-	// int into a double
-	final static short	l2i				= 0x88;			// value ? result
-															// converts a
-	// long to an int
-	final static short	l2f				= 0x89;			// value ? result
-															// converts a
-	// long to a float
-	final static short	d2f				= 0x90;			// value ? result
-															// converts a
-	// double to a float
-	final static short	i2b				= 0x91;			// value ? result
-															// converts an
-	// int into a byte
-	final static short	i2c				= 0x92;			// value ? result
-															// converts an
-	// int into a character
-	final static short	i2s				= 0x93;			// value ? result
-															// converts an
-	// int into a short
-	final static short	lcmp			= 0x94;			// value1, value2 ?
-															// result
-	// compares two longs values
-	final static short	fcmpl			= 0x95;			// value1, value2 ?
-															// result
-	// compares two floats
-	final static short	fcmpg			= 0x96;			// value1, value2 ?
-															// result
-	// compares two floats
-	final static short	dcmpl			= 0x97;			// value1, value2 ?
-															// result
-	// compares two doubles
-	final static short	dcmpg			= 0x98;			// value1, value2 ?
-															// result
-	// compares two doubles
-	final static short	ifeq			= 0x99;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is 0, branch
-	// to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	lconst_1		= 0x0a;			// ? 1L pushes the
-															// long
-															// 1 onto
-	// the stack
-	final static short	fconst_0		= 0x0b;			// ? 0.0f pushes
-															// 0.0f on
-															// the
-	// stack
-	final static short	fconst_1		= 0x0c;			// ? 1.0f pushes
-															// 1.0f on
-															// the
-	// stack
-	final static short	fconst_2		= 0x0d;			// ? 2.0f pushes
-															// 2.0f on
-															// the
-	// stack
-	final static short	dconst_0		= 0x0e;			// ? 0.0 pushes the
-															// constant 0.0
-	// onto the stack
-	final static short	dconst_1		= 0x0f;			// ? 1.0 pushes the
-															// constant 1.0
-	// onto the stack
-	final static short	iload_0			= 0x1a;			// ? value loads an
-															// int
-															// value
-	// from variable 0
-	final static short	iload_1			= 0x1b;			// ? value loads an
-															// int
-															// value
-	// from variable 1
-	final static short	iload_2			= 0x1c;			// ? value loads an
-															// int
-															// value
-	// from variable 2
-	final static short	iload_3			= 0x1d;			// ? value loads an
-															// int
-															// value
-	// from variable 3
-	final static short	lload_0			= 0x1e;			// ? value load a
-															// long
-															// value
-	// from a local variable 0
-	final static short	lload_1			= 0x1f;			// ? value load a
-															// long
-															// value
-	// from a local variable 1
-	final static short	aload_0			= 0x2a;			// ? objectref loads
-															// a
-															// reference
-	// onto the stack from local
-	// variable 0
-	final static short	aload_1			= 0x2b;			// ? objectref loads
-															// a
-															// reference
-	// onto the stack from local
-	// variable 1
-	final static short	aload_2			= 0x2c;			// ? objectref loads
-															// a
-															// reference
-	// onto the stack from local
-	// variable 2
-	final static short	aload_3			= 0x2d;			// ? objectref loads
-															// a
-															// reference
-	// onto the stack from local
-	// variable 3
-	final static short	iaload			= 0x2e;			// arrayref, index ?
-															// value loads
-	// an int from an array
-	final static short	laload			= 0x2f;			// arrayref, index ?
-															// value load
-	// a long from an array
-	final static short	astore			= 0x3a;			// index objectref ?
-															// stores a
-	// reference into a local
-	// variable #index
-	final static short	istore_0		= 0x3b;			// value ? store int
-															// value into
-	// variable 0
-	final static short	istore_1		= 0x3c;			// value ? store int
-															// value into
-	// variable 1
-	final static short	istore_2		= 0x3d;			// value ? store int
-															// value into
-	// variable 2
-	final static short	istore_3		= 0x3e;			// value ? store int
-															// value into
-	// variable 3
-	final static short	lstore_0		= 0x3f;			// value ? store a
-															// long
-															// value in
-	// a local variable 0
-	final static short	dstore_3		= 0x4a;			// value ? stores a
-															// double into
-	// local variable 3
-	final static short	astore_0		= 0x4b;			// objectref ?
-															// stores a
-	// reference into local variable
-	// 0
-	final static short	astore_1		= 0x4c;			// objectref ?
-															// stores a
-	// reference into local variable
-	// 1
-	final static short	astore_2		= 0x4d;			// objectref ?
-															// stores a
-	// reference into local variable
-	// 2
-	final static short	astore_3		= 0x4e;			// objectref ?
-															// stores a
-	// reference into local variable
-	// 3
-	final static short	iastore			= 0x4f;			// arrayref, index,
-															// value ?
-	// stores an int into an array
-	final static short	dup_x1			= 0x5a;			// value2, value1 ?
-															// value1,
-	// value2, value1 inserts a copy
-	// of the top value into the
-	// stack two values from the top
-	final static short	dup_x2			= 0x5b;			// value3, value2,
-															// value1 ?
-	// value1, value3, value2,
-	// value1 inserts a copy of the
-	// top value into the stack two
-	// (if value2 is double or long
-	// it takes up the entry of
-	// value3, too) or three values
-	// (if value2 is neither double
-	// nor long) from the top
-	final static short	dup2			= 0x5c;			// {value2, value1}
-															// ?
-															// {value2,
-	// value1}, {value2, value1}
-	// duplicate top two stack words
-	// (two values, if value1 is not
-	// double nor long; a single
-	// value, if value1 is double or
-	// long)
-	final static short	dup2_x1			= 0x5d;			// value3, {value2,
-															// value1} ?
-	// {value2, value1}, value3,
-	// {value2, value1} duplicate
-	// two words and insert beneath
-	// third word (see explanation
-	// above)
-	final static short	dup2_x2			= 0x5e;			// {value4, value3},
-															// {value2,
-	// value1} ? {value2, value1},
-	// {value4, value3}, {value2,
-	// value1} duplicate two words
-	// and insert beneath fourth
-	// word
-	final static short	swap			= 0x5f;			// value2, value1 ?
-															// value1,
-	// value2 swaps two top words on
-	// the stack (note that value1
-	// and value2 must not be double
-	// or long)
-	final static short	fmul			= 0x6a;			// value1, value2 ?
-															// result
-	// multiplies two floats
-	final static short	dmul			= 0x6b;			// value1, value2 ?
-															// result
-	// multiplies two doubles
-	final static short	idiv			= 0x6c;			// value1, value2 ?
-															// result
-	// divides two integers
-	final static short	ldiv			= 0x6d;			// value1, value2 ?
-															// result
-	// divide two longs
-	final static short	fdiv			= 0x6e;			// value1, value2 ?
-															// result
-	// divides two floats
-	final static short	ddiv			= 0x6f;			// value1, value2 ?
-															// result
-	// divides two doubles
-	final static short	ishr			= 0x7a;			// value1, value2 ?
-															// result int
-	// shift right
-	final static short	lshr			= 0x7b;			// value1, value2 ?
-															// result
-	// bitwise shift right of a long
-	// value1 by value2 positions
-	final static short	iushr			= 0x7c;			// value1, value2 ?
-															// result int
-	// shift right
-	final static short	lushr			= 0x7d;			// value1, value2 ?
-															// result
-	// bitwise shift right of a long
-	// value1 by value2 positions,
-	// unsigned
-	final static short	iand			= 0x7e;			// value1, value2 ?
-															// result
-	// performs a logical and on two
-	// integers
-	final static short	land			= 0x7f;			// value1, value2 ?
-															// result
-	// bitwise and of two longs
-	final static short	l2d				= 0x8a;			// value ? result
-															// converts a
-	// long to a double
-	final static short	f2i				= 0x8b;			// value ? result
-															// converts a
-	// float to an int
-	final static short	f2l				= 0x8c;			// value ? result
-															// converts a
-	// float to a long
-	final static short	f2d				= 0x8d;			// value ? result
-															// converts a
-	// float to a double
-	final static short	d2i				= 0x8e;			// value ? result
-															// converts a
-	// double to an int
-	final static short	d2l				= 0x8f;			// value ? result
-															// converts a
-	// double to a long
-	final static short	ifne			= 0x9a;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is not 0,
-	// branch to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	iflt			= 0x9b;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is less than
-	// 0, branch to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	ifge			= 0x9c;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is greater
-	// than or equal to 0, branch to
-	// instruction at branchoffset
-	// (signed short constructed
-	// from unsigned bytes
-	// branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	ifgt			= 0x9d;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is greater
-	// than 0, branch to instruction
-	// at branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	ifle			= 0x9e;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is less than
-	// or equal to 0, branch to
-	// instruction at branchoffset
-	// (signed short constructed
-	// from unsigned bytes
-	// branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_icmpeq		= 0x9f;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if ints are
-	// equal, branch to instruction
-	// at branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_icmpne		= 0xa0;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if ints are
-	// not equal, branch to
-	// instruction at branchoffset
-	// (signed short constructed
-	// from unsigned bytes
-	// branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_icmplt		= 0xa1;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if value1 is
-	// less than value2, branch to
-	// instruction at branchoffset
-	// (signed short constructed
-	// from unsigned bytes
-	// branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_icmpge		= 0xa2;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if value1 is
-	// greater than or equal to
-	// value2, branch to instruction
-	// at branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_icmpgt		= 0xa3;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if value1 is
-	// greater than value2, branch
-	// to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_icmple		= 0xa4;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if value1 is
-	// less than or equal to value2,
-	// branch to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_acmpeq		= 0xa5;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if
-	// references are equal, branch
-	// to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	if_acmpne		= 0xa6;			// branchbyte1,
-															// branchbyte2
-	// value1, value2 ? if
-	// references are not equal,
-	// branch to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	goto_			= 0xa7;			// branchbyte1,
-															// branchbyte2 [no
-	// change] goes to another
-	// instruction at branchoffset
-	// (signed short constructed
-	// from unsigned bytes
-	// branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	jsr				= 0xa8;			// branchbyte1,
-															// branchbyte2 ?
-	// address jump to subroutine at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2) and place the
-	// return address on the stack
-	final static short	ret				= 0xa9;			// index [No change]
-															// continue
-	// execution from address taken
-	// from a local variable #index
-	// (the asymmetry with jsr is
-	// intentional)
-	final static short	tableswitch		= 0xaa;			// [0-3 bytes
-															// padding],
-	// defaultbyte1, defaultbyte2,
-	// defaultbyte3, defaultbyte4,
-	// lowbyte1, lowbyte2, lowbyte3,
-	// lowbyte4, highbyte1,
-	// highbyte2, highbyte3,
-	// highbyte4, jump offsets...
-	// index ? continue execution
-	// from an address in the table
-	// at offset index
-	final static short	lookupswitch	= 0xab;			// <0-3 bytes
-															// padding>,
-	// defaultbyte1, defaultbyte2,
-	// defaultbyte3, defaultbyte4,
-	// npairs1, npairs2, npairs3,
-	// npairs4, match-offset
-	// pairs... key ? a target
-	// address is looked up from a
-	// table using a key and
-	// execution continues from the
-	// instruction at that address
-	final static short	ireturn			= 0xac;			// value ? [empty]
-															// returns an
-	// integer from a method
-	final static short	lreturn			= 0xad;			// value ? [empty]
-															// returns a
-	// long value
-	final static short	freturn			= 0xae;			// value ? [empty]
-															// returns a
-	// float
-	final static short	dreturn			= 0xaf;			// value ? [empty]
-															// returns a
-	// double from a method
-	final static short	areturn			= 0xb0;			// objectref ?
-															// [empty]
-															// returns a
-	// reference from a method
-	final static short	return_			= 0xb1;			// ? [empty] return
-															// void
-															// from
-	// method
-	final static short	getstatic		= 0xb2;			// index1, index2 ?
-															// value gets a
-	// static field value of a
-	// class, where the field is
-	// identified by field reference
-	// in the constant pool index
-	// (index1 << 8 + index2)
-	final static short	putstatic		= 0xb3;			// indexbyte1,
-															// indexbyte2 value
-	// ? set static field to value
-	// in a class, where the field
-	// is identified by a field
-	// reference index in constant
-	// pool (indexbyte1 << 8 +
-	// indexbyte2)
-	final static short	getfield		= 0xb4;			// index1, index2
-															// objectref ?
-	// value gets a field value of
-	// an object objectref, where
-	// the field is identified by
-	// field reference in the
-	// constant pool index (index1
-	// << 8 + index2)
-	final static short	putfield		= 0xb5;			// indexbyte1,
-															// indexbyte2
-	// objectref, value ? set field
-	// to value in an object
-	// objectref, where the field is
-	// identified by a field
-	// reference index in constant
-	// pool (indexbyte1 << 8 +
-	// indexbyte2)
-	final static short	invokevirtual	= 0xb6;			// indexbyte1,
-															// indexbyte2
-	// objectref, [arg1, arg2, ...]
-	// ? invoke virtual method on
-	// object objectref, where the
-	// method is identified by
-	// method reference index in
-	// constant pool (indexbyte1 <<
-	// 8 + indexbyte2)
-	final static short	invokespecial	= 0xb7;			// indexbyte1,
-															// indexbyte2
-	// objectref, [arg1, arg2, ...]
-	// ? invoke instance method on
-	// object objectref, where the
-	// method is identified by
-	// method reference index in
-	// constant pool (indexbyte1 <<
-	// 8 + indexbyte2)
-	final static short	invokestatic	= 0xb8;			// indexbyte1,
-															// indexbyte2 [arg1,
-	// arg2, ...] ? invoke a static
-	// method, where the method is
-	// identified by method
-	// reference index in constant
-	// pool (indexbyte1 << 8 +
-	// indexbyte2)
-	final static short	invokeinterface	= 0xb9;			// indexbyte1,
-															// indexbyte2,
-	// count, 0 objectref, [arg1,
-	// arg2, ...] ? invokes an
-	// interface method on object
-	// objectref, where the
-	// interface method is
-	// identified by method
-	// reference index in constant
-	// pool (indexbyte1 << 8 +
-	// indexbyte2)
-	final static short	xxxunusedxxx	= 0xba;			// this opcode is
-															// reserved "for
-	// historical reasons"
-	final static short	new_			= 0xbb;			// indexbyte1,
-															// indexbyte2 ?
-	// objectref creates new object
-	// of type identified by class
-	// reference in constant pool
-	// index (indexbyte1 << 8 +
-	// indexbyte2)
-	final static short	newarray		= 0xbc;			// atype count ?
-															// arrayref
-	// creates new array with count
-	// elements of primitive type
-	// identified by atype
-	final static short	anewarray		= 0xbd;			// indexbyte1,
-															// indexbyte2 count
-	// ? arrayref creates a new
-	// array of references of length
-	// count and component type
-	// identified by the class
-	// reference index (indexbyte1
-	// << 8 + indexbyte2) in the
-	// constant pool
-	final static short	arraylength		= 0xbe;			// arrayref ? length
-															// gets the
-	// length of an array
-	final static short	athrow			= 0xbf;			// objectref ?
-															// [empty],
-	// objectref throws an error or
-	// exception (notice that the
-	// rest of the stack is cleared,
-	// leaving only a reference to
-	// the Throwable)
-	final static short	checkcast		= 0xc0;			// indexbyte1,
-															// indexbyte2
-	// objectref ? objectref checks
-	// whether an objectref is of a
-	// certain type, the class
-	// reference of which is in the
-	// constant pool at index
-	// (indexbyte1 << 8 +
-	// indexbyte2)
-	final static short	instanceof_		= 0xc1;			// indexbyte1,
-															// indexbyte2
-	// objectref ? result determines
-	// if an object objectref is of
-	// a given type, identified by
-	// class reference index in
-	// constant pool (indexbyte1 <<
-	// 8 + indexbyte2)
-	final static short	monitorenter	= 0xc2;			// objectref ? enter
-															// monitor for
-	// object ("grab the lock" -
-	// start of synchronized()
-	// section)
-	final static short	monitorexit		= 0xc3;			// objectref ? exit
-															// monitor for
-	// object ("release the lock" -
-	// end of synchronized()
-	// section)
-	final static short	wide			= 0xc4;			// opcode,
-															// indexbyte1,
-	// indexbyte2
-	final static short	multianewarray	= 0xc5;			// indexbyte1,
-															// indexbyte2,
-	// dimensions count1,
-	// [count2,...] ? arrayref
-	// create a new array of
-	// dimensions dimensions with
-	// elements of type identified
-	// by class reference in
-	// constant pool index
-	// (indexbyte1 << 8 +
-	// indexbyte2); the sizes of
-	// each dimension is identified
-	// by count1, [count2, etc]
-	final static short	ifnull			= 0xc6;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is null,
-	// branch to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	ifnonnull		= 0xc7;			// branchbyte1,
-															// branchbyte2
-	// value ? if value is not null,
-	// branch to instruction at
-	// branchoffset (signed short
-	// constructed from unsigned
-	// bytes branchbyte1 << 8 +
-	// branchbyte2)
-	final static short	goto_w			= 0xc8;			// branchbyte1,
-															// branchbyte2,
-	// branchbyte3, branchbyte4 [no
-	// change] goes to another
-	// instruction at branchoffset
-	// (signed int constructed from
-	// unsigned bytes branchbyte1 <<
-	// 24 + branchbyte2 << 16 +
-	// branchbyte3 << 8 +
-	// branchbyte4)
-	final static short	jsr_w			= 0xc9;			// branchbyte1,
-															// branchbyte2,
-	// branchbyte3, branchbyte4 ?
-	// address jump to subroutine at
-	// branchoffset (signed int
-	// constructed from unsigned
-	// bytes branchbyte1 << 24 +
-	// branchbyte2 << 16 +
-	// branchbyte3 << 8 +
-	// branchbyte4) and place the
-	// return address on the stack
-	final static short	breakpoint		= 0xca;			// reserved for
-															// breakpoints in
-	// Java debuggers; should not
-	// appear in any class file
-	final static short	impdep1			= 0xfe;			// reserved for
-	// implementation-dependent
-	// operations within debuggers;
-	// should not appear in any
-	// class file
-	final static short	impdep2			= 0xff;			// reserved for
-	// implementation-dependent
-	// operations within debuggers;
-	// should not appear in any
-	// class file
-
-	final static byte	OFFSETS[]		= new byte[256];
-
-	static {
-		OFFSETS[bipush] = 1; // byte ? value pushes a byte onto the
-		// stack as an integer value
-		OFFSETS[sipush] = 2; // byte1, byte2 ? value pushes a signed
-		// integer (byte1 << 8 + byte2) onto the
-		// stack
-		OFFSETS[ldc] = 1; // index ? value pushes a constant
-		// #index from a constant pool (String,
-		// int, float or class type) onto the
-		// stack
-		OFFSETS[ldc_w] = 2; // indexbyte1, indexbyte2 ? value pushes
-		// a constant #index from a constant
-		// pool (String, int, float or class
-		// type) onto the stack (wide index is
-		// constructed as indexbyte1 << 8 +
-		// indexbyte2)
-		OFFSETS[ldc2_w] = 2; // indexbyte1, indexbyte2 ? value pushes
-		// a constant #index from a constant
-		// pool (double or long) onto the stack
-		// (wide index is constructed as
-		// indexbyte1 << 8 + indexbyte2)
-		OFFSETS[iload] = 1; // index ? value loads an int value from
-		// a variable #index
-		OFFSETS[lload] = 1; // index ? value load a long value from
-		// a local variable #index
-		OFFSETS[fload] = 1; // index ? value loads a float value
-		// from a local variable #index
-		OFFSETS[dload] = 1; // index ? value loads a double value
-		// from a local variable #index
-		OFFSETS[aload] = 1; // index ? objectref loads a reference
-		// onto the stack from a local variable
-		// #index
-		OFFSETS[istore] = 1; // index value ? store int value into
-		// variable #index
-		OFFSETS[lstore] = 1; // index value ? store a long value in a
-		// local variable #index
-		OFFSETS[fstore] = 1; // index value ? stores a float value
-		// into a local variable #index
-		OFFSETS[dstore] = 1; // index value ? stores a double value
-		// into a local variable #index
-		OFFSETS[iinc] = 2; // index, const [No change] increment
-		// local variable #index by signed byte
-		// const
-		OFFSETS[ifeq] = 2; // branchbyte1, branchbyte2 value ? if
-		// value is 0, branch to instruction at
-		// branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[astore] = 1; // index objectref ? stores a reference
-		// into a local variable #index
-		OFFSETS[ifne] = 2; // branchbyte1, branchbyte2 value ? if
-		// value is not 0, branch to instruction
-		// at branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[iflt] = 2; // branchbyte1, branchbyte2 value ? if
-		// value is less than 0, branch to
-		// instruction at branchoffset (signed
-		// short constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[ifge] = 2; // branchbyte1, branchbyte2 value ? if
-		// value is greater than or equal to 0,
-		// branch to instruction at branchoffset
-		// (signed short constructed from
-		// unsigned bytes branchbyte1 << 8 +
-		// branchbyte2)
-		OFFSETS[ifgt] = 2; // branchbyte1, branchbyte2 value ? if
-		// value is greater than 0, branch to
-		// instruction at branchoffset (signed
-		// short constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[ifle] = 2; // branchbyte1, branchbyte2 value ? if
-		// value is less than or equal to 0,
-		// branch to instruction at branchoffset
-		// (signed short constructed from
-		// unsigned bytes branchbyte1 << 8 +
-		// branchbyte2)
-		OFFSETS[if_icmpeq] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if ints are equal,
-		// branch to instruction at
-		// branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[if_icmpne] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if ints are not equal,
-		// branch to instruction at
-		// branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[if_icmplt] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if value1 is less than
-		// value2, branch to instruction at
-		// branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[if_icmpge] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if value1 is greater
-		// than or equal to value2, branch
-		// to instruction at branchoffset
-		// (signed short constructed from
-		// unsigned bytes branchbyte1 << 8 +
-		// branchbyte2)
-		OFFSETS[if_icmpgt] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if value1 is greater
-		// than value2, branch to
-		// instruction at branchoffset
-		// (signed short constructed from
-		// unsigned bytes branchbyte1 << 8 +
-		// branchbyte2)
-		OFFSETS[if_icmple] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if value1 is less than
-		// or equal to value2, branch to
-		// instruction at branchoffset
-		// (signed short constructed from
-		// unsigned bytes branchbyte1 << 8 +
-		// branchbyte2)
-		OFFSETS[if_acmpeq] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if references are equal,
-		// branch to instruction at
-		// branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[if_acmpne] = 2; // branchbyte1, branchbyte2 value1,
-		// value2 ? if references are not
-		// equal, branch to instruction at
-		// branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[goto_] = 2; // branchbyte1, branchbyte2 [no change]
-		// goes to another instruction at
-		// branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[jsr] = 2; // branchbyte1, branchbyte2 ? address
-		// jump to subroutine at branchoffset
-		// (signed short constructed from
-		// unsigned bytes branchbyte1 << 8 +
-		// branchbyte2) and place the return
-		// address on the stack
-		OFFSETS[ret] = 1; // index [No change] continue execution
-		// from address taken from a local
-		// variable #index (the asymmetry with
-		// jsr is intentional)
-		OFFSETS[tableswitch] = -1; // [0-3 bytes padding],
-		// defaultbyte1, defaultbyte2,
-		// defaultbyte3, defaultbyte4,
-		// lowbyte1, lowbyte2, lowbyte3,
-		// lowbyte4, highbyte1,
-		// highbyte2, highbyte3,
-		// highbyte4, jump offsets...
-		// index ? continue execution
-		// from an address in the table
-		// at offset index
-		OFFSETS[lookupswitch] = -1; // <0-3 bytes padding>,
-		// defaultbyte1, defaultbyte2,
-		// defaultbyte3, defaultbyte4,
-		// npairs1, npairs2, npairs3,
-		// npairs4, match-offset
-		// pairs... key ? a target
-		// address is looked up from a
-		// table using a key and
-		// execution continues from the
-		// instruction at that address
-		OFFSETS[getstatic] = 2; // index1, index2 ? value gets a
-		// static field value of a class,
-		// where the field is identified by
-		// field reference in the constant
-		// pool index (index1 << 8 + index2)
-		OFFSETS[putstatic] = 2; // indexbyte1, indexbyte2 value ?
-		// set static field to value in a
-		// class, where the field is
-		// identified by a field reference
-		// index in constant pool
-		// (indexbyte1 << 8 + indexbyte2)
-		OFFSETS[getfield] = 2; // index1, index2 objectref ? value
-		// gets a field value of an object
-		// objectref, where the field is
-		// identified by field reference in
-		// the constant pool index (index1
-		// << 8 + index2)
-		OFFSETS[putfield] = 2; // indexbyte1, indexbyte2 objectref,
-		// value ? set field to value in an
-		// object objectref, where the field
-		// is identified by a field
-		// reference index in constant pool
-		// (indexbyte1 << 8 + indexbyte2)
-		OFFSETS[invokevirtual] = 2; // indexbyte1, indexbyte2
-		// objectref, [arg1, arg2, ...]
-		// ? invoke virtual method on
-		// object objectref, where the
-		// method is identified by
-		// method reference index in
-		// constant pool (indexbyte1 <<
-		// 8 + indexbyte2)
-		OFFSETS[invokespecial] = 2; // indexbyte1, indexbyte2
-		// objectref, [arg1, arg2, ...]
-		// ? invoke instance method on
-		// object objectref, where the
-		// method is identified by
-		// method reference index in
-		// constant pool (indexbyte1 <<
-		// 8 + indexbyte2)
-		OFFSETS[invokestatic] = 2; // indexbyte1, indexbyte2 [arg1,
-		// arg2, ...] ? invoke a static
-		// method, where the method is
-		// identified by method
-		// reference index in constant
-		// pool (indexbyte1 << 8 +
-		// indexbyte2)
-		OFFSETS[invokeinterface] = 2; // indexbyte1, indexbyte2,
-		// count, 0 objectref,
-		// [arg1, arg2, ...] ?
-		// invokes an interface
-		// method on object
-		// objectref, where the
-		// interface method is
-		// identified by method
-		// reference index in
-		// constant pool (indexbyte1
-		// << 8 + indexbyte2)
-		OFFSETS[new_] = 2; // indexbyte1, indexbyte2 ? objectref
-		// creates new object of type identified
-		// by class reference in constant pool
-		// index (indexbyte1 << 8 + indexbyte2)
-		OFFSETS[newarray] = 1; // atype count ? arrayref creates
-		// new array with count elements of
-		// primitive type identified by
-		// atype
-		OFFSETS[anewarray] = 2; // indexbyte1, indexbyte2 count ?
-		// arrayref creates a new array of
-		// references of length count and
-		// component type identified by the
-		// class reference index (indexbyte1
-		// << 8 + indexbyte2) in the
-		// constant pool
-		OFFSETS[checkcast] = 2; // indexbyte1, indexbyte2 objectref
-		// ? objectref checks whether an
-		// objectref is of a certain type,
-		// the class reference of which is
-		// in the constant pool at index
-		// (indexbyte1 << 8 + indexbyte2)
-		OFFSETS[instanceof_] = 2; // indexbyte1, indexbyte2 objectref
-		// ? result determines if an object
-		// objectref is of a given type,
-		// identified by class reference
-		// index in constant pool
-		// (indexbyte1 << 8 + indexbyte2)
-		OFFSETS[wide] = 3; // opcode, indexbyte1, indexbyte2
-		OFFSETS[multianewarray] = 3; // indexbyte1, indexbyte2,
-		// dimensions count1,
-		// [count2,...] ? arrayref
-		// create a new array of
-		// dimensions dimensions with
-		// elements of type identified
-		// by class reference in
-		// constant pool index
-		// (indexbyte1 << 8 +
-		// indexbyte2); the sizes of
-		// each dimension is identified
-		// by count1, [count2, etc]
-		OFFSETS[ifnull] = 2; // branchbyte1, branchbyte2 value ? if
-		// value is null, branch to instruction
-		// at branchoffset (signed short
-		// constructed from unsigned bytes
-		// branchbyte1 << 8 + branchbyte2)
-		OFFSETS[ifnonnull] = 2; // branchbyte1, branchbyte2 value ?
-		// if value is not null, branch to
-		// instruction at branchoffset
-		// (signed short constructed from
-		// unsigned bytes branchbyte1 << 8 +
-		// branchbyte2)
-		OFFSETS[goto_w] = 4; // branchbyte1, branchbyte2,
-		// branchbyte3, branchbyte4 [no change]
-		// goes to another instruction at
-		// branchoffset (signed int constructed
-		// from unsigned bytes branchbyte1 << 24
-		// + branchbyte2 << 16 + branchbyte3 <<
-		// 8 + branchbyte4)
-		OFFSETS[jsr_w] = 4; // branchbyte1, branchbyte2,
-		// branchbyte3, branchbyte4 ? address
-		// jump to subroutine at branchoffset
-		// (signed int constructed from unsigned
-		// bytes branchbyte1 << 24 + branchbyte2
-		// << 16 + branchbyte3 << 8 +
-		// branchbyte4) and place the return
-		// address on the stack
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Packages.java b/bundleplugin/src/main/java/aQute/lib/osgi/Packages.java
deleted file mode 100644
index 64e4a4e..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Packages.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package aQute.lib.osgi;
-
-import java.util.*;
-
-import aQute.lib.osgi.Descriptors.PackageRef;
-import aQute.libg.header.*;
-
-public class Packages implements Map<PackageRef,Attrs> {
-	private LinkedHashMap<PackageRef,Attrs>	map;
-	static Map<PackageRef,Attrs>			EMPTY	= Collections.emptyMap();
-
-	public Packages(Packages other) {
-		if (other.map != null) {
-			map = new LinkedHashMap<Descriptors.PackageRef,Attrs>(other.map);
-		}
-	}
-
-	public Packages() {}
-
-	public void clear() {
-		if (map != null)
-			map.clear();
-	}
-
-	public boolean containsKey(PackageRef name) {
-		if (map == null)
-			return false;
-
-		return map.containsKey(name);
-	}
-
-	@Deprecated
-	public boolean containsKey(Object name) {
-		assert name instanceof PackageRef;
-		if (map == null)
-			return false;
-
-		return map.containsKey(name);
-	}
-
-	public boolean containsValue(Attrs value) {
-		if (map == null)
-			return false;
-
-		return map.containsValue(value);
-	}
-
-	@Deprecated
-	public boolean containsValue(Object value) {
-		assert value instanceof Attrs;
-		if (map == null)
-			return false;
-
-		return map.containsValue(value);
-	}
-
-	public Set<java.util.Map.Entry<PackageRef,Attrs>> entrySet() {
-		if (map == null)
-			return EMPTY.entrySet();
-
-		return map.entrySet();
-	}
-
-	@Deprecated
-	public Attrs get(Object key) {
-		assert key instanceof PackageRef;
-		if (map == null)
-			return null;
-
-		return map.get(key);
-	}
-
-	public Attrs get(PackageRef key) {
-		if (map == null)
-			return null;
-
-		return map.get(key);
-	}
-
-	public boolean isEmpty() {
-		return map == null || map.isEmpty();
-	}
-
-	public Set<PackageRef> keySet() {
-		if (map == null)
-			return EMPTY.keySet();
-
-		return map.keySet();
-	}
-
-	public Attrs put(PackageRef ref) {
-		Attrs attrs = get(ref);
-		if (attrs != null)
-			return attrs;
-
-		attrs = new Attrs();
-		put(ref, attrs);
-		return attrs;
-	}
-
-	public Attrs put(PackageRef key, Attrs value) {
-		if (map == null)
-			map = new LinkedHashMap<PackageRef,Attrs>();
-
-		return map.put(key, value);
-	}
-
-	public void putAll(Map< ? extends PackageRef, ? extends Attrs> map) {
-		if (this.map == null) {
-			if (map.isEmpty())
-				return;
-			this.map = new LinkedHashMap<PackageRef,Attrs>();
-		}
-		this.map.putAll(map);
-	}
-
-	public void putAllIfAbsent(Map<PackageRef, ? extends Attrs> map) {
-		for (Map.Entry<PackageRef, ? extends Attrs> entry : map.entrySet()) {
-			if (!containsKey(entry.getKey()))
-				put(entry.getKey(), entry.getValue());
-		}
-	}
-
-	@Deprecated
-	public Attrs remove(Object var0) {
-		assert var0 instanceof PackageRef;
-		if (map == null)
-			return null;
-
-		return map.remove(var0);
-	}
-
-	public Attrs remove(PackageRef 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 Attrs getByFQN(String s) {
-		if (map == null)
-			return null;
-
-		for (Map.Entry<PackageRef,Attrs> pr : map.entrySet()) {
-			if (pr.getKey().getFQN().equals(s))
-				return pr.getValue();
-		}
-		return null;
-	}
-
-	public Attrs getByBinaryName(String s) {
-		if (map == null)
-			return null;
-
-		for (Map.Entry<PackageRef,Attrs> pr : map.entrySet()) {
-			if (pr.getKey().getBinary().equals(s))
-				pr.getValue();
-		}
-		return null;
-	}
-
-	public boolean containsFQN(String s) {
-		return getByFQN(s) != null;
-	}
-
-	public boolean containsBinaryName(String s) {
-		return getByFQN(s) != null;
-	}
-
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		append(sb);
-		return sb.toString();
-	}
-
-	public void append(StringBuilder sb) {
-		String del = "";
-		for (Map.Entry<PackageRef,Attrs> s : entrySet()) {
-			sb.append(del);
-			sb.append(s.getKey());
-			if (!s.getValue().isEmpty()) {
-				sb.append(';');
-				s.getValue().append(sb);
-			}
-			del = ",";
-		}
-	}
-
-	public void merge(PackageRef ref, boolean unique, Attrs... attrs) {
-		if (unique) {
-			while (containsKey(ref))
-				ref = ref.getDuplicate();
-		}
-
-		Attrs org = put(ref);
-		for (Attrs a : attrs) {
-			if (a != null)
-				org.putAll(a);
-		}
-	}
-
-	public Attrs get(PackageRef packageRef, Attrs deflt) {
-		Attrs mine = get(packageRef);
-		if (mine != null)
-			return mine;
-
-		return deflt;
-	}
-
-	@Deprecated
-	public boolean equals(Object other) {
-		return super.equals(other);
-	}
-
-	@Deprecated
-	public int hashCode() {
-		return super.hashCode();
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/PreprocessResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/PreprocessResource.java
deleted file mode 100644
index 8b3f79e..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/PreprocessResource.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-
-public class PreprocessResource extends AbstractResource {
-	final Resource	resource;
-	final Processor	processor;
-
-	public PreprocessResource(Processor processor, Resource r) {
-		super(r.lastModified());
-		this.processor = processor;
-		this.resource = r;
-		setExtra(resource.getExtra());
-	}
-
-	protected byte[] getBytes() throws Exception {
-		ByteArrayOutputStream bout = new ByteArrayOutputStream(2000);
-		OutputStreamWriter osw = new OutputStreamWriter(bout, Constants.DEFAULT_CHARSET);
-		PrintWriter pw = new PrintWriter(osw);
-		InputStream in = null;
-		BufferedReader rdr = null;
-		try {
-			in = resource.openInputStream();
-			rdr = new BufferedReader(new InputStreamReader(in, "UTF8"));
-			String line = rdr.readLine();
-			while (line != null) {
-				line = processor.getReplacer().process(line);
-				pw.println(line);
-				line = rdr.readLine();
-			}
-			pw.flush();
-			byte[] data = bout.toByteArray();
-			return data;
-
-		}
-		finally {
-			if (rdr != null) {
-				rdr.close();
-			}
-			if (in != null) {
-				in.close();
-			}
-		}
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java b/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java
deleted file mode 100755
index ef4013f..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java
+++ /dev/null
@@ -1,1666 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.concurrent.*;
-import java.util.jar.*;
-import java.util.regex.*;
-
-import aQute.bnd.service.*;
-import aQute.lib.collections.*;
-import aQute.lib.io.*;
-import aQute.libg.generics.*;
-import aQute.libg.header.*;
-import aQute.service.reporter.*;
-
-public class Processor extends Domain implements Reporter, Registry, Constants, Closeable {
-
-	static ThreadLocal<Processor>	current			= new ThreadLocal<Processor>();
-	static ExecutorService			executor		= Executors.newCachedThreadPool();
-	static Random					random			= new Random();
-
-	// TODO handle include files out of date
-	// TODO make splitter skip eagerly whitespace so trim is not necessary
-	public final static String		LIST_SPLITTER	= "\\s*,\\s*";
-	final List<String>				errors			= new ArrayList<String>();
-	final List<String>				warnings		= new ArrayList<String>();
-	final Set<Object>				basicPlugins	= new HashSet<Object>();
-	private final Set<Closeable>	toBeClosed		= new HashSet<Closeable>();
-	Set<Object>						plugins;
-
-	boolean							pedantic;
-	boolean							trace;
-	boolean							exceptions;
-	boolean							fileMustExist	= true;
-
-	private File					base			= new File("").getAbsoluteFile();
-
-	Properties						properties;
-	private Macro					replacer;
-	private long					lastModified;
-	private File					propertiesFile;
-	private boolean					fixup			= true;
-	long							modified;
-	Processor						parent;
-	List<File>						included;
-
-	CL								pluginLoader;
-	Collection<String>				filter;
-	HashSet<String>					missingCommand;
-
-	public Processor() {
-		properties = new Properties();
-	}
-
-	public Processor(Properties parent) {
-		properties = new Properties(parent);
-	}
-
-	public Processor(Processor child) {
-		this(child.properties);
-		this.parent = child;
-	}
-
-	public void setParent(Processor processor) {
-		this.parent = processor;
-		Properties ext = new Properties(processor.properties);
-		ext.putAll(this.properties);
-		this.properties = ext;
-	}
-
-	public Processor getParent() {
-		return parent;
-	}
-
-	public Processor getTop() {
-		if (parent == null)
-			return this;
-		return parent.getTop();
-	}
-
-	public void getInfo(Reporter processor, String prefix) {
-		if (isFailOk())
-			addAll(warnings, processor.getErrors(), prefix);
-		else
-			addAll(errors, processor.getErrors(), prefix);
-		addAll(warnings, processor.getWarnings(), prefix);
-
-		processor.getErrors().clear();
-		processor.getWarnings().clear();
-	}
-
-	public void getInfo(Reporter processor) {
-		getInfo(processor, "");
-	}
-
-	private <T> void addAll(List<String> to, List< ? extends T> from, String prefix) {
-		for (T x : from) {
-			to.add(prefix + x);
-		}
-	}
-
-	/**
-	 * A processor can mark itself current for a thread.
-	 * 
-	 * @return
-	 */
-	private Processor current() {
-		Processor p = current.get();
-		if (p == null)
-			return this;
-		return p;
-	}
-
-	public SetLocation warning(String string, Object... args) {
-		Processor p = current();
-		String s = formatArrays(string, args);
-		if (!p.warnings.contains(s))
-			p.warnings.add(s);
-		p.signal();
-		return location(s);
-	}
-
-	public SetLocation error(String string, Object... args) {
-		Processor p = current();
-		try {
-			if (p.isFailOk())
-				return p.warning(string, args);
-			else {
-				String s = formatArrays(string, args == null ? new Object[0] : args);
-				if (!p.errors.contains(s))
-					p.errors.add(s);
-				return location(s);
-			}
-		}
-		finally {
-			p.signal();
-		}
-	}
-
-	public void progress(float progress, String format, Object... args) {
-		format = String.format("[%2d] %s", (int)progress, format);
-		trace(format, args);
-	}
-
-	public void progress(String format, Object... args) {
-		progress(-1f, format, args);
-	}
-
-	public SetLocation exception(Throwable t, String format, Object... args) {
-		return error(format, t, args);
-	}
-
-	public SetLocation error(String string, Throwable t, Object... args) {
-		Processor p = current();
-		try {
-			if (p.exceptions)
-				t.printStackTrace();
-			if (p.isFailOk()) {
-				return p.warning(string + ": " + t, args);
-			}
-			else {
-				p.errors.add("Exception: " + t.getMessage());
-				String s = formatArrays(string, args == null ? new Object[0] : args);
-				if (!p.errors.contains(s))
-					p.errors.add(s);
-				return location(s);
-			}
-		}
-		finally {
-			p.signal();
-		}
-	}
-
-	public void signal() {}
-
-	public List<String> getWarnings() {
-		return warnings;
-	}
-
-	public List<String> getErrors() {
-		return errors;
-	}
-
-	/**
-	 * Standard OSGi header parser.
-	 * 
-	 * @param value
-	 * @return
-	 */
-	static public Parameters parseHeader(String value, Processor logger) {
-		return new Parameters(value, logger);
-	}
-
-	public Parameters parseHeader(String value) {
-		return new Parameters(value, this);
-	}
-
-	public void addClose(Closeable jar) {
-		assert jar != null;
-		toBeClosed.add(jar);
-	}
-
-	public void removeClose(Closeable jar) {
-		assert jar != null;
-		toBeClosed.remove(jar);
-	}
-
-	public boolean isPedantic() {
-		return current().pedantic;
-	}
-
-	public void setPedantic(boolean pedantic) {
-		this.pedantic = pedantic;
-	}
-
-	public void use(Processor reporter) {
-		setPedantic(reporter.isPedantic());
-		setTrace(reporter.isTrace());
-		setBase(reporter.getBase());
-		setFailOk(reporter.isFailOk());
-	}
-
-	public static File getFile(File base, String file) {
-		return IO.getFile(base, file);
-	}
-
-	public File getFile(String file) {
-		return getFile(base, file);
-	}
-
-	/**
-	 * Return a list of plugins that implement the given class.
-	 * 
-	 * @param clazz
-	 *            Each returned plugin implements this class/interface
-	 * @return A list of plugins
-	 */
-	public <T> List<T> getPlugins(Class<T> clazz) {
-		List<T> l = new ArrayList<T>();
-		Set<Object> all = getPlugins();
-		for (Object plugin : all) {
-			if (clazz.isInstance(plugin))
-				l.add(clazz.cast(plugin));
-		}
-		return l;
-	}
-
-	/**
-	 * Returns the first plugin it can find of the given type.
-	 * 
-	 * @param <T>
-	 * @param clazz
-	 * @return
-	 */
-	public <T> T getPlugin(Class<T> clazz) {
-		Set<Object> all = getPlugins();
-		for (Object plugin : all) {
-			if (clazz.isInstance(plugin))
-				return clazz.cast(plugin);
-		}
-		return null;
-	}
-
-	/**
-	 * Return a list of plugins. Plugins are defined with the -plugin command.
-	 * They are class names, optionally associated with attributes. Plugins can
-	 * implement the Plugin interface to see these attributes. Any object can be
-	 * a plugin.
-	 * 
-	 * @return
-	 */
-	protected synchronized Set<Object> getPlugins() {
-		if (this.plugins != null)
-			return this.plugins;
-
-		missingCommand = new HashSet<String>();
-		Set<Object> list = new LinkedHashSet<Object>();
-
-		// The owner of the plugin is always in there.
-		list.add(this);
-		setTypeSpecificPlugins(list);
-
-		if (parent != null)
-			list.addAll(parent.getPlugins());
-
-		// We only use plugins now when they are defined on our level
-		// and not if it is in our parent. We inherit from our parent
-		// through the previous block.
-
-		if (properties.containsKey(PLUGIN)) {
-			String spe = getProperty(PLUGIN);
-			if (spe.equals(NONE))
-				return new LinkedHashSet<Object>();
-
-			String pluginPath = getProperty(PLUGINPATH);
-			loadPlugins(list, spe, pluginPath);
-		}
-
-		return this.plugins = list;
-	}
-
-	/**
-	 * @param list
-	 * @param spe
-	 */
-	protected void loadPlugins(Set<Object> list, String spe, String pluginPath) {
-		Parameters plugins = new Parameters(spe);
-		CL loader = getLoader();
-
-		// First add the plugin-specific paths from their path: directives
-		for (Entry<String,Attrs> entry : plugins.entrySet()) {
-			String key = removeDuplicateMarker(entry.getKey());
-			String path = entry.getValue().get(PATH_DIRECTIVE);
-			if (path != null) {
-				String parts[] = path.split("\\s*,\\s*");
-				try {
-					for (String p : parts) {
-						File f = getFile(p).getAbsoluteFile();
-						loader.add(f.toURI().toURL());
-					}
-				}
-				catch (Exception e) {
-					error("Problem adding path %s to loader for plugin %s. Exception: (%s)", path, key, e);
-				}
-			}
-		}
-
-		// Next add -pluginpath entries
-		if (pluginPath != null && pluginPath.length() > 0) {
-			StringTokenizer tokenizer = new StringTokenizer(pluginPath, ",");
-			while (tokenizer.hasMoreTokens()) {
-				String path = tokenizer.nextToken().trim();
-				try {
-					File f = getFile(path).getAbsoluteFile();
-					loader.add(f.toURI().toURL());
-				}
-				catch (Exception e) {
-					error("Problem adding path %s from global plugin path. Exception: %s", path, e);
-				}
-			}
-		}
-
-		// Load the plugins
-		for (Entry<String,Attrs> entry : plugins.entrySet()) {
-			String key = entry.getKey();
-
-			try {
-				trace("Using plugin %s", key);
-
-				// Plugins could use the same class with different
-				// parameters so we could have duplicate names Remove
-				// the ! added by the parser to make each name unique.
-				key = removeDuplicateMarker(key);
-
-				try {
-					Class< ? > c = loader.loadClass(key);
-					Object plugin = c.newInstance();
-					customize(plugin, entry.getValue());
-					list.add(plugin);
-				}
-				catch (Throwable t) {
-					// We can defer the error if the plugin specifies
-					// a command name. In that case, we'll verify that
-					// a bnd file does not contain any references to a
-					// plugin
-					// command. The reason this feature was added was
-					// to compile plugin classes with the same build.
-					String commands = entry.getValue().get(COMMAND_DIRECTIVE);
-					if (commands == null)
-						error("Problem loading the plugin: %s exception: (%s)", key, t);
-					else {
-						Collection<String> cs = split(commands);
-						missingCommand.addAll(cs);
-					}
-				}
-			}
-			catch (Throwable e) {
-				error("Problem loading the plugin: %s exception: (%s)", key, e);
-			}
-		}
-	}
-
-	protected void setTypeSpecificPlugins(Set<Object> list) {
-		list.add(executor);
-		list.add(random);
-		list.addAll(basicPlugins);
-	}
-
-	/**
-	 * @param plugin
-	 * @param entry
-	 */
-	protected <T> T customize(T plugin, Attrs map) {
-		if (plugin instanceof Plugin) {
-			if (map != null)
-				((Plugin) plugin).setProperties(map);
-
-			((Plugin) plugin).setReporter(this);
-		}
-		if (plugin instanceof RegistryPlugin) {
-			((RegistryPlugin) plugin).setRegistry(this);
-		}
-		return plugin;
-	}
-
-	public boolean isFailOk() {
-		String v = getProperty(Analyzer.FAIL_OK, null);
-		return v != null && v.equalsIgnoreCase("true");
-	}
-
-	public File getBase() {
-		return base;
-	}
-
-	public void setBase(File base) {
-		this.base = base;
-	}
-
-	public void clear() {
-		errors.clear();
-		warnings.clear();
-	}
-
-	public void trace(String msg, Object... parms) {
-		Processor p = current();
-		if (p.trace) {
-			System.err.printf("# " + msg + "%n", parms);
-		}
-	}
-
-	public <T> List<T> newList() {
-		return new ArrayList<T>();
-	}
-
-	public <T> Set<T> newSet() {
-		return new TreeSet<T>();
-	}
-
-	public static <K, V> Map<K,V> newMap() {
-		return new LinkedHashMap<K,V>();
-	}
-
-	public static <K, V> Map<K,V> newHashMap() {
-		return new LinkedHashMap<K,V>();
-	}
-
-	public <T> List<T> newList(Collection<T> t) {
-		return new ArrayList<T>(t);
-	}
-
-	public <T> Set<T> newSet(Collection<T> t) {
-		return new TreeSet<T>(t);
-	}
-
-	public <K, V> Map<K,V> newMap(Map<K,V> t) {
-		return new LinkedHashMap<K,V>(t);
-	}
-
-	public void close() {
-		for (Closeable c : toBeClosed) {
-			try {
-				c.close();
-			}
-			catch (IOException e) {
-				// Who cares?
-			}
-		}
-		toBeClosed.clear();
-	}
-
-	public String _basedir(@SuppressWarnings("unused") String args[]) {
-		if (base == null)
-			throw new IllegalArgumentException("No base dir set");
-
-		return base.getAbsolutePath();
-	}
-
-	/**
-	 * Property handling ...
-	 * 
-	 * @return
-	 */
-
-	public Properties getProperties() {
-		if (fixup) {
-			fixup = false;
-			begin();
-		}
-
-		return properties;
-	}
-
-	public String getProperty(String key) {
-		return getProperty(key, null);
-	}
-
-	public void mergeProperties(File file, boolean override) {
-		if (file.isFile()) {
-			try {
-				Properties properties = loadProperties(file);
-				mergeProperties(properties, override);
-			}
-			catch (Exception e) {
-				error("Error loading properties file: " + file);
-			}
-		} else {
-			if (!file.exists())
-				error("Properties file does not exist: " + file);
-			else
-				error("Properties file must a file, not a directory: " + file);
-		}
-	}
-
-	public void mergeProperties(Properties properties, boolean override) {
-		for (Enumeration< ? > e = properties.propertyNames(); e.hasMoreElements();) {
-			String key = (String) e.nextElement();
-			String value = properties.getProperty(key);
-			if (override || !getProperties().containsKey(key))
-				setProperty(key, value);
-		}
-	}
-
-	public void setProperties(Properties properties) {
-		doIncludes(getBase(), properties);
-		this.properties.putAll(properties);
-	}
-
-	public void addProperties(File file) throws Exception {
-		addIncluded(file);
-		Properties p = loadProperties(file);
-		setProperties(p);
-	}
-
-	public void addProperties(Map< ? , ? > properties) {
-		for (Entry< ? , ? > entry : properties.entrySet()) {
-			setProperty(entry.getKey().toString(), entry.getValue() + "");
-		}
-	}
-
-	public synchronized void addIncluded(File file) {
-		if (included == null)
-			included = new ArrayList<File>();
-		included.add(file);
-	}
-
-	/**
-	 * Inspect the properties and if you find -includes parse the line included
-	 * manifest files or properties files. The files are relative from the given
-	 * base, this is normally the base for the analyzer.
-	 * 
-	 * @param ubase
-	 * @param p
-	 * @param done
-	 * @throws IOException
-	 * @throws IOException
-	 */
-
-	private void doIncludes(File ubase, Properties p) {
-		String includes = p.getProperty(INCLUDE);
-		if (includes != null) {
-			includes = getReplacer().process(includes);
-			p.remove(INCLUDE);
-			Collection<String> clauses = new Parameters(includes).keySet();
-
-			for (String value : clauses) {
-				boolean fileMustExist = true;
-				boolean overwrite = true;
-				while (true) {
-					if (value.startsWith("-")) {
-						fileMustExist = false;
-						value = value.substring(1).trim();
-					} else if (value.startsWith("~")) {
-						// Overwrite properties!
-						overwrite = false;
-						value = value.substring(1).trim();
-					} else
-						break;
-				}
-				try {
-					File file = getFile(ubase, value).getAbsoluteFile();
-					if (!file.isFile() && fileMustExist) {
-						error("Included file " + file + (file.exists() ? " does not exist" : " is directory"));
-					} else
-						doIncludeFile(file, overwrite, p);
-				}
-				catch (Exception e) {
-					if (fileMustExist)
-						error("Error in processing included file: " + value, e);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param file
-	 * @param parent
-	 * @param done
-	 * @param overwrite
-	 * @throws FileNotFoundException
-	 * @throws IOException
-	 */
-	public void doIncludeFile(File file, boolean overwrite, Properties target) throws Exception {
-		doIncludeFile(file, overwrite, target, null);
-	}
-
-	/**
-	 * @param file
-	 * @param parent
-	 * @param done
-	 * @param overwrite
-	 * @param extensionName
-	 * @throws FileNotFoundException
-	 * @throws IOException
-	 */
-	public void doIncludeFile(File file, boolean overwrite, Properties target, String extensionName) throws Exception {
-		if (included != null && included.contains(file)) {
-			error("Cyclic or multiple include of " + file);
-		} else {
-			addIncluded(file);
-			updateModified(file.lastModified(), file.toString());
-			InputStream in = new FileInputStream(file);
-			try {
-				Properties sub;
-				if (file.getName().toLowerCase().endsWith(".mf")) {
-					sub = getManifestAsProperties(in);
-				} else
-					sub = loadProperties(in, file.getAbsolutePath());
-
-				doIncludes(file.getParentFile(), sub);
-				// make sure we do not override properties
-				for (Map.Entry< ? , ? > entry : sub.entrySet()) {
-					String key = (String) entry.getKey();
-					String value = (String) entry.getValue();
-
-					if (overwrite || !target.containsKey(key)) {
-						target.setProperty(key, value);
-					} else if (extensionName != null) {
-						String extensionKey = extensionName + "." + key;
-						if (!target.containsKey(extensionKey))
-							target.setProperty(extensionKey, value);
-					}
-				}
-			}
-			finally {
-				IO.close(in);
-			}
-		}
-	}
-
-	public void unsetProperty(String string) {
-		getProperties().remove(string);
-
-	}
-
-	public boolean refresh() {
-		plugins = null; // We always refresh our plugins
-
-		if (propertiesFile == null)
-			return false;
-
-		boolean changed = updateModified(propertiesFile.lastModified(), "properties file");
-		if (included != null) {
-			for (File file : included) {
-				if (changed)
-					break;
-
-				changed |= !file.exists() || updateModified(file.lastModified(), "include file: " + file);
-			}
-		}
-
-		if (changed) {
-			forceRefresh();
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * 
-	 */
-	public void forceRefresh() {
-		included = null;
-		properties.clear();
-		setProperties(propertiesFile, base);
-		propertiesChanged();
-	}
-
-	public void propertiesChanged() {}
-
-	/**
-	 * Set the properties by file. Setting the properties this way will also set
-	 * the base for this analyzer. After reading the properties, this will call
-	 * setProperties(Properties) which will handle the includes.
-	 * 
-	 * @param propertiesFile
-	 * @throws FileNotFoundException
-	 * @throws IOException
-	 */
-	public void setProperties(File propertiesFile) throws IOException {
-		propertiesFile = propertiesFile.getAbsoluteFile();
-		setProperties(propertiesFile, propertiesFile.getParentFile());
-	}
-
-	public void setProperties(File propertiesFile, File base) {
-		this.propertiesFile = propertiesFile.getAbsoluteFile();
-		setBase(base);
-		try {
-			if (propertiesFile.isFile()) {
-				// System.err.println("Loading properties " + propertiesFile);
-				long modified = propertiesFile.lastModified();
-				if (modified > System.currentTimeMillis() + 100) {
-					System.err.println("Huh? This is in the future " + propertiesFile);
-					this.modified = System.currentTimeMillis();
-				} else
-					this.modified = modified;
-
-				included = null;
-				Properties p = loadProperties(propertiesFile);
-				setProperties(p);
-			} else {
-				if (fileMustExist) {
-					error("No such properties file: " + propertiesFile);
-				}
-			}
-		}
-		catch (IOException e) {
-			error("Could not load properties " + propertiesFile);
-		}
-	}
-
-	protected void begin() {
-		if (isTrue(getProperty(PEDANTIC)))
-			setPedantic(true);
-	}
-
-	public static boolean isTrue(String value) {
-		if (value == null)
-			return false;
-
-		return !"false".equalsIgnoreCase(value);
-	}
-
-	/**
-	 * Get a property without preprocessing it with a proper default
-	 * 
-	 * @param headerName
-	 * @param deflt
-	 * @return
-	 */
-
-	public String getUnprocessedProperty(String key, String deflt) {
-		return getProperties().getProperty(key, deflt);
-	}
-
-	/**
-	 * Get a property with preprocessing it with a proper default
-	 * 
-	 * @param headerName
-	 * @param deflt
-	 * @return
-	 */
-	public String getProperty(String key, String deflt) {
-		String value = null;
-
-		Instruction ins = new Instruction(key);
-		if (!ins.isLiteral()) {
-			// Handle a wildcard key, make sure they're sorted
-			// for consistency
-			SortedList<String> sortedList = SortedList.fromIterator(iterator());
-			StringBuilder sb = new StringBuilder();
-			String del = "";
-			for (String k : sortedList) {
-				if (ins.matches(k)) {
-					String v = getProperty(k, null);
-					if (v != null) {
-						sb.append(del);
-						del = ",";
-						sb.append(v);
-					}
-				}
-			}
-			if (sb.length() == 0)
-				return deflt;
-
-			return sb.toString();
-		}
-
-		Processor source = this;
-
-		if (filter != null && filter.contains(key)) {
-			value = (String) getProperties().get(key);
-		} else {
-			while (source != null) {
-				value = (String) source.getProperties().get(key);
-				if (value != null)
-					break;
-
-				source = source.getParent();
-			}
-		}
-
-		if (value != null)
-			return getReplacer().process(value, source);
-		else if (deflt != null)
-			return getReplacer().process(deflt, this);
-		else
-			return null;
-	}
-
-	/**
-	 * Helper to load a properties file from disk.
-	 * 
-	 * @param file
-	 * @return
-	 * @throws IOException
-	 */
-	public Properties loadProperties(File file) throws IOException {
-		updateModified(file.lastModified(), "Properties file: " + file);
-		InputStream in = new FileInputStream(file);
-		try {
-			Properties p = loadProperties(in, file.getAbsolutePath());
-			return p;
-		}
-		finally {
-			in.close();
-		}
-	}
-
-	Properties loadProperties(InputStream in, String name) throws IOException {
-		int n = name.lastIndexOf('/');
-		if (n > 0)
-			name = name.substring(0, n);
-		if (name.length() == 0)
-			name = ".";
-
-		try {
-			Properties p = new Properties();
-			p.load(in);
-			return replaceAll(p, "\\$\\{\\.\\}", name);
-		}
-		catch (Exception e) {
-			error("Error during loading properties file: " + name + ", error:" + e);
-			return new Properties();
-		}
-	}
-
-	/**
-	 * Replace a string in all the values of the map. This can be used to
-	 * preassign variables that change. I.e. the base directory ${.} for a
-	 * loaded properties
-	 */
-
-	public static Properties replaceAll(Properties p, String pattern, String replacement) {
-		Properties result = new Properties();
-		for (Iterator<Map.Entry<Object,Object>> i = p.entrySet().iterator(); i.hasNext();) {
-			Map.Entry<Object,Object> entry = i.next();
-			String key = (String) entry.getKey();
-			String value = (String) entry.getValue();
-			value = value.replaceAll(pattern, replacement);
-			result.put(key, value);
-		}
-		return result;
-	}
-
-	/**
-	 * Print a standard Map based OSGi header.
-	 * 
-	 * @param exports
-	 *            map { name => Map { attribute|directive => value } }
-	 * @return the clauses
-	 * @throws IOException
-	 */
-	public static String printClauses(Map< ? , ? extends Map< ? , ? >> exports) throws IOException {
-		return printClauses(exports, false);
-	}
-
-	public static String printClauses(Map< ? , ? extends Map< ? , ? >> exports, @SuppressWarnings("unused") boolean checkMultipleVersions)
-			throws IOException {
-		StringBuilder sb = new StringBuilder();
-		String del = "";
-		for (Entry< ? , ? extends Map< ? , ? >> entry : exports.entrySet()) {
-			String name = entry.getKey().toString();
-			Map< ? , ? > clause = entry.getValue();
-
-			// We allow names to be duplicated in the input
-			// by ending them with '~'. This is necessary to use
-			// the package names as keys. However, we remove these
-			// suffixes in the output so that you can set multiple
-			// exports with different attributes.
-			String outname = removeDuplicateMarker(name);
-			sb.append(del);
-			sb.append(outname);
-			printClause(clause, sb);
-			del = ",";
-		}
-		return sb.toString();
-	}
-
-	public static void printClause(Map< ? , ? > map, StringBuilder sb) throws IOException {
-
-		for (Entry< ? , ? > entry : map.entrySet()) {
-			Object key = entry.getKey();
-			// Skip directives we do not recognize
-			if (key.equals(NO_IMPORT_DIRECTIVE) || key.equals(PROVIDE_DIRECTIVE) || key.equals(SPLIT_PACKAGE_DIRECTIVE)
-					|| key.equals(FROM_DIRECTIVE))
-				continue;
-
-			String value = ((String) entry.getValue()).trim();
-			sb.append(";");
-			sb.append(key);
-			sb.append("=");
-
-			quote(sb, value);
-		}
-	}
-
-	/**
-	 * @param sb
-	 * @param value
-	 * @return
-	 * @throws IOException
-	 */
-	public static boolean quote(Appendable sb, String value) throws IOException {
-		boolean clean = (value.length() >= 2 && value.charAt(0) == '"' && value.charAt(value.length() - 1) == '"')
-				|| Verifier.TOKEN.matcher(value).matches();
-		if (!clean)
-			sb.append("\"");
-		sb.append(value);
-		if (!clean)
-			sb.append("\"");
-		return clean;
-	}
-
-	public Macro getReplacer() {
-		if (replacer == null)
-			return replacer = new Macro(this, getMacroDomains());
-		return replacer;
-	}
-
-	/**
-	 * This should be overridden by subclasses to add extra macro command
-	 * domains on the search list.
-	 * 
-	 * @return
-	 */
-	protected Object[] getMacroDomains() {
-		return new Object[] {};
-	}
-
-	/**
-	 * Return the properties but expand all macros. This always returns a new
-	 * Properties object that can be used in any way.
-	 * 
-	 * @return
-	 */
-	public Properties getFlattenedProperties() {
-		return getReplacer().getFlattenedProperties();
-
-	}
-
-	/**
-	 * Return all inherited property keys
-	 * 
-	 * @return
-	 */
-	public Set<String> getPropertyKeys(boolean inherit) {
-		Set<String> result;
-		if (parent == null || !inherit) {
-			result = Create.set();
-		} else
-			result = parent.getPropertyKeys(inherit);
-		for (Object o : properties.keySet())
-			result.add(o.toString());
-
-		return result;
-	}
-
-	public boolean updateModified(long time, @SuppressWarnings("unused") String reason) {
-		if (time > lastModified) {
-			lastModified = time;
-			return true;
-		}
-		return false;
-	}
-
-	public long lastModified() {
-		return lastModified;
-	}
-
-	/**
-	 * Add or override a new property.
-	 * 
-	 * @param key
-	 * @param value
-	 */
-	public void setProperty(String key, String value) {
-		checkheader: for (int i = 0; i < headers.length; i++) {
-			if (headers[i].equalsIgnoreCase(value)) {
-				value = headers[i];
-				break checkheader;
-			}
-		}
-		getProperties().put(key, value);
-	}
-
-	/**
-	 * Read a manifest but return a properties object.
-	 * 
-	 * @param in
-	 * @return
-	 * @throws IOException
-	 */
-	public static Properties getManifestAsProperties(InputStream in) throws IOException {
-		Properties p = new Properties();
-		Manifest manifest = new Manifest(in);
-		for (Iterator<Object> it = manifest.getMainAttributes().keySet().iterator(); it.hasNext();) {
-			Attributes.Name key = (Attributes.Name) it.next();
-			String value = manifest.getMainAttributes().getValue(key);
-			p.put(key.toString(), value);
-		}
-		return p;
-	}
-
-	public File getPropertiesFile() {
-		return propertiesFile;
-	}
-
-	public void setFileMustExist(boolean mustexist) {
-		fileMustExist = mustexist;
-	}
-
-	static public String read(InputStream in) throws Exception {
-		InputStreamReader ir = new InputStreamReader(in, "UTF8");
-		StringBuilder sb = new StringBuilder();
-
-		try {
-			char chars[] = new char[1000];
-			int size = ir.read(chars);
-			while (size > 0) {
-				sb.append(chars, 0, size);
-				size = ir.read(chars);
-			}
-		}
-		finally {
-			ir.close();
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Join a list.
-	 * 
-	 * @param args
-	 * @return
-	 */
-	public static String join(Collection< ? > list, String delimeter) {
-		return join(delimeter, list);
-	}
-
-	public static String join(String delimeter, Collection< ? >... list) {
-		StringBuilder sb = new StringBuilder();
-		String del = "";
-		if (list != null) {
-			for (Collection< ? > l : list) {
-				for (Object item : l) {
-					sb.append(del);
-					sb.append(item);
-					del = delimeter;
-				}
-			}
-		}
-		return sb.toString();
-	}
-
-	public static String join(Object[] list, String delimeter) {
-		if (list == null)
-			return "";
-		StringBuilder sb = new StringBuilder();
-		String del = "";
-		for (Object item : list) {
-			sb.append(del);
-			sb.append(item);
-			del = delimeter;
-		}
-		return sb.toString();
-	}
-
-	public static String join(Collection< ? >... list) {
-		return join(",", list);
-	}
-
-	public static <T> String join(T list[]) {
-		return join(list, ",");
-	}
-
-	public static void split(String s, Collection<String> set) {
-
-		String elements[] = s.trim().split(LIST_SPLITTER);
-		for (String element : elements) {
-			if (element.length() > 0)
-				set.add(element);
-		}
-	}
-
-	public static Collection<String> split(String s) {
-		return split(s, LIST_SPLITTER);
-	}
-
-	public static Collection<String> split(String s, String splitter) {
-		if (s != null)
-			s = s.trim();
-		if (s == null || s.trim().length() == 0)
-			return Collections.emptyList();
-
-		return Arrays.asList(s.split(splitter));
-	}
-
-	public static String merge(String... strings) {
-		ArrayList<String> result = new ArrayList<String>();
-		for (String s : strings) {
-			if (s != null)
-				split(s, result);
-		}
-		return join(result);
-	}
-
-	public boolean isExceptions() {
-		return exceptions;
-	}
-
-	public void setExceptions(boolean exceptions) {
-		this.exceptions = exceptions;
-	}
-
-	/**
-	 * Make the file short if it is inside our base directory, otherwise long.
-	 * 
-	 * @param f
-	 * @return
-	 */
-	public String normalize(String f) {
-		if (f.startsWith(base.getAbsolutePath() + "/"))
-			return f.substring(base.getAbsolutePath().length() + 1);
-		return f;
-	}
-
-	public String normalize(File f) {
-		return normalize(f.getAbsolutePath());
-	}
-
-	public static String removeDuplicateMarker(String key) {
-		int i = key.length() - 1;
-		while (i >= 0 && key.charAt(i) == DUPLICATE_MARKER)
-			--i;
-
-		return key.substring(0, i + 1);
-	}
-
-	public static boolean isDuplicate(String name) {
-		return name.length() > 0 && name.charAt(name.length() - 1) == DUPLICATE_MARKER;
-	}
-
-	public void setTrace(boolean x) {
-		trace = x;
-	}
-
-	static class CL extends URLClassLoader {
-
-		CL() {
-			super(new URL[0], Processor.class.getClassLoader());
-		}
-
-		void add(URL url) {
-			URL urls[] = getURLs();
-			for (URL u : urls) {
-				if (u.equals(url))
-					return;
-			}
-			super.addURL(url);
-		}
-
-		public Class< ? > loadClass(String name) throws NoClassDefFoundError {
-			try {
-				Class< ? > c = super.loadClass(name);
-				return c;
-			}
-			catch (Throwable t) {
-				StringBuilder sb = new StringBuilder();
-				sb.append(name);
-				sb.append(" not found, parent:  ");
-				sb.append(getParent());
-				sb.append(" urls:");
-				sb.append(Arrays.toString(getURLs()));
-				sb.append(" exception:");
-				sb.append(t);
-				throw new NoClassDefFoundError(sb.toString());
-			}
-		}
-	}
-
-	private CL getLoader() {
-		if (pluginLoader == null) {
-			pluginLoader = new CL();
-		}
-		return pluginLoader;
-	}
-
-	/*
-	 * Check if this is a valid project.
-	 */
-	public boolean exists() {
-		return base != null && base.isDirectory() && propertiesFile != null && propertiesFile.isFile();
-	}
-
-	public boolean isOk() {
-		return isFailOk() || (getErrors().size() == 0);
-	}
-
-	public boolean check(String... pattern) throws IOException {
-		Set<String> missed = Create.set();
-
-		if (pattern != null) {
-			for (String p : pattern) {
-				boolean match = false;
-				Pattern pat = Pattern.compile(p);
-				for (Iterator<String> i = errors.iterator(); i.hasNext();) {
-					if (pat.matcher(i.next()).find()) {
-						i.remove();
-						match = true;
-					}
-				}
-				for (Iterator<String> i = warnings.iterator(); i.hasNext();) {
-					if (pat.matcher(i.next()).find()) {
-						i.remove();
-						match = true;
-					}
-				}
-				if (!match)
-					missed.add(p);
-
-			}
-		}
-		if (missed.isEmpty() && isPerfect())
-			return true;
-
-		if (!missed.isEmpty())
-			System.err.println("Missed the following patterns in the warnings or errors: " + missed);
-
-		report(System.err);
-		return false;
-	}
-
-	protected void report(Appendable out) throws IOException {
-		if (errors.size() > 0) {
-			out.append(String.format("-----------------%nErrors%n"));
-			for (int i = 0; i < errors.size(); i++) {
-				out.append(String.format("%03d: %s%n", i, errors.get(i)));
-			}
-		}
-		if (warnings.size() > 0) {
-			out.append(String.format("-----------------%nWarnings%n"));
-			for (int i = 0; i < warnings.size(); i++) {
-				out.append(String.format("%03d: %s%n", i, warnings.get(i)));
-			}
-		}
-	}
-
-	public boolean isPerfect() {
-		return getErrors().size() == 0 && getWarnings().size() == 0;
-	}
-
-	public void setForceLocal(Collection<String> local) {
-		filter = local;
-	}
-
-	/**
-	 * Answer if the name is a missing plugin's command name. If a bnd file
-	 * contains the command name of a plugin, and that plugin is not available,
-	 * then an error is reported during manifest calculation. This allows the
-	 * plugin to fail to load when it is not needed. We first get the plugins to
-	 * ensure it is properly initialized.
-	 * 
-	 * @param name
-	 * @return
-	 */
-	public boolean isMissingPlugin(String name) {
-		getPlugins();
-		return missingCommand != null && missingCommand.contains(name);
-	}
-
-	/**
-	 * Append two strings to for a path in a ZIP or JAR file. It is guaranteed
-	 * to return a string that does not start, nor ends with a '/', while it is
-	 * properly separated with slashes. Double slashes are properly removed.
-	 * 
-	 * <pre>
-	 *  &quot;/&quot; + &quot;abc/def/&quot; becomes &quot;abc/def&quot;
-	 *  
-	 * &#064;param prefix
-	 * &#064;param suffix
-	 * &#064;return
-	 */
-	public static String appendPath(String... parts) {
-		StringBuilder sb = new StringBuilder();
-		boolean lastSlash = true;
-		for (String part : parts) {
-			for (int i = 0; i < part.length(); i++) {
-				char c = part.charAt(i);
-				if (c == '/') {
-					if (!lastSlash)
-						sb.append('/');
-					lastSlash = true;
-				} else {
-					sb.append(c);
-					lastSlash = false;
-				}
-			}
-
-			if (!lastSlash && sb.length() > 0) {
-				sb.append('/');
-				lastSlash = true;
-			}
-		}
-		if (lastSlash && sb.length() > 0)
-			sb.deleteCharAt(sb.length() - 1);
-
-		return sb.toString();
-	}
-
-	/**
-	 * Parse the a=b strings and return a map of them.
-	 * 
-	 * @param attrs
-	 * @param clazz
-	 * @return
-	 */
-	public static Attrs doAttrbutes(Object[] attrs, Clazz clazz, Macro macro) {
-		Attrs map = new Attrs();
-
-		if (attrs == null || attrs.length == 0)
-			return map;
-
-		for (Object a : attrs) {
-			String attr = (String) a;
-			int n = attr.indexOf("=");
-			if (n > 0) {
-				map.put(attr.substring(0, n), macro.process(attr.substring(n + 1)));
-			} else
-				throw new IllegalArgumentException(formatArrays(
-						"Invalid attribute on package-info.java in %s , %s. Must be <key>=<name> ", clazz, attr));
-		}
-		return map;
-	}
-
-	/**
-	 * This method is the same as String.format but it makes sure that any
-	 * arrays are transformed to strings.
-	 * 
-	 * @param string
-	 * @param parms
-	 * @return
-	 */
-	public static String formatArrays(String string, Object... parms) {
-		Object[] parms2 = parms;
-		Object[] output = new Object[parms.length];
-		for (int i = 0; i < parms.length; i++) {
-			output[i] = makePrintable(parms[i]);
-		}
-		return String.format(string, parms2);
-	}
-
-	/**
-	 * Check if the object is an array and turn it into a string if it is,
-	 * otherwise unchanged.
-	 * 
-	 * @param object
-	 *            the object to make printable
-	 * @return a string if it was an array or the original object
-	 */
-	public static Object makePrintable(Object object) {
-		if (object == null)
-			return object;
-
-		if (object.getClass().isArray()) {
-			Object[] array = (Object[]) object;
-			Object[] output = new Object[array.length];
-			for (int i = 0; i < array.length; i++) {
-				output[i] = makePrintable(array[i]);
-			}
-			return Arrays.toString(output);
-		}
-		return object;
-	}
-
-	public static String append(String... strings) {
-		List<String> result = Create.list();
-		for (String s : strings) {
-			result.addAll(split(s));
-		}
-		return join(result);
-	}
-
-	public synchronized Class< ? > getClass(String type, File jar) throws Exception {
-		CL cl = getLoader();
-		cl.add(jar.toURI().toURL());
-		return cl.loadClass(type);
-	}
-
-	public boolean isTrace() {
-		return current().trace;
-	}
-
-	public static long getDuration(String tm, long dflt) {
-		if (tm == null)
-			return dflt;
-
-		tm = tm.toUpperCase();
-		TimeUnit unit = TimeUnit.MILLISECONDS;
-		Matcher m = Pattern
-				.compile("\\s*(\\d+)\\s*(NANOSECONDS|MICROSECONDS|MILLISECONDS|SECONDS|MINUTES|HOURS|DAYS)?").matcher(
-						tm);
-		if (m.matches()) {
-			long duration = Long.parseLong(tm);
-			String u = m.group(2);
-			if (u != null)
-				unit = TimeUnit.valueOf(u);
-			duration = TimeUnit.MILLISECONDS.convert(duration, unit);
-			return duration;
-		}
-		return dflt;
-	}
-
-	/**
-	 * Generate a random string, which is guaranteed to be a valid Java
-	 * identifier (first character is an ASCII letter, subsequent characters are
-	 * ASCII letters or numbers). Takes an optional parameter for the length of
-	 * string to generate; default is 8 characters.
-	 */
-	public String _random(String[] args) {
-		int numchars = 8;
-		if (args.length > 1) {
-			try {
-				numchars = Integer.parseInt(args[1]);
-			}
-			catch (NumberFormatException e) {
-				throw new IllegalArgumentException("Invalid character count parameter in ${random} macro.");
-			}
-		}
-
-		synchronized (Processor.class) {
-			if (random == null)
-				random = new Random();
-		}
-
-		char[] letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
-		char[] alphanums = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
-
-		char[] array = new char[numchars];
-		for (int i = 0; i < numchars; i++) {
-			char c;
-			if (i == 0)
-				c = letters[random.nextInt(letters.length)];
-			else
-				c = alphanums[random.nextInt(alphanums.length)];
-			array[i] = c;
-		}
-
-		return new String(array);
-	}
-
-	/**
-	 * Set the current command thread. This must be balanced with the
-	 * {@link #end(Processor)} method. The method returns the previous command
-	 * owner or null. The command owner will receive all warnings and error
-	 * reports.
-	 */
-
-	protected Processor beginHandleErrors(String message) {
-		trace("begin %s", message);
-		Processor previous = current.get();
-		current.set(this);
-		return previous;
-	}
-
-	/**
-	 * End a command. Will restore the previous command owner.
-	 * 
-	 * @param previous
-	 */
-	protected void endHandleErrors(Processor previous) {
-		trace("end");
-		current.set(previous);
-	}
-
-	public static Executor getExecutor() {
-		return executor;
-	}
-
-	/**
-	 * These plugins are added to the total list of plugins. The separation is
-	 * necessary because the list of plugins is refreshed now and then so we
-	 * need to be able to add them at any moment in time.
-	 * 
-	 * @param plugin
-	 */
-	public synchronized void addBasicPlugin(Object plugin) {
-		basicPlugins.add(plugin);
-		if (plugins != null)
-			plugins.add(plugin);
-	}
-
-	public synchronized void removeBasicPlugin(Object plugin) {
-		basicPlugins.remove(plugin);
-		if (plugins != null)
-			plugins.remove(plugin);
-	}
-
-	public List<File> getIncluded() {
-		return included;
-	}
-
-	/**
-	 * Overrides for the Domain class
-	 */
-	@Override
-	public String get(String key) {
-		return getProperty(key);
-	}
-
-	@Override
-	public String get(String key, String deflt) {
-		return getProperty(key, deflt);
-	}
-
-	@Override
-	public void set(String key, String value) {
-		getProperties().setProperty(key, value);
-	}
-
-	@Override
-	public Iterator<String> iterator() {
-		Set<String> keys = keySet();
-		final Iterator<String> it = keys.iterator();
-
-		return new Iterator<String>() {
-			String	current;
-
-			public boolean hasNext() {
-				return it.hasNext();
-			}
-
-			public String next() {
-				return current = it.next().toString();
-			}
-
-			public void remove() {
-				getProperties().remove(current);
-			}
-		};
-	}
-
-	public Set<String> keySet() {
-		Set<String> set;
-		if (parent == null)
-			set = Create.set();
-		else
-			set = parent.keySet();
-
-		for (Object o : properties.keySet())
-			set.add(o.toString());
-
-		return set;
-	}
-
-	/**
-	 * Printout of the status of this processor for toString()
-	 */
-
-	public String toString() {
-		try {
-			StringBuilder sb = new StringBuilder();
-			report(sb);
-			return sb.toString();
-		}
-		catch (Exception e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	/**
-	 * Utiltity to replace an extension
-	 * 
-	 * @param s
-	 * @param extension
-	 * @param newExtension
-	 * @return
-	 */
-	public String replaceExtension(String s, String extension, String newExtension) {
-		if (s.endsWith(extension))
-			s = s.substring(0, s.length() - extension.length());
-
-		return s + newExtension;
-	}
-
-	/**
-	 * Create a location object and add it to the locations
-	 * 
-	 * @param s
-	 * @return
-	 */
-	List<Location>	locations	= new ArrayList<Location>();
-
-	static class SetLocationImpl extends Location implements SetLocation {
-		public SetLocationImpl(String s) {
-			this.message = s;
-		}
-
-		public SetLocation file(String file) {
-			this.file = file;
-			return this;
-		}
-
-		public SetLocation header(String header) {
-			this.header = header;
-			return this;
-		}
-
-		public SetLocation context(String context) {
-			this.context = context;
-			return this;
-		}
-
-		public SetLocation method(String methodName) {
-			this.methodName = methodName;
-			return this;
-		}
-
-		public SetLocation line(int n) {
-			this.line = n;
-			return this;
-		}
-
-		public SetLocation reference(String reference) {
-			this.reference = reference;
-			return this;
-		}
-
-	}
-
-	private SetLocation location(String s) {
-		SetLocationImpl loc = new SetLocationImpl(s);
-		locations.add(loc);
-		return loc;
-	}
-
-	public Location getLocation(String msg) {
-		for (Location l : locations)
-			if ((l.message != null) && l.message.equals(msg))
-				return l;
-
-		return null;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Resource.java b/bundleplugin/src/main/java/aQute/lib/osgi/Resource.java
deleted file mode 100755
index 6605eef..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Resource.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-
-public interface Resource {
-	InputStream openInputStream() throws Exception;
-
-	void write(OutputStream out) throws Exception;
-
-	long lastModified();
-
-	void setExtra(String extra);
-
-	String getExtra();
-
-	long size() throws Exception;
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/TagResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/TagResource.java
deleted file mode 100644
index e138175..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/TagResource.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-
-import aQute.lib.tag.*;
-
-public class TagResource extends WriteResource {
-	final Tag	tag;
-
-	public TagResource(Tag tag) {
-		this.tag = tag;
-	}
-
-	public void write(OutputStream out) throws UnsupportedEncodingException {
-		OutputStreamWriter ow = new OutputStreamWriter(out, "UTF-8");
-		PrintWriter pw = new PrintWriter(ow);
-		pw.println("<?xml version='1.1'?>");
-		try {
-			tag.print(0, pw);
-		}
-		finally {
-			pw.flush();
-		}
-	}
-
-	public long lastModified() {
-		return 0;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/URLResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/URLResource.java
deleted file mode 100755
index 7c4772f..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/URLResource.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.net.*;
-
-import aQute.lib.io.*;
-
-public class URLResource implements Resource {
-	URL		url;
-	String	extra;
-	long	size	= -1;
-
-	public URLResource(URL url) {
-		this.url = url;
-	}
-
-	public InputStream openInputStream() throws IOException {
-		return url.openStream();
-	}
-
-	public String toString() {
-		return ":" + url.getPath() + ":";
-	}
-
-	public void write(OutputStream out) throws Exception {
-		IO.copy(this.openInputStream(), out);
-	}
-
-	public long lastModified() {
-		return -1;
-	}
-
-	public String getExtra() {
-		return extra;
-	}
-
-	public void setExtra(String extra) {
-		this.extra = extra;
-	}
-
-	public long size() throws Exception {
-		if (size >= 0)
-			return size;
-
-		try {
-			if (url.getProtocol().equals("file:")) {
-				File file = new File(url.getPath());
-				if (file.isFile())
-					return size = file.length();
-			} else {
-				URLConnection con = url.openConnection();
-				if (con instanceof HttpURLConnection) {
-					HttpURLConnection http = (HttpURLConnection) con;
-					http.setRequestMethod("HEAD");
-					http.connect();
-					String l = http.getHeaderField("Content-Length");
-					if (l != null) {
-						return size = Long.parseLong(l);
-					}
-				}
-			}
-		}
-		catch (Exception e) {
-			// Forget this exception, we do it the hard way
-		}
-		InputStream in = openInputStream();
-		DataInputStream din = null;
-		try {
-			din = new DataInputStream(in);
-			long result = din.skipBytes(Integer.MAX_VALUE);
-			while (in.read() >= 0) {
-				result += din.skipBytes(Integer.MAX_VALUE);
-			}
-			size = result;
-		}
-		finally {
-			if (din != null) {
-				din.close();
-			}
-		}
-		return size;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Verifier.java b/bundleplugin/src/main/java/aQute/lib/osgi/Verifier.java
deleted file mode 100755
index 2759049..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Verifier.java
+++ /dev/null
@@ -1,913 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.jar.*;
-import java.util.regex.*;
-
-import aQute.lib.base64.*;
-import aQute.lib.io.*;
-import aQute.lib.osgi.Descriptors.PackageRef;
-import aQute.lib.osgi.Descriptors.TypeRef;
-import aQute.libg.cryptography.*;
-import aQute.libg.header.*;
-import aQute.libg.qtokens.*;
-
-public class Verifier extends Processor {
-
-	private final Jar		dot;
-	private final Manifest	manifest;
-	private final Domain	main;
-
-	private boolean			r3;
-	private boolean			usesRequire;
-
-	final static Pattern	EENAME	= Pattern.compile("CDC-1\\.0/Foundation-1\\.0" + "|CDC-1\\.1/Foundation-1\\.1"
-											+ "|OSGi/Minimum-1\\.[1-9]" + "|JRE-1\\.1" + "|J2SE-1\\.2" + "|J2SE-1\\.3"
-											+ "|J2SE-1\\.4" + "|J2SE-1\\.5" + "|JavaSE-1\\.6" + "|JavaSE-1\\.7"
-											+ "|PersonalJava-1\\.1" + "|PersonalJava-1\\.2"
-											+ "|CDC-1\\.0/PersonalBasis-1\\.0" + "|CDC-1\\.0/PersonalJava-1\\.0");
-
-	final static int		V1_1	= 45;
-	final static int		V1_2	= 46;
-	final static int		V1_3	= 47;
-	final static int		V1_4	= 48;
-	final static int		V1_5	= 49;
-	final static int		V1_6	= 50;
-	final static int		V1_7	= 51;
-	final static int		V1_8	= 52;
-
-	static class EE {
-		String	name;
-		int		target;
-
-		EE(String name, @SuppressWarnings("unused") int source, int target) {
-			this.name = name;
-			this.target = target;
-		}
-
-		public String toString() {
-			return name + "(" + target + ")";
-		}
-	}
-
-	final static EE[]			ees								= {
-			new EE("CDC-1.0/Foundation-1.0", V1_3, V1_1),
-			new EE("CDC-1.1/Foundation-1.1", V1_3, V1_2),
-			new EE("OSGi/Minimum-1.0", V1_3, V1_1),
-			new EE("OSGi/Minimum-1.1", V1_3, V1_2),
-			new EE("JRE-1.1", V1_1, V1_1), //
-			new EE("J2SE-1.2", V1_2, V1_1), //
-			new EE("J2SE-1.3", V1_3, V1_1), //
-			new EE("J2SE-1.4", V1_3, V1_2), //
-			new EE("J2SE-1.5", V1_5, V1_5), //
-			new EE("JavaSE-1.6", V1_6, V1_6), //
-			new EE("PersonalJava-1.1", V1_1, V1_1), //
-			new EE("JavaSE-1.7", V1_7, V1_7), //
-			new EE("PersonalJava-1.1", V1_1, V1_1), //
-			new EE("PersonalJava-1.2", V1_1, V1_1), new EE("CDC-1.0/PersonalBasis-1.0", V1_3, V1_1),
-			new EE("CDC-1.0/PersonalJava-1.0", V1_3, V1_1), new EE("CDC-1.1/PersonalBasis-1.1", V1_3, V1_2),
-			new EE("CDC-1.1/PersonalJava-1.1", V1_3, V1_2)
-																};
-
-	final static Pattern		CARDINALITY_PATTERN				= Pattern.compile("single|multiple");
-	final static Pattern		RESOLUTION_PATTERN				= Pattern.compile("optional|mandatory");
-	final static Pattern		BUNDLEMANIFESTVERSION			= Pattern.compile("2");
-	public final static String	SYMBOLICNAME_STRING				= "[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)*";
-	public final static Pattern	SYMBOLICNAME					= Pattern.compile(SYMBOLICNAME_STRING);
-
-	public final static String	VERSION_STRING					= "[0-9]+(\\.[0-9]+(\\.[0-9]+(\\.[0-9A-Za-z_-]+)?)?)?";
-	public final static Pattern	VERSION							= Pattern.compile(VERSION_STRING);
-	final static Pattern		FILTEROP						= Pattern.compile("=|<=|>=|~=");
-	public final static Pattern	VERSIONRANGE					= Pattern.compile("((\\(|\\[)"
-
-																+ VERSION_STRING + "," + VERSION_STRING + "(\\]|\\)))|"
-																		+ VERSION_STRING);
-	final static Pattern		FILE							= Pattern
-																		.compile("/?[^/\"\n\r\u0000]+(/[^/\"\n\r\u0000]+)*");
-	final static Pattern		WILDCARDPACKAGE					= Pattern
-																		.compile("((\\p{Alnum}|_)+(\\.(\\p{Alnum}|_)+)*(\\.\\*)?)|\\*");
-	public final static Pattern	ISO639							= Pattern.compile("[A-Z][A-Z]");
-	public final static Pattern	HEADER_PATTERN					= Pattern.compile("[A-Za-z0-9][-a-zA-Z0-9_]+");
-	public final static Pattern	TOKEN							= Pattern.compile("[-a-zA-Z0-9_]+");
-
-	public final static Pattern	NUMBERPATTERN					= Pattern.compile("\\d+");
-	public final static Pattern	PACKAGEPATTERN					= Pattern
-																		.compile("\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*(\\.\\p{javaJavaIdentifierStart}\\p{javaJavaIdentifierPart}*)*");
-	public final static Pattern	PATHPATTERN						= Pattern.compile(".*");
-	public final static Pattern	FQNPATTERN						= Pattern.compile(".*");
-	public final static Pattern	URLPATTERN						= Pattern.compile(".*");
-	public final static Pattern	ANYPATTERN						= Pattern.compile(".*");
-	public final static Pattern	FILTERPATTERN					= Pattern.compile(".*");
-	public final static Pattern	TRUEORFALSEPATTERN				= Pattern.compile("true|false|TRUE|FALSE");
-	public static final Pattern	WILDCARDNAMEPATTERN				= Pattern.compile(".*");
-	public static final Pattern	BUNDLE_ACTIVATIONPOLICYPATTERN	= Pattern.compile("lazy");
-
-	public final static String	EES[]							= {
-			"CDC-1.0/Foundation-1.0", "CDC-1.1/Foundation-1.1", "OSGi/Minimum-1.0", "OSGi/Minimum-1.1",
-			"OSGi/Minimum-1.2", "JRE-1.1", "J2SE-1.2", "J2SE-1.3", "J2SE-1.4", "J2SE-1.5", "JavaSE-1.6", "JavaSE-1.7",
-			"PersonalJava-1.1", "PersonalJava-1.2", "CDC-1.0/PersonalBasis-1.0", "CDC-1.0/PersonalJava-1.0"
-																};
-
-	public final static String	OSNAMES[]						= {
-			"AIX", // IBM
-			"DigitalUnix", // Compaq
-			"Embos", // Segger Embedded Software Solutions
-			"Epoc32", // SymbianOS Symbian OS
-			"FreeBSD", // Free BSD
-			"HPUX", // hp-ux Hewlett Packard
-			"IRIX", // Silicon Graphics
-			"Linux", // Open source
-			"MacOS", // Apple
-			"NetBSD", // Open source
-			"Netware", // Novell
-			"OpenBSD", // Open source
-			"OS2", // OS/2 IBM
-			"QNX", // procnto QNX
-			"Solaris", // Sun (almost an alias of SunOS)
-			"SunOS", // Sun Microsystems
-			"VxWorks", // WindRiver Systems
-			"Windows95", "Win32", "Windows98", "WindowsNT", "WindowsCE", "Windows2000", // Win2000
-			"Windows2003", // Win2003
-			"WindowsXP", "WindowsVista",
-																};
-
-	public final static String	PROCESSORNAMES[]				= { //
-			//
-			"68k", // Motorola 68000
-			"ARM_LE", // Intel Strong ARM. Deprecated because it does not
-			// specify the endianness. See the following two rows.
-			"arm_le", // Intel Strong ARM Little Endian mode
-			"arm_be", // Intel String ARM Big Endian mode
-			"Alpha", //
-			"ia64n",// Hewlett Packard 32 bit
-			"ia64w",// Hewlett Packard 64 bit mode
-			"Ignite", // psc1k PTSC
-			"Mips", // SGI
-			"PArisc", // Hewlett Packard
-			"PowerPC", // power ppc Motorola/IBM Power PC
-			"Sh4", // Hitachi
-			"Sparc", // SUN
-			"Sparcv9", // SUN
-			"S390", // IBM Mainframe 31 bit
-			"S390x", // IBM Mainframe 64-bit
-			"V850E", // NEC V850E
-			"x86", // pentium i386
-			"i486", // i586 i686 Intel& AMD 32 bit
-			"x86-64",
-																};
-
-	final Analyzer				analyzer;
-	private Instructions		dynamicImports;
-
-	public Verifier(Jar jar) throws Exception {
-		this.analyzer = new Analyzer(this);
-		this.analyzer.use(this);
-		addClose(analyzer);
-		this.analyzer.setJar(jar);
-		this.manifest = this.analyzer.calcManifest();
-		this.main = Domain.domain(manifest);
-		this.dot = jar;
-		getInfo(analyzer);
-	}
-
-	public Verifier(Analyzer analyzer) throws Exception {
-		this.analyzer = analyzer;
-		this.dot = analyzer.getJar();
-		this.manifest = dot.getManifest();
-		this.main = Domain.domain(manifest);
-	}
-
-	private void verifyHeaders() {
-		for (String h : main) {
-			if (!HEADER_PATTERN.matcher(h).matches())
-				error("Invalid Manifest header: " + h + ", pattern=" + HEADER_PATTERN);
-		}
-	}
-
-	/*
-	 * Bundle-NativeCode ::= nativecode ( ',' nativecode )* ( ’,’ optional) ?
-	 * nativecode ::= path ( ';' path )* // See 1.4.2 ( ';' parameter )+
-	 * optional ::= ’*’
-	 */
-	public void verifyNative() {
-		String nc = get("Bundle-NativeCode");
-		doNative(nc);
-	}
-
-	public void doNative(String nc) {
-		if (nc != null) {
-			QuotedTokenizer qt = new QuotedTokenizer(nc, ",;=", false);
-			char del;
-			do {
-				do {
-					String name = qt.nextToken();
-					if (name == null) {
-						error("Can not parse name from bundle native code header: " + nc);
-						return;
-					}
-					del = qt.getSeparator();
-					if (del == ';') {
-						if (dot != null && !dot.exists(name)) {
-							error("Native library not found in JAR: " + name);
-						}
-					} else {
-						String value = null;
-						if (del == '=')
-							value = qt.nextToken();
-
-						String key = name.toLowerCase();
-						if (key.equals("osname")) {
-							// ...
-						} else if (key.equals("osversion")) {
-							// verify version range
-							verify(value, VERSIONRANGE);
-						} else if (key.equals("language")) {
-							verify(value, ISO639);
-						} else if (key.equals("processor")) {
-							// verify(value, PROCESSORS);
-						} else if (key.equals("selection-filter")) {
-							// verify syntax filter
-							verifyFilter(value);
-						} else if (name.equals("*") && value == null) {
-							// Wildcard must be at end.
-							if (qt.nextToken() != null)
-								error("Bundle-Native code header may only END in wildcard: nc");
-						} else {
-							warning("Unknown attribute in native code: " + name + "=" + value);
-						}
-						del = qt.getSeparator();
-					}
-				} while (del == ';');
-			} while (del == ',');
-		}
-	}
-
-	public boolean verifyFilter(String value) {
-		String s = validateFilter(value);
-		if (s == null)
-			return true;
-
-		error(s);
-		return false;
-	}
-
-	public static String validateFilter(String value) {
-		try {
-			verifyFilter(value, 0);
-			return null;
-		}
-		catch (Exception e) {
-			return "Not a valid filter: " + value + e.getMessage();
-		}
-	}
-
-	private void verifyActivator() throws Exception {
-		String bactivator = main.get("Bundle-Activator");
-		if (bactivator != null) {
-			TypeRef ref = analyzer.getTypeRefFromFQN(bactivator);
-			if (analyzer.getClassspace().containsKey(ref))
-				return;
-
-			PackageRef packageRef = ref.getPackageRef();
-			if (packageRef.isDefaultPackage())
-				error("The Bundle Activator is not in the bundle and it is in the default package ");
-			else if (!analyzer.isImported(packageRef)) {
-				error("Bundle-Activator not found on the bundle class path nor in imports: " + bactivator);
-			}
-		}
-	}
-
-	private void verifyComponent() {
-		String serviceComponent = main.get("Service-Component");
-		if (serviceComponent != null) {
-			Parameters map = parseHeader(serviceComponent);
-			for (String component : map.keySet()) {
-				if (component.indexOf("*") < 0 && !dot.exists(component)) {
-					error("Service-Component entry can not be located in JAR: " + component);
-				} else {
-					// validate component ...
-				}
-			}
-		}
-	}
-
-	/**
-	 * Check for unresolved imports. These are referrals that are not imported
-	 * by the manifest and that are not part of our bundle class path. The are
-	 * calculated by removing all the imported packages and contained from the
-	 * referred packages.
-	 */
-	private void verifyUnresolvedReferences() {
-		Set<PackageRef> unresolvedReferences = new TreeSet<PackageRef>(analyzer.getReferred().keySet());
-		unresolvedReferences.removeAll(analyzer.getImports().keySet());
-		unresolvedReferences.removeAll(analyzer.getContained().keySet());
-
-		// Remove any java.** packages.
-		for (Iterator<PackageRef> p = unresolvedReferences.iterator(); p.hasNext();) {
-			PackageRef pack = p.next();
-			if (pack.isJava())
-				p.remove();
-			else {
-				// Remove any dynamic imports
-				if (isDynamicImport(pack))
-					p.remove();
-			}
-		}
-
-		if (!unresolvedReferences.isEmpty()) {
-			// Now we want to know the
-			// classes that are the culprits
-			Set<String> culprits = new HashSet<String>();
-			for (Clazz clazz : analyzer.getClassspace().values()) {
-				if (hasOverlap(unresolvedReferences, clazz.getReferred()))
-					culprits.add(clazz.getAbsolutePath());
-			}
-
-			error("Unresolved references to %s by class(es) %s on the Bundle-Classpath: %s", unresolvedReferences,
-					culprits, analyzer.getBundleClasspath().keySet());
-		}
-	}
-
-	/**
-	 * @param p
-	 * @param pack
-	 */
-	private boolean isDynamicImport(PackageRef pack) {
-		if (dynamicImports == null)
-			dynamicImports = new Instructions(main.getDynamicImportPackage());
-
-		return dynamicImports.matches(pack.getFQN());
-	}
-
-	private boolean hasOverlap(Set< ? > a, Set< ? > b) {
-		for (Iterator< ? > i = a.iterator(); i.hasNext();) {
-			if (b.contains(i.next()))
-				return true;
-		}
-		return false;
-	}
-
-	public void verify() throws Exception {
-		verifyHeaders();
-		verifyDirectives("Export-Package", "uses:|mandatory:|include:|exclude:|" + IMPORT_DIRECTIVE, PACKAGEPATTERN,
-				"package");
-		verifyDirectives("Import-Package", "resolution:", PACKAGEPATTERN, "package");
-		verifyDirectives("Require-Bundle", "visibility:|resolution:", SYMBOLICNAME, "bsn");
-		verifyDirectives("Fragment-Host", "extension:", SYMBOLICNAME, "bsn");
-		verifyDirectives("Provide-Capability", "effective:|uses:", null, null);
-		verifyDirectives("Require-Capability", "effective:|resolution:|filter:", null, null);
-		verifyDirectives("Bundle-SymbolicName", "singleton:|fragment-attachment:|mandatory:", SYMBOLICNAME, "bsn");
-
-		verifyManifestFirst();
-		verifyActivator();
-		verifyActivationPolicy();
-		verifyComponent();
-		verifyNative();
-		verifyUnresolvedReferences();
-		verifySymbolicName();
-		verifyListHeader("Bundle-RequiredExecutionEnvironment", EENAME, false);
-		verifyHeader("Bundle-ManifestVersion", BUNDLEMANIFESTVERSION, false);
-		verifyHeader("Bundle-Version", VERSION, true);
-		verifyListHeader("Bundle-Classpath", FILE, false);
-		verifyDynamicImportPackage();
-		verifyBundleClasspath();
-		verifyUses();
-		if (usesRequire) {
-			if (!getErrors().isEmpty()) {
-				getWarnings()
-						.add(0,
-								"Bundle uses Require Bundle, this can generate false errors because then not enough information is available without the required bundles");
-			}
-		}
-
-		verifyRequirements();
-		verifyCapabilities();
-	}
-
-	private void verifyRequirements() {
-		Parameters map = parseHeader(manifest.getMainAttributes().getValue(Constants.REQUIRE_CAPABILITY));
-		for (String key : map.keySet()) {
-			Attrs attrs = map.get(key);
-			verify(attrs, "filter:", FILTERPATTERN, false, "Requirement %s filter not correct", key);
-			verify(attrs, "cardinality:", CARDINALITY_PATTERN, false, "Requirement %s cardinality not correct", key);
-			verify(attrs, "resolution:", RESOLUTION_PATTERN, false, "Requirement %s resolution not correct", key);
-
-			if (key.equals("osgi.extender")) {
-				// No requirements on extender
-			} else if (key.equals("osgi.serviceloader")) {
-				verify(attrs, "register:", PACKAGEPATTERN, false,
-						"Service Loader extender register: directive not a fully qualified Java name");
-			} else if (key.equals("osgi.contract")) {
-
-			} else if (key.equals("osgi.service")) {
-
-			} else if (key.equals("osgi.ee")) {
-
-			} else if (key.startsWith("osgi.wiring.") || key.startsWith("osgi.identity")) {
-				error("osgi.wiring.* namespaces must not be specified with generic requirements/capabilities");
-			}
-
-			verifyAttrs(attrs);
-
-			if (attrs.containsKey("mandatory:"))
-				error("mandatory: directive is intended for Capabilities, not Requirement %s", key);
-
-			if (attrs.containsKey("uses:"))
-				error("uses: directive is intended for Capabilities, not Requirement %s", key);
-		}
-	}
-
-	/**
-	 * @param attrs
-	 */
-	void verifyAttrs(Attrs attrs) {
-		for (String a : attrs.keySet()) {
-			String v = attrs.get(a);
-
-			if (!a.endsWith(":")) {
-				Attrs.Type t = attrs.getType(a);
-				if ("version".equals(a)) {
-					if (t != Attrs.Type.VERSION)
-						error("Version attributes should always be of type version, it is %s", t);
-				} else
-					verifyType(t, v);
-			}
-		}
-	}
-
-	private void verifyCapabilities() {
-		Parameters map = parseHeader(manifest.getMainAttributes().getValue(Constants.PROVIDE_CAPABILITY));
-		for (String key : map.keySet()) {
-			Attrs attrs = map.get(key);
-			verify(attrs, "cardinality:", CARDINALITY_PATTERN, false, "Requirement %s cardinality not correct", key);
-			verify(attrs, "resolution:", RESOLUTION_PATTERN, false, "Requirement %s resolution not correct", key);
-
-			if (key.equals("osgi.extender")) {
-				verify(attrs, "osgi.extender", SYMBOLICNAME, true,
-						"Extender %s must always have the osgi.extender attribute set", key);
-				verify(attrs, "version", VERSION, true, "Extender %s must always have a version", key);
-			} else if (key.equals("osgi.serviceloader")) {
-				verify(attrs, "register:", PACKAGEPATTERN, false,
-						"Service Loader extender register: directive not a fully qualified Java name");
-			} else if (key.equals("osgi.contract")) {
-				verify(attrs, "osgi.contract", SYMBOLICNAME, true,
-						"Contracts %s must always have the osgi.contract attribute set", key);
-
-			} else if (key.equals("osgi.service")) {
-				verify(attrs, "objectClass", PACKAGEPATTERN, true,
-						"osgi.service %s must have the objectClass attribute set", key);
-
-			} else if (key.equals("osgi.ee")) {
-				// TODO
-			} else if (key.startsWith("osgi.wiring.") || key.startsWith("osgi.identity")) {
-				error("osgi.wiring.* namespaces must not be specified with generic requirements/capabilities");
-			}
-
-			verifyAttrs(attrs);
-
-			if (attrs.containsKey("filter:"))
-				error("filter: directive is intended for Requirements, not Capability %s", key);
-			if (attrs.containsKey("cardinality:"))
-				error("cardinality: directive is intended for Requirements, not Capability %s", key);
-			if (attrs.containsKey("resolution:"))
-				error("resolution: directive is intended for Requirements, not Capability %s", key);
-		}
-	}
-
-	private void verify(Attrs attrs, String ad, Pattern pattern, boolean mandatory, String msg, String... args) {
-		String v = attrs.get(ad);
-		if (v == null) {
-			if (mandatory)
-				error("Missing required attribute/directive %s", ad);
-		} else {
-			Matcher m = pattern.matcher(v);
-			if (!m.matches())
-				error(msg, (Object[]) args);
-		}
-	}
-
-	private void verifyType(@SuppressWarnings("unused") Attrs.Type type, @SuppressWarnings("unused") String string) {
-
-	}
-
-	/**
-	 * Verify if the header does not contain any other directives
-	 * 
-	 * @param header
-	 * @param directives
-	 */
-	private void verifyDirectives(String header, String directives, Pattern namePattern, String type) {
-		Pattern pattern = Pattern.compile(directives);
-		Parameters map = parseHeader(manifest.getMainAttributes().getValue(header));
-		for (Entry<String,Attrs> entry : map.entrySet()) {
-			String pname = removeDuplicateMarker(entry.getKey());
-
-			if (namePattern != null) {
-				if (!namePattern.matcher(pname).matches())
-					if (isPedantic())
-						error("Invalid %s name: '%s'", type, pname);
-					else
-						warning("Invalid %s name: '%s'", type, pname);
-			}
-
-			for (String key : entry.getValue().keySet()) {
-				if (key.endsWith(":")) {
-					if (!key.startsWith("x-")) {
-						Matcher m = pattern.matcher(key);
-						if (m.matches())
-							continue;
-
-						warning("Unknown directive %s in %s, allowed directives are %s, and 'x-*'.", key, header,
-								directives.replace('|', ','));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Verify the use clauses
-	 */
-	private void verifyUses() {
-		// Set<String> uses = Create.set();
-		// for ( Map<String,String> attrs : analyzer.getExports().values()) {
-		// if ( attrs.containsKey(Constants.USES_DIRECTIVE)) {
-		// String s = attrs.get(Constants.USES_DIRECTIVE);
-		// uses.addAll( split(s));
-		// }
-		// }
-		// uses.removeAll(analyzer.getExports().keySet());
-		// uses.removeAll(analyzer.getImports().keySet());
-		// if ( !uses.isEmpty())
-		// warning("Export-Package uses: directive contains packages that are not imported nor exported: %s",
-		// uses);
-	}
-
-	public boolean verifyActivationPolicy() {
-		String policy = main.get(Constants.BUNDLE_ACTIVATIONPOLICY);
-		if (policy == null)
-			return true;
-
-		return verifyActivationPolicy(policy);
-	}
-
-	public boolean verifyActivationPolicy(String policy) {
-		Parameters map = parseHeader(policy);
-		if (map.size() == 0)
-			warning("Bundle-ActivationPolicy is set but has no argument %s", policy);
-		else if (map.size() > 1)
-			warning("Bundle-ActivationPolicy has too many arguments %s", policy);
-		else {
-			Map<String,String> s = map.get("lazy");
-			if (s == null)
-				warning("Bundle-ActivationPolicy set but is not set to lazy: %s", policy);
-			else
-				return true;
-		}
-
-		return false;
-	}
-
-	public void verifyBundleClasspath() {
-		Parameters bcp = main.getBundleClassPath();
-		if (bcp.isEmpty() || bcp.containsKey("."))
-			return;
-
-		for (String path : bcp.keySet()) {
-			if (path.endsWith("/"))
-				error("A Bundle-ClassPath entry must not end with '/': %s", path);
-
-			if (dot.getDirectories().containsKey(path))
-				// We assume that any classes are in a directory
-				// and therefore do not care when the bundle is included
-				return;
-		}
-
-		for (String path : dot.getResources().keySet()) {
-			if (path.endsWith(".class")) {
-				warning("The Bundle-Classpath does not contain the actual bundle JAR (as specified with '.' in the Bundle-Classpath) but the JAR does contain classes. Is this intentional?");
-				return;
-			}
-		}
-	}
-
-	/**
-	 * <pre>
-	 *          DynamicImport-Package ::= dynamic-description
-	 *              ( ',' dynamic-description )*
-	 *              
-	 *          dynamic-description::= wildcard-names ( ';' parameter )*
-	 *          wildcard-names ::= wildcard-name ( ';' wildcard-name )*
-	 *          wildcard-name ::= package-name 
-	 *                         | ( package-name '.*' ) // See 1.4.2
-	 *                         | '*'
-	 * </pre>
-	 */
-	private void verifyDynamicImportPackage() {
-		verifyListHeader("DynamicImport-Package", WILDCARDPACKAGE, true);
-		String dynamicImportPackage = get("DynamicImport-Package");
-		if (dynamicImportPackage == null)
-			return;
-
-		Parameters map = main.getDynamicImportPackage();
-		for (String name : map.keySet()) {
-			name = name.trim();
-			if (!verify(name, WILDCARDPACKAGE))
-				error("DynamicImport-Package header contains an invalid package name: " + name);
-
-			Map<String,String> sub = map.get(name);
-			if (r3 && sub.size() != 0) {
-				error("DynamicPackage-Import has attributes on import: " + name
-						+ ". This is however, an <=R3 bundle and attributes on this header were introduced in R4. ");
-			}
-		}
-	}
-
-	private void verifyManifestFirst() {
-		if (!dot.isManifestFirst()) {
-			error("Invalid JAR stream: Manifest should come first to be compatible with JarInputStream, it was not");
-		}
-	}
-
-	private void verifySymbolicName() {
-		Parameters bsn = parseHeader(main.get(Analyzer.BUNDLE_SYMBOLICNAME));
-		if (!bsn.isEmpty()) {
-			if (bsn.size() > 1)
-				error("More than one BSN specified " + bsn);
-
-			String name = bsn.keySet().iterator().next();
-			if (!isBsn(name)) {
-				error("Symbolic Name has invalid format: " + name);
-			}
-		}
-	}
-
-	/**
-	 * @param name
-	 * @return
-	 */
-	public static boolean isBsn(String name) {
-		return SYMBOLICNAME.matcher(name).matches();
-	}
-
-	/**
-	 * <pre>
-	 *         filter ::= ’(’ filter-comp ’)’
-	 *         filter-comp ::= and | or | not | operation
-	 *         and ::= ’&amp;’ filter-list
-	 *         or ::= ’|’ filter-list
-	 *         not ::= ’!’ filter
-	 *         filter-list ::= filter | filter filter-list
-	 *         operation ::= simple | present | substring
-	 *         simple ::= attr filter-type value
-	 *         filter-type ::= equal | approx | greater | less
-	 *         equal ::= ’=’
-	 *         approx ::= ’&tilde;=’
-	 *         greater ::= ’&gt;=’
-	 *         less ::= ’&lt;=’
-	 *         present ::= attr ’=*’
-	 *         substring ::= attr ’=’ initial any final
-	 *         inital ::= () | value
-	 *         any ::= ’*’ star-value
-	 *         star-value ::= () | value ’*’ star-value
-	 *         final ::= () | value
-	 *         value ::= &lt;see text&gt;
-	 * </pre>
-	 * 
-	 * @param expr
-	 * @param index
-	 * @return
-	 */
-
-	public static int verifyFilter(String expr, int index) {
-		try {
-			while (Character.isWhitespace(expr.charAt(index)))
-				index++;
-
-			if (expr.charAt(index) != '(')
-				throw new IllegalArgumentException("Filter mismatch: expected ( at position " + index + " : " + expr);
-
-			index++; // skip (
-
-			while (Character.isWhitespace(expr.charAt(index)))
-				index++;
-
-			switch (expr.charAt(index)) {
-				case '!' :
-					index++; // skip !
-					while (Character.isWhitespace(expr.charAt(index)))
-						index++;
-
-					if (expr.charAt(index) != '(')
-						throw new IllegalArgumentException("Filter mismatch: ! (not) must have one sub expression "
-								+ index + " : " + expr);
-					while (Character.isWhitespace(expr.charAt(index)))
-						index++;
-
-					index = verifyFilter(expr, index);
-					while (Character.isWhitespace(expr.charAt(index)))
-						index++;
-					if (expr.charAt(index) != ')')
-						throw new IllegalArgumentException("Filter mismatch: expected ) at position " + index + " : "
-								+ expr);
-					return index + 1;
-
-				case '&' :
-				case '|' :
-					index++; // skip operator
-					while (Character.isWhitespace(expr.charAt(index)))
-						index++;
-					while (expr.charAt(index) == '(') {
-						index = verifyFilter(expr, index);
-						while (Character.isWhitespace(expr.charAt(index)))
-							index++;
-					}
-
-					if (expr.charAt(index) != ')')
-						throw new IllegalArgumentException("Filter mismatch: expected ) at position " + index + " : "
-								+ expr);
-					return index + 1; // skip )
-
-				default :
-					index = verifyFilterOperation(expr, index);
-					if (expr.charAt(index) != ')')
-						throw new IllegalArgumentException("Filter mismatch: expected ) at position " + index + " : "
-								+ expr);
-					return index + 1;
-			}
-		}
-		catch (IndexOutOfBoundsException e) {
-			throw new IllegalArgumentException("Filter mismatch: early EOF from " + index);
-		}
-	}
-
-	static private int verifyFilterOperation(String expr, int index) {
-		StringBuilder sb = new StringBuilder();
-		while ("=><~()".indexOf(expr.charAt(index)) < 0) {
-			sb.append(expr.charAt(index++));
-		}
-		String attr = sb.toString().trim();
-		if (attr.length() == 0)
-			throw new IllegalArgumentException("Filter mismatch: attr at index " + index + " is 0");
-		sb = new StringBuilder();
-		while ("=><~".indexOf(expr.charAt(index)) >= 0) {
-			sb.append(expr.charAt(index++));
-		}
-		String operator = sb.toString();
-		if (!verify(operator, FILTEROP))
-			throw new IllegalArgumentException("Filter error, illegal operator " + operator + " at index " + index);
-
-		sb = new StringBuilder();
-		while (")".indexOf(expr.charAt(index)) < 0) {
-			switch (expr.charAt(index)) {
-				case '\\' :
-					if ("\\)(*".indexOf(expr.charAt(index + 1)) >= 0)
-						index++;
-					else
-						throw new IllegalArgumentException("Filter error, illegal use of backslash at index " + index
-								+ ". Backslash may only be used before * or () or \\");
-			}
-			sb.append(expr.charAt(index++));
-		}
-		return index;
-	}
-
-	private boolean verifyHeader(String name, Pattern regex, boolean error) {
-		String value = manifest.getMainAttributes().getValue(name);
-		if (value == null)
-			return false;
-
-		QuotedTokenizer st = new QuotedTokenizer(value.trim(), ",");
-		for (Iterator<String> i = st.getTokenSet().iterator(); i.hasNext();) {
-			if (!verify(i.next(), regex)) {
-				String msg = "Invalid value for " + name + ", " + value + " does not match " + regex.pattern();
-				if (error)
-					error(msg);
-				else
-					warning(msg);
-			}
-		}
-		return true;
-	}
-
-	static private boolean verify(String value, Pattern regex) {
-		return regex.matcher(value).matches();
-	}
-
-	private boolean verifyListHeader(String name, Pattern regex, boolean error) {
-		String value = manifest.getMainAttributes().getValue(name);
-		if (value == null)
-			return false;
-
-		Parameters map = parseHeader(value);
-		for (String header : map.keySet()) {
-			if (!regex.matcher(header).matches()) {
-				String msg = "Invalid value for " + name + ", " + value + " does not match " + regex.pattern();
-				if (error)
-					error(msg);
-				else
-					warning(msg);
-			}
-		}
-		return true;
-	}
-
-	public String getProperty(String key, String deflt) {
-		if (properties == null)
-			return deflt;
-		return properties.getProperty(key, deflt);
-	}
-
-	public static boolean isVersion(String version) {
-		return VERSION.matcher(version).matches();
-	}
-
-	public static boolean isIdentifier(String value) {
-		if (value.length() < 1)
-			return false;
-
-		if (!Character.isJavaIdentifierStart(value.charAt(0)))
-			return false;
-
-		for (int i = 1; i < value.length(); i++) {
-			if (!Character.isJavaIdentifierPart(value.charAt(i)))
-				return false;
-		}
-		return true;
-	}
-
-	public static boolean isMember(String value, String[] matches) {
-		for (String match : matches) {
-			if (match.equals(value))
-				return true;
-		}
-		return false;
-	}
-
-	public static boolean isFQN(String name) {
-		if (name.length() == 0)
-			return false;
-		if (!Character.isJavaIdentifierStart(name.charAt(0)))
-			return false;
-
-		for (int i = 1; i < name.length(); i++) {
-			char c = name.charAt(i);
-			if (Character.isJavaIdentifierPart(c) || c == '$' || c == '.')
-				continue;
-
-			return false;
-		}
-
-		return true;
-	}
-
-	/**
-	 * Verify checksums
-	 */
-	/**
-	 * Verify the checksums from the manifest against the real thing.
-	 * 
-	 * @param all
-	 *            if each resources must be digested
-	 * @return true if ok
-	 * @throws Exception
-	 */
-
-	public void verifyChecksums(boolean all) throws Exception {
-		Manifest m = dot.getManifest();
-		if (m == null || m.getEntries().isEmpty()) {
-			if (all)
-				error("Verify checksums with all but no digests");
-			return;
-		}
-
-		List<String> missingDigest = new ArrayList<String>();
-
-		for (String path : dot.getResources().keySet()) {
-			if (path.equals("META-INF/MANIFEST.MF"))
-				continue;
-
-			Attributes a = m.getAttributes(path);
-			String digest = a.getValue("SHA1-Digest");
-			if (digest == null) {
-				if (!path.matches(""))
-					missingDigest.add(path);
-			} else {
-				byte[] d = Base64.decodeBase64(digest);
-				SHA1 expected = new SHA1(d);
-				Digester<SHA1> digester = SHA1.getDigester();
-				InputStream in = dot.getResource(path).openInputStream();
-				IO.copy(in, digester);
-				digester.digest();
-				if (!expected.equals(digester.digest())) {
-					error("Checksum mismatch %s, expected %s, got %s", path, expected, digester.digest());
-				}
-			}
-		}
-		if (missingDigest.size() > 0) {
-			error("Entries in the manifest are missing digests: %s", missingDigest);
-		}
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/WriteResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/WriteResource.java
deleted file mode 100644
index 5cc5229..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/WriteResource.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-
-public abstract class WriteResource implements Resource {
-	String			extra;
-	volatile long	size	= -1;
-
-	public InputStream openInputStream() throws Exception {
-		PipedInputStream pin = new PipedInputStream();
-		final PipedOutputStream pout = new PipedOutputStream(pin);
-		Thread t = new Thread() {
-			public void run() {
-				try {
-					write(pout);
-					pout.flush();
-				}
-				catch (Exception e) {
-					e.printStackTrace();
-				}
-				finally {
-					try {
-						pout.close();
-					}
-					catch (IOException e) {
-						// Ignore
-					}
-				}
-			}
-		};
-		t.start();
-		return pin;
-	}
-
-	public abstract void write(OutputStream out) throws IOException, Exception;
-
-	public abstract long lastModified();
-
-	public String getExtra() {
-		return extra;
-	}
-
-	public void setExtra(String extra) {
-		this.extra = extra;
-	}
-
-	static class CountingOutputStream extends OutputStream {
-		long	size;
-
-		@Override
-		public void write(int var0) throws IOException {
-			size++;
-		}
-
-		@Override
-		public void write(byte[] buffer) throws IOException {
-			size += buffer.length;
-		}
-
-		@Override
-		public void write(byte[] buffer, int start, int length) throws IOException {
-			size += length;
-		}
-	}
-
-	public long size() throws IOException, Exception {
-		if (size == -1) {
-			CountingOutputStream cout = new CountingOutputStream();
-			write(cout);
-			size = cout.size;
-		}
-		return size;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/ZipResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/ZipResource.java
deleted file mode 100755
index f5e2095..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/ZipResource.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package aQute.lib.osgi;
-
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-import java.util.zip.*;
-
-public class ZipResource implements Resource {
-	ZipFile		zip;
-	ZipEntry	entry;
-	long		lastModified;
-	String		extra;
-
-	ZipResource(ZipFile zip, ZipEntry entry, long lastModified) throws UnsupportedEncodingException {
-		this.zip = zip;
-		this.entry = entry;
-		this.lastModified = lastModified;
-		byte[] data = entry.getExtra();
-		if (data != null)
-			this.extra = new String(data, "UTF-8");
-	}
-
-	public InputStream openInputStream() throws IOException {
-		return zip.getInputStream(entry);
-	}
-
-	public String toString() {
-		return ":" + zip.getName() + "(" + entry.getName() + "):";
-	}
-
-	public static ZipFile build(Jar jar, File file) throws ZipException, IOException {
-		return build(jar, file, null);
-	}
-
-	public static ZipFile build(Jar jar, File file, Pattern pattern) throws ZipException, IOException {
-
-		try {
-			ZipFile zip = new ZipFile(file);
-			nextEntry: for (Enumeration< ? extends ZipEntry> e = zip.entries(); e.hasMoreElements();) {
-				ZipEntry entry = e.nextElement();
-				if (pattern != null) {
-					Matcher m = pattern.matcher(entry.getName());
-					if (!m.matches())
-						continue nextEntry;
-				}
-				if (!entry.isDirectory()) {
-					long time = entry.getTime();
-					if (time <= 0)
-						time = file.lastModified();
-					jar.putResource(entry.getName(), new ZipResource(zip, entry, time), true);
-				}
-			}
-			return zip;
-		}
-		catch (ZipException ze) {
-			throw new ZipException("The JAR/ZIP file (" + file.getAbsolutePath() + ") seems corrupted, error: "
-					+ ze.getMessage());
-		}
-		catch (FileNotFoundException e) {
-			throw new IllegalArgumentException("Problem opening JAR: " + file.getAbsolutePath());
-		}
-	}
-
-	public void write(OutputStream out) throws Exception {
-		FileResource.copy(this, out);
-	}
-
-	public long lastModified() {
-		return lastModified;
-	}
-
-	public String getExtra() {
-		return extra;
-	}
-
-	public void setExtra(String extra) {
-		this.extra = extra;
-	}
-
-	public long size() {
-		return entry.getSize();
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/eclipse/EclipseClasspath.java b/bundleplugin/src/main/java/aQute/lib/osgi/eclipse/EclipseClasspath.java
deleted file mode 100755
index c146477..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/eclipse/EclipseClasspath.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package aQute.lib.osgi.eclipse;
-
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-
-import javax.xml.parsers.*;
-
-import org.w3c.dom.*;
-import org.xml.sax.*;
-
-import aQute.service.reporter.*;
-
-/**
- * Parse the Eclipse project information for the classpath. Unfortunately, it is
- * impossible to read the variables. They are ignored but that can cause
- * problems.
- * 
- * @version $Revision$
- */
-public class EclipseClasspath {
-	static DocumentBuilderFactory	documentBuilderFactory	= DocumentBuilderFactory.newInstance();
-	DocumentBuilder					db;
-	File							project;
-	File							workspace;
-	Set<File>						sources					= new LinkedHashSet<File>();
-	Set<File>						allSources				= new LinkedHashSet<File>();
-
-	Set<File>						classpath				= new LinkedHashSet<File>();
-	List<File>						dependents				= new ArrayList<File>();
-	File							output;
-	boolean							recurse					= true;
-	Set<File>						exports					= new LinkedHashSet<File>();
-	Map<String,String>				properties				= new HashMap<String,String>();
-	Reporter						reporter;
-	int								options;
-	Set<File>						bootclasspath			= new LinkedHashSet<File>();
-
-	public final static int			DO_VARIABLES			= 1;
-
-	/**
-	 * Parse an Eclipse project structure to discover the classpath.
-	 * 
-	 * @param workspace
-	 *            Points to workspace
-	 * @param project
-	 *            Points to project
-	 * @throws ParserConfigurationException
-	 * @throws SAXException
-	 * @throws IOException
-	 */
-
-	public EclipseClasspath(Reporter reporter, File workspace, File project, @SuppressWarnings("unused") int options) throws Exception {
-		this.project = project.getCanonicalFile();
-		this.workspace = workspace.getCanonicalFile();
-		this.reporter = reporter;
-		db = documentBuilderFactory.newDocumentBuilder();
-		parse(this.project, true);
-		db = null;
-	}
-
-	public EclipseClasspath(Reporter reporter, File workspace, File project) throws Exception {
-		this(reporter, workspace, project, 0);
-	}
-
-	/**
-	 * Recursive routine to parse the files. If a sub project is detected, it is
-	 * parsed before the parsing continues. This should give the right order.
-	 * 
-	 * @param project
-	 *            Project directory
-	 * @param top
-	 *            If this is the top project
-	 * @throws ParserConfigurationException
-	 * @throws SAXException
-	 * @throws IOException
-	 */
-	void parse(File project, boolean top) throws ParserConfigurationException, SAXException, IOException {
-		File file = new File(project, ".classpath");
-		if (!file.exists())
-			throw new FileNotFoundException(".classpath file not found: " + file.getAbsolutePath());
-
-		Document doc = db.parse(file);
-		NodeList nodelist = doc.getDocumentElement().getElementsByTagName("classpathentry");
-
-		if (nodelist == null)
-			throw new IllegalArgumentException("Can not find classpathentry in classpath file");
-
-		for (int i = 0; i < nodelist.getLength(); i++) {
-			Node node = nodelist.item(i);
-			NamedNodeMap attrs = node.getAttributes();
-			String kind = get(attrs, "kind");
-			if ("src".equals(kind)) {
-				String path = get(attrs, "path");
-				// TODO boolean exported = "true".equalsIgnoreCase(get(attrs,
-				// "exported"));
-				if (path.startsWith("/")) {
-					// We have another project
-					File subProject = getFile(workspace, project, path);
-					if (recurse)
-						parse(subProject, false);
-					dependents.add(subProject.getCanonicalFile());
-				} else {
-					File src = getFile(workspace, project, path);
-					allSources.add(src);
-					if (top) {
-						// We only want the sources for our own project
-						// or we'll compile all at once. Not a good idea
-						// because project settings can differ.
-						sources.add(src);
-					}
-				}
-			} else if ("lib".equals(kind)) {
-				String path = get(attrs, "path");
-				boolean exported = "true".equalsIgnoreCase(get(attrs, "exported"));
-				if (top || exported) {
-					File jar = getFile(workspace, project, path);
-					if (jar.getName().startsWith("ee."))
-						bootclasspath.add(jar);
-					else
-						classpath.add(jar);
-					if (exported)
-						exports.add(jar);
-				}
-			} else if ("output".equals(kind)) {
-				String path = get(attrs, "path");
-				path = path.replace('/', File.separatorChar);
-				output = getFile(workspace, project, path);
-				classpath.add(output);
-				exports.add(output);
-			} else if ("var".equals(kind)) {
-				boolean exported = "true".equalsIgnoreCase(get(attrs, "exported"));
-				File lib = replaceVar(get(attrs, "path"));
-				File slib = replaceVar(get(attrs, "sourcepath"));
-				if (lib != null) {
-					classpath.add(lib);
-					if (exported)
-						exports.add(lib);
-				}
-				if (slib != null)
-					sources.add(slib);
-			} else if ("con".equals(kind)) {
-				// Should do something useful ...
-			}
-		}
-	}
-
-	private File getFile(File abs, File relative, String opath) {
-		String path = opath.replace('/', File.separatorChar);
-		File result = new File(path);
-		if (result.isAbsolute() && result.isFile()) {
-			return result;
-		}
-		if (path.startsWith(File.separator)) {
-			result = abs;
-			path = path.substring(1);
-		} else
-			result = relative;
-
-		StringTokenizer st = new StringTokenizer(path, File.separator);
-		while (st.hasMoreTokens()) {
-			String token = st.nextToken();
-			result = new File(result, token);
-		}
-
-		if (!result.exists())
-			System.err.println("File not found: project=" + project + " workspace=" + workspace + " path=" + opath
-					+ " file=" + result);
-		return result;
-	}
-
-	static Pattern	PATH	= Pattern.compile("([A-Z_]+)/(.*)");
-
-	private File replaceVar(String path) {
-		if ((options & DO_VARIABLES) == 0)
-			return null;
-
-		Matcher m = PATH.matcher(path);
-		if (m.matches()) {
-			String var = m.group(1);
-			String remainder = m.group(2);
-			String base = properties.get(var);
-			if (base != null) {
-				File b = new File(base);
-				File f = new File(b, remainder.replace('/', File.separatorChar));
-				return f;
-			}
-			reporter.error("Can't find replacement variable for: " + path);
-		} else
-			reporter.error("Cant split variable path: " + path);
-		return null;
-	}
-
-	private String get(NamedNodeMap map, String name) {
-		Node node = map.getNamedItem(name);
-		if (node == null)
-			return null;
-
-		return node.getNodeValue();
-	}
-
-	public Set<File> getClasspath() {
-		return classpath;
-	}
-
-	public Set<File> getSourcepath() {
-		return sources;
-	}
-
-	public File getOutput() {
-		return output;
-	}
-
-	public List<File> getDependents() {
-		return dependents;
-	}
-
-	public void setRecurse(boolean recurse) {
-		this.recurse = recurse;
-	}
-
-	public Set<File> getExports() {
-		return exports;
-	}
-
-	public void setProperties(Map<String,String> map) {
-		this.properties = map;
-	}
-
-	public Set<File> getBootclasspath() {
-		return bootclasspath;
-	}
-
-	public Set<File> getAllSources() {
-		return allSources;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/packageinfo b/bundleplugin/src/main/java/aQute/lib/osgi/packageinfo
deleted file mode 100644
index 084a0d4..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 2.0.0
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReq.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReq.java
deleted file mode 100644
index c175060..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReq.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package aQute.lib.osgi.resource;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.osgi.resource.Capability;
-import org.osgi.resource.Namespace;
-import org.osgi.resource.Requirement;
-import org.osgi.resource.Resource;
-
-class CapReq implements Capability, Requirement {
-	
-	static enum MODE { Capability, Requirement }
-	
-	private final MODE mode;
-	private final String	namespace;
-	private final Resource	resource;
-	private final Map<String,String>	directives;
-	private final Map<String,Object>	attributes;
-
-	CapReq(MODE mode, String namespace, Resource resource, Map<String, String> directives, Map<String, Object> attributes) {
-		this.mode = mode;
-		this.namespace = namespace;
-		this.resource = resource;
-		this.directives = new HashMap<String,String>(directives);
-		this.attributes = new HashMap<String,Object>(attributes);
-	}
-
-	public String getNamespace() {
-		return namespace;
-	}
-
-	public Map<String,String> getDirectives() {
-		return Collections.unmodifiableMap(directives);
-	}
-
-	public Map<String,Object> getAttributes() {
-		return Collections.unmodifiableMap(attributes);
-	}
-
-	public Resource getResource() {
-		return resource;
-	}
-
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((attributes == null) ? 0 : attributes.hashCode());
-		result = prime * result + ((directives == null) ? 0 : directives.hashCode());
-		result = prime * result + ((mode == null) ? 0 : mode.hashCode());
-		result = prime * result + ((namespace == null) ? 0 : namespace.hashCode());
-		result = prime * result + ((resource == null) ? 0 : resource.hashCode());
-		return result;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		CapReq other = (CapReq) obj;
-		if (attributes == null) {
-			if (other.attributes != null)
-				return false;
-		} else if (!attributes.equals(other.attributes))
-			return false;
-		if (directives == null) {
-			if (other.directives != null)
-				return false;
-		} else if (!directives.equals(other.directives))
-			return false;
-		if (mode != other.mode)
-			return false;
-		if (namespace == null) {
-			if (other.namespace != null)
-				return false;
-		} else if (!namespace.equals(other.namespace))
-			return false;
-		if (resource == null) {
-			if (other.resource != null)
-				return false;
-		} else if (!resource.equals(other.resource))
-			return false;
-		return true;
-	}
-
-	@Override
-	public String toString() {
-		StringBuilder builder = new StringBuilder();
-		if (mode == MODE.Capability) {
-			Object value = attributes.get(namespace);
-			builder.append(namespace).append('=').append(value);
-		} else {
-			String filter = directives.get(Namespace.REQUIREMENT_FILTER_DIRECTIVE);
-			builder.append(filter);
-			if (Namespace.RESOLUTION_OPTIONAL.equals(directives.get(Namespace.REQUIREMENT_RESOLUTION_DIRECTIVE))) {
-				builder.append("%OPT");
-			}
-		}
-		return builder.toString();
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReqBuilder.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReqBuilder.java
deleted file mode 100644
index 1e259c9..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/CapReqBuilder.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package aQute.lib.osgi.resource;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.osgi.framework.namespace.PackageNamespace;
-import org.osgi.resource.Capability;
-import org.osgi.resource.Namespace;
-import org.osgi.resource.Requirement;
-import org.osgi.resource.Resource;
-
-import aQute.lib.osgi.resource.CapReq.MODE;
-import aQute.libg.filters.AndFilter;
-import aQute.libg.filters.Filter;
-import aQute.libg.filters.SimpleFilter;
-import aQute.libg.version.VersionRange;
-
-public class CapReqBuilder {
-
-	private final String				namespace;
-	private Resource					resource;
-	private final Map<String,Object>	attributes	= new HashMap<String,Object>();
-	private final Map<String,String>	directives	= new HashMap<String,String>();
-
-	public CapReqBuilder(String namespace) {
-		this.namespace = namespace;
-	}
-	
-	public static CapReqBuilder clone(Capability capability) {
-		CapReqBuilder builder = new CapReqBuilder(capability.getNamespace());
-		builder.addAttributes(capability.getAttributes());
-		builder.addDirectives(capability.getDirectives());
-		return builder;
-	}
-	
-	public static CapReqBuilder clone(Requirement requirement) {
-		CapReqBuilder builder = new CapReqBuilder(requirement.getNamespace());
-		builder.addAttributes(requirement.getAttributes());
-		builder.addDirectives(requirement.getDirectives());
-		return builder;
-	}
-	
-	public String getNamespace() {
-		return namespace;
-	}
-	
-	public CapReqBuilder setResource(Resource resource) {
-		this.resource = resource;
-		return this;
-	}
-
-	public CapReqBuilder addAttribute(String name, Object value) {
-		attributes.put(name, value);
-		return this;
-	}
-	
-	public CapReqBuilder addAttributes(Map<? extends String, ? extends Object> attributes) {
-		this.attributes.putAll(attributes);
-		return this;
-	}
-
-	public CapReqBuilder addDirective(String name, String value) {
-		directives.put(name, value);
-		return this;
-	}
-	
-	public CapReqBuilder addDirectives(Map<? extends String, ? extends String> directives) {
-		this.directives.putAll(directives);
-		return this;
-	}
-	
-	public Capability buildCapability() {
-		// TODO check the thrown exception
-		if (resource == null) throw new IllegalStateException("Cannot build Capability with null Resource.");
-		return new CapReq(MODE.Capability, namespace, resource, directives, attributes);
-	}
-	
-	public Requirement buildRequirement() {
-		// TODO check the thrown exception
-		if (resource == null) throw new IllegalStateException("Cannot build Requirement with null Resource.");
-		return new CapReq(MODE.Requirement, namespace, resource, directives, attributes);
-	}
-
-	public Requirement buildSyntheticRequirement() {
-		return new CapReq(MODE.Requirement, namespace, null, directives, attributes);
-	}
-	
-	public static final CapReqBuilder createPackageRequirement(String pkgName, VersionRange range) {
-		Filter filter;
-		SimpleFilter pkgNameFilter = new SimpleFilter(PackageNamespace.PACKAGE_NAMESPACE, pkgName);
-		if (range != null)
-			filter = new AndFilter().addChild(pkgNameFilter).addChild(Filters.fromVersionRange(range));
-		else
-			filter = pkgNameFilter;
-		
-		return new CapReqBuilder(PackageNamespace.PACKAGE_NAMESPACE).addDirective(Namespace.REQUIREMENT_FILTER_DIRECTIVE, filter.toString());
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/Filters.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/Filters.java
deleted file mode 100644
index 20af48d..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/Filters.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package aQute.lib.osgi.resource;
-
-import aQute.libg.filters.AndFilter;
-import aQute.libg.filters.Filter;
-import aQute.libg.filters.NotFilter;
-import aQute.libg.filters.Operator;
-import aQute.libg.filters.SimpleFilter;
-import aQute.libg.version.VersionRange;
-
-public class Filters {
-	
-	public static Filter fromVersionRange(VersionRange range) {
-		return fromVersionRange(range, "version");
-	}
-	
-	public static Filter fromVersionRange(VersionRange range, @SuppressWarnings("unused") String versionAttr) {
-		if (range == null)
-			return null;
-		
-		Filter left;
-		if (range.includeLow())
-			left = new SimpleFilter("version", Operator.GreaterThanOrEqual, range.getLow().toString());
-		else
-			left = new NotFilter(new SimpleFilter("version", Operator.LessThanOrEqual, range.getLow().toString()));
-		
-		Filter right;
-		if (!range.isRange())
-			right = null;
-		else if (range.includeHigh())
-			right = new SimpleFilter("version", Operator.LessThanOrEqual, range.getHigh().toString());
-		else
-			right = new NotFilter(new SimpleFilter("version", Operator.GreaterThanOrEqual, range.getHigh().toString()));
-		
-		Filter result;
-		if (right != null)
-			result = new AndFilter().addChild(left).addChild(right);
-		else
-			result = left;
-		
-		return result;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceBuilder.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceBuilder.java
deleted file mode 100644
index 9e9cde3..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceBuilder.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package aQute.lib.osgi.resource;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import org.osgi.resource.Capability;
-import org.osgi.resource.Requirement;
-import org.osgi.resource.Resource;
-
-public class ResourceBuilder {
-
-	private final ResourceImpl		resource		= new ResourceImpl();
-	private final List<Capability>	capabilities	= new LinkedList<Capability>();
-	private final List<Requirement>	requirements	= new LinkedList<Requirement>();
-
-	private boolean					built			= false;
-
-	public ResourceBuilder addCapability(Capability capability) {
-		CapReqBuilder builder = CapReqBuilder.clone(capability);
-		return addCapability(builder);
-	}
-	
-	public ResourceBuilder addCapability(CapReqBuilder builder) {
-		if (built)
-			throw new IllegalStateException("Resource already built");
-
-		Capability cap = builder.setResource(resource).buildCapability();
-		capabilities.add(cap);
-
-		return this;
-	}
-	
-	public ResourceBuilder addRequirement(Requirement requirement) {
-		CapReqBuilder builder = CapReqBuilder.clone(requirement);
-		return addRequirement(builder);
-	}
-	
-	public ResourceBuilder addRequirement(CapReqBuilder builder) {
-		if (built)
-			throw new IllegalStateException("Resource already built");
-
-		Requirement req = builder.setResource(resource).buildRequirement();
-		requirements.add(req);
-
-		return this;
-	}
-
-	public Resource build() {
-		if (built)
-			throw new IllegalStateException("Resource already built");
-		built = true;
-
-		resource.setCapabilities(capabilities);
-		resource.setRequirements(requirements);
-		return resource;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceImpl.java b/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceImpl.java
deleted file mode 100644
index 7305148..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/ResourceImpl.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package aQute.lib.osgi.resource;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.osgi.framework.namespace.IdentityNamespace;
-import org.osgi.resource.Capability;
-import org.osgi.resource.Requirement;
-import org.osgi.resource.Resource;
-
-class ResourceImpl implements Resource {
-
-	private List<Capability>				allCapabilities;
-	private Map<String,List<Capability>>	capabilityMap;
-
-	private List<Requirement>				allRequirements;
-	private Map<String,List<Requirement>>	requirementMap;
-
-	void setCapabilities(List<Capability> capabilities) {
-		allCapabilities = capabilities;
-
-		capabilityMap = new HashMap<String,List<Capability>>();
-		for (Capability capability : capabilities) {
-			List<Capability> list = capabilityMap.get(capability.getNamespace());
-			if (list == null) {
-				list = new LinkedList<Capability>();
-				capabilityMap.put(capability.getNamespace(), list);
-			}
-			list.add(capability);
-		}
-	}
-
-	public List<Capability> getCapabilities(String namespace) {
-		return namespace == null ? allCapabilities : capabilityMap.get(namespace);
-	}
-
-	void setRequirements(List<Requirement> requirements) {
-		allRequirements = requirements;
-
-		requirementMap = new HashMap<String,List<Requirement>>();
-		for (Requirement requirement : requirements) {
-			List<Requirement> list = requirementMap.get(requirement.getNamespace());
-			if (list == null) {
-				list = new LinkedList<Requirement>();
-				requirementMap.put(requirement.getNamespace(), list);
-			}
-			list.add(requirement);
-		}
-	}
-
-	public List<Requirement> getRequirements(String namespace) {
-		return namespace == null ? allRequirements : requirementMap.get(namespace);
-	}
-
-	@Override
-	public String toString() {
-		final StringBuilder builder = new StringBuilder();
-		List<Capability> identities = getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE);
-		if (identities != null && identities.size() == 1) {
-			Capability idCap = identities.get(0);
-			Object id = idCap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE);
-			Object version = idCap.getAttributes().get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE);
-			
-			builder.append(id).append(" ver=").append(version);
-		} else {
-			// Generic toString
-			builder.append("ResourceImpl [caps=");
-			builder.append(allCapabilities);
-			builder.append(", reqs=");
-			builder.append(allRequirements);
-			builder.append("]");
-		}
-		return builder.toString();
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/resource/packageinfo b/bundleplugin/src/main/java/aQute/lib/osgi/resource/packageinfo
deleted file mode 100644
index a4f1546..0000000
--- a/bundleplugin/src/main/java/aQute/lib/osgi/resource/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/BadLocationException.java b/bundleplugin/src/main/java/aQute/lib/properties/BadLocationException.java
deleted file mode 100644
index 2d9207d..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/BadLocationException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package aQute.lib.properties;
-
-public class BadLocationException extends Exception {
-
-	private static final long	serialVersionUID	= 1L;
-
-	public BadLocationException() {
-		super();
-	}
-
-	public BadLocationException(String var0) {
-		super(var0);
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/CopyOnWriteTextStore.java b/bundleplugin/src/main/java/aQute/lib/properties/CopyOnWriteTextStore.java
deleted file mode 100644
index 179ab25..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/CopyOnWriteTextStore.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package aQute.lib.properties;
-
-/**
- * Copy-on-write <code>ITextStore</code> wrapper.
- * <p>
- * This implementation uses an unmodifiable text store for the initial content.
- * Upon first modification attempt, the unmodifiable store is replaced with a
- * modifiable instance which must be supplied in the constructor.
- * </p>
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * 
- * @since 3.2
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class CopyOnWriteTextStore implements ITextStore {
-
-	/**
-	 * An unmodifiable String based text store. It is not possible to modify the
-	 * content other than using {@link #set}. Trying to {@link #replace} a text
-	 * range will throw an <code>UnsupportedOperationException</code>.
-	 */
-	private static class StringTextStore implements ITextStore {
-
-		/** Represents the content of this text store. */
-		private String	fText	= "";	//$NON-NLS-1$
-
-		/**
-		 * Create an empty text store.
-		 */
-		StringTextStore() {
-			super();
-		}
-
-		/**
-		 * Create a text store with initial content.
-		 * 
-		 * @param text
-		 *            the initial content
-		 */
-		StringTextStore(String text) {
-			super();
-			set(text);
-		}
-
-		/*
-		 * @see org.eclipse.jface.text.ITextStore#get(int)
-		 */
-		public char get(int offset) {
-			return fText.charAt(offset);
-		}
-
-		/*
-		 * @see org.eclipse.jface.text.ITextStore#get(int, int)
-		 */
-		public String get(int offset, int length) {
-			return fText.substring(offset, offset + length);
-		}
-
-		/*
-		 * @see org.eclipse.jface.text.ITextStore#getLength()
-		 */
-		public int getLength() {
-			return fText.length();
-		}
-
-		/*
-		 * @see org.eclipse.jface.text.ITextStore#replace(int, int,
-		 * java.lang.String)
-		 */
-		public void replace(int offset, int length, String text) {
-			// modification not supported
-			throw new UnsupportedOperationException();
-		}
-
-		/*
-		 * @see org.eclipse.jface.text.ITextStore#set(java.lang.String)
-		 */
-		public void set(String text) {
-			fText = text != null ? text : ""; //$NON-NLS-1$
-		}
-
-	}
-
-	/** The underlying "real" text store */
-	protected ITextStore		fTextStore	= new StringTextStore();
-
-	/** A modifiable <code>ITextStore</code> instance */
-	private final ITextStore	fModifiableTextStore;
-
-	/**
-	 * Creates an empty text store. The given text store will be used upon first
-	 * modification attempt.
-	 * 
-	 * @param modifiableTextStore
-	 *            a modifiable <code>ITextStore</code> instance, may not be
-	 *            <code>null</code>
-	 */
-	public CopyOnWriteTextStore(ITextStore modifiableTextStore) {
-		fTextStore = new StringTextStore();
-		fModifiableTextStore = modifiableTextStore;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#get(int)
-	 */
-	public char get(int offset) {
-		return fTextStore.get(offset);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#get(int, int)
-	 */
-	public String get(int offset, int length) {
-		return fTextStore.get(offset, length);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#getLength()
-	 */
-	public int getLength() {
-		return fTextStore.getLength();
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#replace(int, int,
-	 * java.lang.String)
-	 */
-	public void replace(int offset, int length, String text) {
-		if (fTextStore != fModifiableTextStore) {
-			String content = fTextStore.get(0, fTextStore.getLength());
-			fTextStore = fModifiableTextStore;
-			fTextStore.set(content);
-		}
-		fTextStore.replace(offset, length, text);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#set(java.lang.String)
-	 */
-	public void set(String text) {
-		fTextStore = new StringTextStore(text);
-		fModifiableTextStore.set(""); //$NON-NLS-1$
-	}
-
-}
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/Document.java b/bundleplugin/src/main/java/aQute/lib/properties/Document.java
deleted file mode 100644
index 4df75a6..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/Document.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package aQute.lib.properties;
-
-public class Document implements IDocument {
-
-	public final static String[]	DELIMITERS	= {
-			"\r", "\n", "\r\n"
-												};
-
-	private LineTracker				lineTracker	= new LineTracker();
-	private ITextStore				textStore	= new CopyOnWriteTextStore(new GapTextStore());
-
-	public Document(String text) {
-		setText(text);
-	}
-
-	public int getNumberOfLines() {
-		return lineTracker.getNumberOfLines();
-	}
-
-	public IRegion getLineInformation(int line) throws BadLocationException {
-		return lineTracker.getLineInformation(line);
-	}
-
-	public String get(int offset, int length) throws BadLocationException {
-		return textStore.get(offset, length);
-	}
-
-	public String getLineDelimiter(int line) throws BadLocationException {
-		return lineTracker.getLineDelimiter(line);
-	}
-
-	public int getLength() {
-		return textStore.getLength();
-	}
-
-	public void replace(int offset, int length, String text) throws BadLocationException {
-		textStore.replace(offset, length, text);
-		lineTracker.set(get());
-	}
-
-	public char getChar(int pos) {
-		return textStore.get(pos);
-	}
-
-	public void setText(String text) {
-		textStore.set(text);
-		lineTracker.set(text);
-	}
-
-	public String get() {
-		return textStore.get(0, textStore.getLength());
-	}
-
-	protected static class DelimiterInfo {
-		public int		delimiterIndex;
-		public int		delimiterLength;
-		public String	delimiter;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/GapTextStore.java b/bundleplugin/src/main/java/aQute/lib/properties/GapTextStore.java
deleted file mode 100644
index 7c4a043..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/GapTextStore.java
+++ /dev/null
@@ -1,419 +0,0 @@
-package aQute.lib.properties;
-
-/**
- * Implements a gap managing text store. The gap text store relies on the
- * assumption that consecutive changes to a document are co-located. The start
- * of the gap is always moved to the location of the last change.
- * <p>
- * <strong>Performance:</strong> Typing-style changes perform in constant time
- * unless re-allocation becomes necessary. Generally, a change that does not
- * cause re-allocation will cause at most one
- * {@linkplain System#arraycopy(Object, int, Object, int, int) arraycopy}
- * operation of a length of about <var>d</var>, where <var>d</var> is the
- * distance from the previous change. Let <var>a(x)</var> be the algorithmic
- * performance of an <code>arraycopy</code> operation of the length
- * <var>x</var>, then such a change then performs in <i>O(a(x))</i>,
- * {@linkplain #get(int, int) get(int, <var>length</var>)} performs in
- * <i>O(a(length))</i>, {@link #get(int)} in <i>O(1)</i>.
- * <p>
- * How frequently the array needs re-allocation is controlled by the constructor
- * parameters.
- * </p>
- * <p>
- * This class is not intended to be subclassed.
- * </p>
- * 
- * @see CopyOnWriteTextStore for a copy-on-write text store wrapper
- * @noextend This class is not intended to be subclassed by clients.
- */
-public class GapTextStore implements ITextStore {
-	/**
-	 * The minimum gap size allocated when re-allocation occurs.
-	 * 
-	 * @since 3.3
-	 */
-	private final int	fMinGapSize;
-	/**
-	 * The maximum gap size allocated when re-allocation occurs.
-	 * 
-	 * @since 3.3
-	 */
-	private final int	fMaxGapSize;
-	/**
-	 * The multiplier to compute the array size from the content length
-	 * (1&nbsp;&lt;=&nbsp;fSizeMultiplier&nbsp;&lt;=&nbsp;2).
-	 * 
-	 * @since 3.3
-	 */
-	private final float	fSizeMultiplier;
-
-	/** The store's content */
-	private char[]		fContent	= new char[0];
-	/** Starting index of the gap */
-	private int			fGapStart	= 0;
-	/** End index of the gap */
-	private int			fGapEnd		= 0;
-	/**
-	 * The current high water mark. If a change would cause the gap to grow
-	 * larger than this, the array is re-allocated.
-	 * 
-	 * @since 3.3
-	 */
-	private int			fThreshold	= 0;
-
-	/**
-	 * Creates a new empty text store using the specified low and high
-	 * watermarks.
-	 * 
-	 * @param lowWatermark
-	 *            unused - at the lower bound, the array is only resized when
-	 *            the content does not fit
-	 * @param highWatermark
-	 *            if the gap is ever larger than this, it will automatically be
-	 *            shrunken (&gt;=&nbsp;0)
-	 * @deprecated use {@link GapTextStore#GapTextStore(int, int, float)}
-	 *             instead
-	 */
-	public GapTextStore(int lowWatermark, int highWatermark) {
-		/*
-		 * Legacy constructor. The API contract states that highWatermark is the
-		 * upper bound for the gap size. Albeit this contract was not previously
-		 * adhered to, it is now: The allocated gap size is fixed at half the
-		 * highWatermark. Since the threshold is always twice the allocated gap
-		 * size, the gap will never grow larger than highWatermark. Previously,
-		 * the gap size was initialized to highWatermark, causing re-allocation
-		 * if the content length shrunk right after allocation. The fixed gap
-		 * size is now only half of the previous value, circumventing that
-		 * problem (there was no API contract specifying the initial gap size).
-		 * The previous implementation did not allow the gap size to become
-		 * smaller than lowWatermark, which doesn't make any sense: that area of
-		 * the gap was simply never ever used.
-		 */
-		this(highWatermark / 2, highWatermark / 2, 0f);
-	}
-
-	/**
-	 * Equivalent to {@linkplain GapTextStore#GapTextStore(int, int, float) new
-	 * GapTextStore(256, 4096, 0.1f)}.
-	 * 
-	 * @since 3.3
-	 */
-	public GapTextStore() {
-		this(256, 4096, 0.1f);
-	}
-
-	/**
-	 * Creates an empty text store that uses re-allocation thresholds relative
-	 * to the content length. Re-allocation is controlled by the
-	 * <em>gap factor</em>, which is the quotient of the gap size and the array
-	 * size. Re-allocation occurs if a change causes the gap factor to go
-	 * outside <code>[0,&nbsp;maxGapFactor]</code>. When re-allocation occurs,
-	 * the array is sized such that the gap factor is
-	 * <code>0.5 * maxGapFactor</code>. The gap size computed in this manner is
-	 * bounded by the <code>minSize</code> and <code>maxSize</code> parameters.
-	 * <p>
-	 * A <code>maxGapFactor</code> of <code>0</code> creates a text store that
-	 * never has a gap at all (if <code>minSize</code> is 0); a
-	 * <code>maxGapFactor</code> of <code>1</code> creates a text store that
-	 * doubles its size with every re-allocation and that never shrinks.
-	 * </p>
-	 * <p>
-	 * The <code>minSize</code> and <code>maxSize</code> parameters are absolute
-	 * bounds to the allocated gap size. Use <code>minSize</code> to avoid
-	 * frequent re-allocation for small documents. Use <code>maxSize</code> to
-	 * avoid a huge gap being allocated for large documents.
-	 * </p>
-	 * 
-	 * @param minSize
-	 *            the minimum gap size to allocate (&gt;=&nbsp;0; use 0 for no
-	 *            minimum)
-	 * @param maxSize
-	 *            the maximum gap size to allocate (&gt;=&nbsp;minSize; use
-	 *            {@link Integer#MAX_VALUE} for no maximum)
-	 * @param maxGapFactor
-	 *            is the maximum fraction of the array that is occupied by the
-	 *            gap (
-	 *            <code>0&nbsp;&lt;=&nbsp;maxGapFactor&nbsp;&lt;=&nbsp;1</code>)
-	 * @since 3.3
-	 */
-	public GapTextStore(int minSize, int maxSize, float maxGapFactor) {
-		fMinGapSize = minSize;
-		fMaxGapSize = maxSize;
-		fSizeMultiplier = 1 / (1 - maxGapFactor / 2);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#get(int)
-	 */
-	public final char get(int offset) {
-		if (offset < fGapStart)
-			return fContent[offset];
-
-		return fContent[offset + gapSize()];
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#get(int, int)
-	 */
-	public final String get(int offset, int length) {
-		if (fGapStart <= offset)
-			return new String(fContent, offset + gapSize(), length);
-
-		final int end = offset + length;
-
-		if (end <= fGapStart)
-			return new String(fContent, offset, length);
-
-		StringBuffer buf = new StringBuffer(length);
-		buf.append(fContent, offset, fGapStart - offset);
-		buf.append(fContent, fGapEnd, end - fGapStart);
-		return buf.toString();
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#getLength()
-	 */
-	public final int getLength() {
-		return fContent.length - gapSize();
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#set(java.lang.String)
-	 */
-	public final void set(String text) {
-		/*
-		 * Moves the gap to the end of the content. There is no sensible
-		 * prediction of where the next change will occur, but at least the next
-		 * change will not trigger re-allocation. This is especially important
-		 * when using the GapTextStore within a CopyOnWriteTextStore, where the
-		 * GTS is only initialized right before a modification.
-		 */
-		replace(0, getLength(), text);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ITextStore#replace(int, int,
-	 * java.lang.String)
-	 */
-	public final void replace(int offset, int length, String text) {
-		if (text == null) {
-			adjustGap(offset, length, 0);
-		} else {
-			int textLength = text.length();
-			adjustGap(offset, length, textLength);
-			if (textLength != 0)
-				text.getChars(0, textLength, fContent, offset);
-		}
-	}
-
-	/**
-	 * Moves the gap to <code>offset + add</code>, moving any content after
-	 * <code>offset + remove</code> behind the gap. The gap size is kept between
-	 * 0 and {@link #fThreshold}, leading to re-allocation if needed. The
-	 * content between <code>offset</code> and <code>offset + add</code> is
-	 * undefined after this operation.
-	 * 
-	 * @param offset
-	 *            the offset at which a change happens
-	 * @param remove
-	 *            the number of character which are removed or overwritten at
-	 *            <code>offset</code>
-	 * @param add
-	 *            the number of character which are inserted or overwriting at
-	 *            <code>offset</code>
-	 */
-	private void adjustGap(int offset, int remove, int add) {
-		final int oldGapSize = gapSize();
-		final int newGapSize = oldGapSize - add + remove;
-		final boolean reuseArray = 0 <= newGapSize && newGapSize <= fThreshold;
-
-		final int newGapStart = offset + add;
-		final int newGapEnd;
-
-		if (reuseArray)
-			newGapEnd = moveGap(offset, remove, oldGapSize, newGapSize, newGapStart);
-		else
-			newGapEnd = reallocate(offset, remove, oldGapSize, newGapSize, newGapStart);
-
-		fGapStart = newGapStart;
-		fGapEnd = newGapEnd;
-	}
-
-	/**
-	 * Moves the gap to <code>newGapStart</code>.
-	 * 
-	 * @param offset
-	 *            the change offset
-	 * @param remove
-	 *            the number of removed / overwritten characters
-	 * @param oldGapSize
-	 *            the old gap size
-	 * @param newGapSize
-	 *            the gap size after the change
-	 * @param newGapStart
-	 *            the offset in the array to move the gap to
-	 * @return the new gap end
-	 * @since 3.3
-	 */
-	private int moveGap(int offset, int remove, int oldGapSize, int newGapSize, int newGapStart) {
-		/*
-		 * No re-allocation necessary. The area between the change offset and
-		 * gap can be copied in at most one operation. Don't copy parts that
-		 * will be overwritten anyway.
-		 */
-		final int newGapEnd = newGapStart + newGapSize;
-		if (offset < fGapStart) {
-			int afterRemove = offset + remove;
-			if (afterRemove < fGapStart) {
-				final int betweenSize = fGapStart - afterRemove;
-				arrayCopy(afterRemove, fContent, newGapEnd, betweenSize);
-			}
-			// otherwise, only the gap gets enlarged
-		} else {
-			final int offsetShifted = offset + oldGapSize;
-			final int betweenSize = offsetShifted - fGapEnd; // in the typing
-																// case,
-																// betweenSize
-																// is 0
-			arrayCopy(fGapEnd, fContent, fGapStart, betweenSize);
-		}
-		return newGapEnd;
-	}
-
-	/**
-	 * Reallocates a new array and copies the data from the previous one.
-	 * 
-	 * @param offset
-	 *            the change offset
-	 * @param remove
-	 *            the number of removed / overwritten characters
-	 * @param oldGapSize
-	 *            the old gap size
-	 * @param newGapSize
-	 *            the gap size after the change if no re-allocation would occur
-	 *            (can be negative)
-	 * @param newGapStart
-	 *            the offset in the array to move the gap to
-	 * @return the new gap end
-	 * @since 3.3
-	 */
-	private int reallocate(int offset, int remove, final int oldGapSize, int newGapSize, final int newGapStart) {
-		// the new content length (without any gap)
-		final int newLength = fContent.length - newGapSize;
-		// the new array size based on the gap factor
-		int newArraySize = (int) (newLength * fSizeMultiplier);
-		newGapSize = newArraySize - newLength;
-
-		// bound the gap size within min/max
-		if (newGapSize < fMinGapSize) {
-			newGapSize = fMinGapSize;
-			newArraySize = newLength + newGapSize;
-		} else if (newGapSize > fMaxGapSize) {
-			newGapSize = fMaxGapSize;
-			newArraySize = newLength + newGapSize;
-		}
-
-		// the upper threshold is always twice the gapsize
-		fThreshold = newGapSize * 2;
-		final char[] newContent = allocate(newArraySize);
-		final int newGapEnd = newGapStart + newGapSize;
-
-		/*
-		 * Re-allocation: The old content can be copied in at most 3 operations
-		 * to the newly allocated array. Either one of change offset and the gap
-		 * may come first. - unchanged area before the change offset / gap -
-		 * area between the change offset and the gap (either one may be first)
-		 * - rest area after the change offset / after the gap
-		 */
-		if (offset < fGapStart) {
-			// change comes before gap
-			arrayCopy(0, newContent, 0, offset);
-			int afterRemove = offset + remove;
-			if (afterRemove < fGapStart) {
-				// removal is completely before the gap
-				final int betweenSize = fGapStart - afterRemove;
-				arrayCopy(afterRemove, newContent, newGapEnd, betweenSize);
-				final int restSize = fContent.length - fGapEnd;
-				arrayCopy(fGapEnd, newContent, newGapEnd + betweenSize, restSize);
-			} else {
-				// removal encompasses the gap
-				afterRemove += oldGapSize;
-				final int restSize = fContent.length - afterRemove;
-				arrayCopy(afterRemove, newContent, newGapEnd, restSize);
-			}
-		} else {
-			// gap comes before change
-			arrayCopy(0, newContent, 0, fGapStart);
-			final int offsetShifted = offset + oldGapSize;
-			final int betweenSize = offsetShifted - fGapEnd;
-			arrayCopy(fGapEnd, newContent, fGapStart, betweenSize);
-			final int afterRemove = offsetShifted + remove;
-			final int restSize = fContent.length - afterRemove;
-			arrayCopy(afterRemove, newContent, newGapEnd, restSize);
-		}
-
-		fContent = newContent;
-		return newGapEnd;
-	}
-
-	/**
-	 * Allocates a new <code>char[size]</code>.
-	 * 
-	 * @param size
-	 *            the length of the new array.
-	 * @return a newly allocated char array
-	 * @since 3.3
-	 */
-	private char[] allocate(int size) {
-		return new char[size];
-	}
-
-	/*
-	 * Executes System.arraycopy if length != 0. A length < 0 cannot happen ->
-	 * don't hide coding errors by checking for negative lengths.
-	 * @since 3.3
-	 */
-	private void arrayCopy(int srcPos, char[] dest, int destPos, int length) {
-		if (length != 0)
-			System.arraycopy(fContent, srcPos, dest, destPos, length);
-	}
-
-	/**
-	 * Returns the gap size.
-	 * 
-	 * @return the gap size
-	 * @since 3.3
-	 */
-	private int gapSize() {
-		return fGapEnd - fGapStart;
-	}
-
-	/**
-	 * Returns a copy of the content of this text store. For internal use only.
-	 * 
-	 * @return a copy of the content of this text store
-	 */
-	protected String getContentAsString() {
-		return new String(fContent);
-	}
-
-	/**
-	 * Returns the start index of the gap managed by this text store. For
-	 * internal use only.
-	 * 
-	 * @return the start index of the gap managed by this text store
-	 */
-	protected int getGapStartIndex() {
-		return fGapStart;
-	}
-
-	/**
-	 * Returns the end index of the gap managed by this text store. For internal
-	 * use only.
-	 * 
-	 * @return the end index of the gap managed by this text store
-	 */
-	protected int getGapEndIndex() {
-		return fGapEnd;
-	}
-}
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/IDocument.java b/bundleplugin/src/main/java/aQute/lib/properties/IDocument.java
deleted file mode 100644
index aba541f..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/IDocument.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package aQute.lib.properties;
-
-public interface IDocument {
-
-	int getNumberOfLines();
-
-	IRegion getLineInformation(int lineNum) throws BadLocationException;
-
-	String get();
-
-	String get(int offset, int length) throws BadLocationException;
-
-	String getLineDelimiter(int line) throws BadLocationException;
-
-	int getLength();
-
-	void replace(int offset, int length, String data) throws BadLocationException;
-
-	char getChar(int offset) throws BadLocationException;
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/IRegion.java b/bundleplugin/src/main/java/aQute/lib/properties/IRegion.java
deleted file mode 100644
index 70230e7..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/IRegion.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package aQute.lib.properties;
-
-public interface IRegion {
-
-	int getLength();
-
-	int getOffset();
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/ITextStore.java b/bundleplugin/src/main/java/aQute/lib/properties/ITextStore.java
deleted file mode 100644
index f4cf2c7..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/ITextStore.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package aQute.lib.properties;
-
-/**
- * Interface for storing and managing text.
- * <p>
- * Provides access to the stored text and allows to manipulate it.
- * </p>
- * <p>
- * Clients may implement this interface or use
- * {@link org.eclipse.jface.text.GapTextStore} or
- * {@link org.eclipse.jface.text.CopyOnWriteTextStore}.
- * </p>
- */
-public interface ITextStore {
-
-	/**
-	 * Returns the character at the specified offset.
-	 * 
-	 * @param offset
-	 *            the offset in this text store
-	 * @return the character at this offset
-	 */
-	char get(int offset);
-
-	/**
-	 * Returns the text of the specified character range.
-	 * 
-	 * @param offset
-	 *            the offset of the range
-	 * @param length
-	 *            the length of the range
-	 * @return the text of the range
-	 */
-	String get(int offset, int length);
-
-	/**
-	 * Returns number of characters stored in this text store.
-	 * 
-	 * @return the number of characters stored in this text store
-	 */
-	int getLength();
-
-	/**
-	 * Replaces the specified character range with the given text.
-	 * <code>replace(getLength(), 0, "some text")</code> is a valid call and
-	 * appends text to the end of the text store.
-	 * 
-	 * @param offset
-	 *            the offset of the range to be replaced
-	 * @param length
-	 *            the number of characters to be replaced
-	 * @param text
-	 *            the substitution text
-	 */
-	void replace(int offset, int length, String text);
-
-	/**
-	 * Replace the content of the text store with the given text. Convenience
-	 * method for <code>replace(0, getLength(), text</code>.
-	 * 
-	 * @param text
-	 *            the new content of the text store
-	 */
-	void set(String text);
-}
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/Line.java b/bundleplugin/src/main/java/aQute/lib/properties/Line.java
deleted file mode 100644
index 8d07ce1..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/Line.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package aQute.lib.properties;
-
-/**
- * Describes a line as a particular number of characters beginning at a
- * particular offset, consisting of a particular number of characters, and being
- * closed with a particular line delimiter.
- */
-final class Line implements IRegion {
-
-	/** The offset of the line */
-	public int			offset;
-	/** The length of the line */
-	public int			length;
-	/** The delimiter of this line */
-	public final String	delimiter;
-
-	/**
-	 * Creates a new Line.
-	 * 
-	 * @param offset
-	 *            the offset of the line
-	 * @param end
-	 *            the last including character offset of the line
-	 * @param delimiter
-	 *            the line's delimiter
-	 */
-	public Line(int offset, int end, String delimiter) {
-		this.offset = offset;
-		this.length = (end - offset) + 1;
-		this.delimiter = delimiter;
-	}
-
-	/**
-	 * Creates a new Line.
-	 * 
-	 * @param offset
-	 *            the offset of the line
-	 * @param length
-	 *            the length of the line
-	 */
-	public Line(int offset, int length) {
-		this.offset = offset;
-		this.length = length;
-		this.delimiter = null;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IRegion#getOffset()
-	 */
-	public int getOffset() {
-		return offset;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.IRegion#getLength()
-	 */
-	public int getLength() {
-		return length;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/LineTracker.java b/bundleplugin/src/main/java/aQute/lib/properties/LineTracker.java
deleted file mode 100644
index a3c3adf..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/LineTracker.java
+++ /dev/null
@@ -1,382 +0,0 @@
-package aQute.lib.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import aQute.lib.properties.Document.DelimiterInfo;
-
-public class LineTracker {
-
-	/** The line information */
-	private final List<Line>	fLines	= new ArrayList<Line>();
-	/** The length of the tracked text */
-	private int					fTextLength;
-
-	/**
-	 * Creates a new line tracker.
-	 */
-	protected LineTracker() {}
-
-	/**
-	 * Binary search for the line at a given offset.
-	 * 
-	 * @param offset
-	 *            the offset whose line should be found
-	 * @return the line of the offset
-	 */
-	private int findLine(int offset) {
-
-		if (fLines.size() == 0)
-			return -1;
-
-		int left = 0;
-		int right = fLines.size() - 1;
-		int mid = 0;
-		Line line = null;
-
-		while (left < right) {
-
-			mid = (left + right) / 2;
-
-			line = fLines.get(mid);
-			if (offset < line.offset) {
-				if (left == mid)
-					right = left;
-				else
-					right = mid - 1;
-			} else if (offset > line.offset) {
-				if (right == mid)
-					left = right;
-				else
-					left = mid + 1;
-			} else if (offset == line.offset) {
-				left = right = mid;
-			}
-		}
-
-		line = fLines.get(left);
-		if (line.offset > offset)
-			--left;
-		return left;
-	}
-
-	/**
-	 * Returns the number of lines covered by the specified text range.
-	 * 
-	 * @param startLine
-	 *            the line where the text range starts
-	 * @param offset
-	 *            the start offset of the text range
-	 * @param length
-	 *            the length of the text range
-	 * @return the number of lines covered by this text range
-	 * @exception BadLocationException
-	 *                if range is undefined in this tracker
-	 */
-	private int getNumberOfLines(int startLine, int offset, int length) throws BadLocationException {
-
-		if (length == 0)
-			return 1;
-
-		int target = offset + length;
-
-		Line l = fLines.get(startLine);
-
-		if (l.delimiter == null)
-			return 1;
-
-		if (l.offset + l.length > target)
-			return 1;
-
-		if (l.offset + l.length == target)
-			return 2;
-
-		return getLineNumberOfOffset(target) - startLine + 1;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getLineLength(int)
-	 */
-	public final int getLineLength(int line) throws BadLocationException {
-		int lines = fLines.size();
-
-		if (line < 0 || line > lines)
-			throw new BadLocationException();
-
-		if (lines == 0 || lines == line)
-			return 0;
-
-		Line l = fLines.get(line);
-		return l.length;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getLineNumberOfOffset(int)
-	 */
-	public final int getLineNumberOfOffset(int position) throws BadLocationException {
-		if (position < 0 || position > fTextLength)
-			throw new BadLocationException();
-
-		if (position == fTextLength) {
-
-			int lastLine = fLines.size() - 1;
-			if (lastLine < 0)
-				return 0;
-
-			Line l = fLines.get(lastLine);
-			return (l.delimiter != null ? lastLine + 1 : lastLine);
-		}
-
-		return findLine(position);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getLineInformationOfOffset(int)
-	 */
-	public final IRegion getLineInformationOfOffset(int position) throws BadLocationException {
-		if (position > fTextLength)
-			throw new BadLocationException();
-
-		if (position == fTextLength) {
-			int size = fLines.size();
-			if (size == 0)
-				return new Region(0, 0);
-			Line l = fLines.get(size - 1);
-			return (l.delimiter != null ? new Line(fTextLength, 0) : new Line(fTextLength - l.length, l.length));
-		}
-
-		return getLineInformation(findLine(position));
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getLineInformation(int)
-	 */
-	public final IRegion getLineInformation(int line) throws BadLocationException {
-		int lines = fLines.size();
-
-		if (line < 0 || line > lines)
-			throw new BadLocationException();
-
-		if (lines == 0)
-			return new Line(0, 0);
-
-		if (line == lines) {
-			Line l = fLines.get(line - 1);
-			return new Line(l.offset + l.length, 0);
-		}
-
-		Line l = fLines.get(line);
-		return (l.delimiter != null ? new Line(l.offset, l.length - l.delimiter.length()) : l);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getLineOffset(int)
-	 */
-	public final int getLineOffset(int line) throws BadLocationException {
-		int lines = fLines.size();
-
-		if (line < 0 || line > lines)
-			throw new BadLocationException();
-
-		if (lines == 0)
-			return 0;
-
-		if (line == lines) {
-			Line l = fLines.get(line - 1);
-			if (l.delimiter != null)
-				return l.offset + l.length;
-			throw new BadLocationException();
-		}
-
-		Line l = fLines.get(line);
-		return l.offset;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getNumberOfLines()
-	 */
-	public final int getNumberOfLines() {
-		int lines = fLines.size();
-
-		if (lines == 0)
-			return 1;
-
-		Line l = fLines.get(lines - 1);
-		return (l.delimiter != null ? lines + 1 : lines);
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getNumberOfLines(int, int)
-	 */
-	public final int getNumberOfLines(int position, int length) throws BadLocationException {
-
-		if (position < 0 || position + length > fTextLength)
-			throw new BadLocationException();
-
-		if (length == 0) // optimization
-			return 1;
-
-		return getNumberOfLines(getLineNumberOfOffset(position), position, length);
-	}
-
-	/*
-	 * @see
-	 * org.eclipse.jface.text.ILineTracker#computeNumberOfLines(java.lang.String
-	 * )
-	 */
-	public final int computeNumberOfLines(String text) {
-		int count = 0;
-		int start = 0;
-		DelimiterInfo delimiterInfo = nextDelimiterInfo(text, start);
-		while (delimiterInfo != null && delimiterInfo.delimiterIndex > -1) {
-			++count;
-			start = delimiterInfo.delimiterIndex + delimiterInfo.delimiterLength;
-			delimiterInfo = nextDelimiterInfo(text, start);
-		}
-		return count;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#getLineDelimiter(int)
-	 */
-	public final String getLineDelimiter(int line) throws BadLocationException {
-		int lines = fLines.size();
-
-		if (line < 0 || line > lines)
-			throw new BadLocationException();
-
-		if (lines == 0)
-			return null;
-
-		if (line == lines)
-			return null;
-
-		Line l = fLines.get(line);
-		return l.delimiter;
-	}
-
-	/**
-	 * Returns the information about the first delimiter found in the given text
-	 * starting at the given offset.
-	 * 
-	 * @param text
-	 *            the text to be searched
-	 * @param offset
-	 *            the offset in the given text
-	 * @return the information of the first found delimiter or <code>null</code>
-	 */
-	protected DelimiterInfo nextDelimiterInfo(String text, int offset) {
-
-		char ch;
-		int length = text.length();
-		for (int i = offset; i < length; i++) {
-
-			ch = text.charAt(i);
-			if (ch == '\r') {
-
-				if (i + 1 < length) {
-					if (text.charAt(i + 1) == '\n') {
-						DelimiterInfo fDelimiterInfo = new DelimiterInfo();
-						fDelimiterInfo.delimiter = Document.DELIMITERS[2];
-						fDelimiterInfo.delimiterIndex = i;
-						fDelimiterInfo.delimiterLength = 2;
-						return fDelimiterInfo;
-					}
-				}
-				DelimiterInfo fDelimiterInfo = new DelimiterInfo();
-				fDelimiterInfo.delimiter = Document.DELIMITERS[0];
-				fDelimiterInfo.delimiterIndex = i;
-				fDelimiterInfo.delimiterLength = 1;
-				return fDelimiterInfo;
-
-			} else if (ch == '\n') {
-				DelimiterInfo fDelimiterInfo = new DelimiterInfo();
-				fDelimiterInfo.delimiter = Document.DELIMITERS[1];
-				fDelimiterInfo.delimiterIndex = i;
-				fDelimiterInfo.delimiterLength = 1;
-				return fDelimiterInfo;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * Creates the line structure for the given text. Newly created lines are
-	 * inserted into the line structure starting at the given position. Returns
-	 * the number of newly created lines.
-	 * 
-	 * @param text
-	 *            the text for which to create a line structure
-	 * @param insertPosition
-	 *            the position at which the newly created lines are inserted
-	 *            into the tracker's line structure
-	 * @param offset
-	 *            the offset of all newly created lines
-	 * @return the number of newly created lines
-	 */
-	private int createLines(String text, int insertPosition, int offset) {
-
-		int count = 0;
-		int start = 0;
-		DelimiterInfo delimiterInfo = nextDelimiterInfo(text, 0);
-
-		while (delimiterInfo != null && delimiterInfo.delimiterIndex > -1) {
-
-			int index = delimiterInfo.delimiterIndex + (delimiterInfo.delimiterLength - 1);
-
-			if (insertPosition + count >= fLines.size())
-				fLines.add(new Line(offset + start, offset + index, delimiterInfo.delimiter));
-			else
-				fLines.add(insertPosition + count, new Line(offset + start, offset + index, delimiterInfo.delimiter));
-
-			++count;
-			start = index + 1;
-			delimiterInfo = nextDelimiterInfo(text, start);
-		}
-
-		if (start < text.length()) {
-			if (insertPosition + count < fLines.size()) {
-				// there is a line below the current
-				Line l = fLines.get(insertPosition + count);
-				int delta = text.length() - start;
-				l.offset -= delta;
-				l.length += delta;
-			} else {
-				fLines.add(new Line(offset + start, offset + text.length() - 1, null));
-				++count;
-			}
-		}
-
-		return count;
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#replace(int, int,
-	 * java.lang.String)
-	 */
-	public final void replace(@SuppressWarnings("unused") int position, @SuppressWarnings("unused") int length, @SuppressWarnings("unused") String text) throws BadLocationException {
-		throw new UnsupportedOperationException();
-	}
-
-	/*
-	 * @see org.eclipse.jface.text.ILineTracker#set(java.lang.String)
-	 */
-	public final void set(String text) {
-		fLines.clear();
-		if (text != null) {
-			fTextLength = text.length();
-			createLines(text, 0, 0);
-		}
-	}
-
-	/**
-	 * Returns the internal data structure, a {@link List} of {@link Line}s.
-	 * Used only by {@link TreeLineTracker#TreeLineTracker(ListLineTracker)}.
-	 * 
-	 * @return the internal list of lines.
-	 */
-	final List<Line> getLines() {
-		return fLines;
-	}
-}
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/LineType.java b/bundleplugin/src/main/java/aQute/lib/properties/LineType.java
deleted file mode 100644
index 69eda5f..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/LineType.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package aQute.lib.properties;
-
-public enum LineType {
-	blank, comment, entry, eof
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/PropertiesLineReader.java b/bundleplugin/src/main/java/aQute/lib/properties/PropertiesLineReader.java
deleted file mode 100644
index c3ea14b..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/PropertiesLineReader.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package aQute.lib.properties;
-
-import static aQute.lib.properties.LineType.*;
-
-public class PropertiesLineReader {
-
-	private final IDocument	document;
-	private final int		lineCount;
-
-	private int				lineNum		= 0;
-
-	private IRegion			lastRegion	= null;
-	private String			lastKey		= null;
-	private String			lastValue	= null;
-
-	public PropertiesLineReader(IDocument document) {
-		this.document = document;
-		this.lineCount = document.getNumberOfLines();
-	}
-
-	public PropertiesLineReader(String data) {
-		this(new Document(data));
-	}
-
-	public LineType next() throws Exception {
-		int index = 0;
-		char[] chars = null;
-
-		StringBuilder keyData = new StringBuilder();
-		StringBuilder valueData = new StringBuilder();
-		StringBuilder currentBuffer = keyData;
-
-		boolean started = false;
-
-		mainLoop: while (true) {
-			if (chars == null)
-				chars = grabLine(false);
-			if (chars == null)
-				return eof;
-
-			if (index >= chars.length)
-				break;
-
-			char c = chars[index];
-			if (c == '\\') {
-				index++;
-				if (index == chars.length) {
-					chars = grabLine(true);
-					index = 0;
-					if (chars == null || chars.length == 0)
-						break; // The last line ended with a backslash
-				}
-				currentBuffer.append(chars[index]);
-				index++;
-				continue mainLoop;
-			}
-
-			if (c == '=' || c == ':')
-				currentBuffer = valueData;
-
-			if (!started && (c == '#' || c == '!'))
-				return comment;
-
-			if (Character.isWhitespace(c)) {
-				if (started) {
-					// whitespace ends the key
-					currentBuffer = valueData;
-				}
-			} else {
-				started = true;
-				currentBuffer.append(c);
-			}
-
-			index++;
-		}
-
-		if (!started)
-			return blank;
-
-		lastKey = keyData.toString();
-		return entry;
-	}
-
-	private char[] grabLine(boolean continued) throws BadLocationException {
-		if (lineNum >= lineCount) {
-			lastRegion = null;
-			return null;
-		}
-
-		IRegion lineInfo = document.getLineInformation(lineNum);
-		char[] chars = document.get(lineInfo.getOffset(), lineInfo.getLength()).toCharArray();
-
-		if (continued) {
-			int length = lastRegion.getLength();
-			length += document.getLineDelimiter(lineNum - 1).length();
-			length += lineInfo.getLength();
-			lastRegion = new Region(lastRegion.getOffset(), length);
-		} else {
-			lastRegion = lineInfo;
-		}
-
-		lineNum++;
-		return chars;
-	}
-
-	public IRegion region() {
-		if (lastRegion == null)
-			throw new IllegalStateException("Last region not available: either before start or after end of document.");
-		return lastRegion;
-	}
-
-	public String key() {
-		if (lastKey == null)
-			throw new IllegalStateException(
-					"Last key not available: either before state or after end of document, or last line type was not 'entry'.");
-		return lastKey;
-	}
-
-	public String value() {
-		if (lastValue == null)
-			throw new IllegalStateException(
-					"Last value not available: either before state or after end of document, or last line type was not 'entry'.");
-		return lastValue;
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/PropertiesReader.java b/bundleplugin/src/main/java/aQute/lib/properties/PropertiesReader.java
deleted file mode 100644
index 58426af..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/PropertiesReader.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package aQute.lib.properties;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.regex.*;
-
-import aQute.lib.io.*;
-
-public class PropertiesReader {
-	static Pattern	PROPERTY	= Pattern.compile("(\\s*#.*$)|(([^\\s]+)\\s*[:=]?\\s*([^#])(#.*)$)|\\s+([^#]*)(#.*)$)",
-										Pattern.MULTILINE);
-
-	public static Properties read(Properties p, File f) throws Exception {
-		return read(p, IO.reader(f));
-	}
-
-	public static Properties read(Properties p, InputStream in, String charset) throws IOException {
-		return read(p, IO.reader(in, charset));
-	}
-
-	public static Properties read(Properties p, InputStream in) throws IOException {
-		return read(p, IO.reader(in));
-	}
-
-	public static Properties read(Properties p, URL in) throws IOException {
-		return read(p, IO.reader(in.openStream()));
-	}
-
-	private static Properties read(Properties p, BufferedReader reader) throws IOException {
-		if (p != null)
-			p = new Properties();
-
-		String line = reader.readLine();
-		String key = null;
-		StringBuilder value = new StringBuilder();
-
-		while (line != null) {
-			Matcher m = PROPERTY.matcher(line);
-			if (m.matches()) {
-
-				if (m.group(1) != null)
-					continue; // comment line
-
-				if (m.group(2) != null) {
-					// header
-					if (key != null) {
-						cleanup(value);
-						p.put(key.toString(), value.toString());
-						key = null;
-						value.delete(0, value.length());
-					}
-					key = m.group(3);
-					value.append(m.group(4));
-				} else {
-					value.append(m.group(6));
-				}
-			} else {
-				System.out.println("Assume empty: " + line);
-			}
-			line = reader.readLine();
-		}
-		if (key != null) {
-			cleanup(value);
-			p.put(key.toString(), value.toString());
-		}
-		return p;
-	}
-
-	private static void cleanup(StringBuilder value) {
-		for (int i = 0; i < value.length(); i++) {
-			if (value.charAt(i) == '\\') {
-				value.deleteCharAt(i);
-				if (i < value.length()) {
-					char c = value.charAt(i);
-					switch (c) {
-						case 't' :
-							value.setCharAt(i, '\t');
-							break;
-						case 'r' :
-							value.setCharAt(i, '\r');
-							break;
-						case 'n' :
-							value.setCharAt(i, '\n');
-							break;
-						case 'f' :
-							value.setCharAt(i, '\f');
-							break;
-						case 'b' :
-							value.setCharAt(i, '\b');
-							break;
-
-						case 'u' :
-							if (i + 5 >= value.length())
-								throw new IllegalArgumentException("Invalid unicode escape " + value.substring(i));
-
-							String n = value.substring(i + 1, i + 5);
-							try {
-								int code = Integer.valueOf(n, 16);
-								value.delete(i + 1, i + 5);
-								value.setCharAt(i, (char) code);
-							}
-							catch (Exception e) {
-								throw new IllegalArgumentException("Invalid unicode escape " + value.substring(i));
-							}
-							break;
-						default :
-							throw new IllegalArgumentException("Invalid  escape " + value);
-					}
-				}
-
-			}
-		}
-	}
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/Region.java b/bundleplugin/src/main/java/aQute/lib/properties/Region.java
deleted file mode 100644
index 5ece58e..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/Region.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package aQute.lib.properties;
-
-public class Region implements IRegion {
-
-	private final int	offset;
-	private final int	length;
-
-	public Region(int offset, int length) {
-		this.offset = offset;
-		this.length = length;
-	}
-
-	public int getOffset() {
-		return offset;
-
-	}
-
-	public int getLength() {
-		return length;
-	}
-
-}
diff --git a/bundleplugin/src/main/java/aQute/lib/properties/packageinfo b/bundleplugin/src/main/java/aQute/lib/properties/packageinfo
deleted file mode 100644
index a4f1546..0000000
--- a/bundleplugin/src/main/java/aQute/lib/properties/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0
\ No newline at end of file
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java b/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java
index 4fcbc34..2f08e10 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java
@@ -2,7 +2,7 @@
 
 import java.util.*;
 
-import aQute.lib.osgi.*;
+import aQute.bnd.osgi.*;
 
 /**
  * This component is called when we find a resource in the META-INF/*.xml
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java b/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java
index c8678a8..eff6ef4 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java
@@ -8,10 +8,10 @@
 import javax.xml.transform.*;
 import javax.xml.transform.stream.*;
 
+import aQute.bnd.header.*;
+import aQute.bnd.osgi.*;
+import aQute.bnd.osgi.Descriptors.PackageRef;
 import aQute.bnd.service.*;
-import aQute.lib.osgi.*;
-import aQute.lib.osgi.Descriptors.PackageRef;
-import aQute.libg.header.*;
 
 /**
  * This component is called when we find a resource in the META-INF/*.xml
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java b/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java
index b4840d0..ae524d3 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java
@@ -2,7 +2,7 @@
 
 import java.util.*;
 
-import aQute.lib.osgi.*;
+import aQute.bnd.osgi.*;
 
 /**
  * This component is called when we find a resource in the META-INF/*.xml
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java b/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java
index 7d65d1c..d01fd57 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java
@@ -8,8 +8,8 @@
 import javax.xml.transform.*;
 import javax.xml.transform.stream.*;
 
-import aQute.lib.osgi.*;
-import aQute.lib.osgi.Descriptors.PackageRef;
+import aQute.bnd.osgi.*;
+import aQute.bnd.osgi.Descriptors.PackageRef;
 
 public class XMLType {
 
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java b/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java
index dc17eb1..e8ca286 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java
@@ -2,9 +2,9 @@
 
 import java.util.*;
 
+import aQute.bnd.header.*;
+import aQute.bnd.osgi.*;
 import aQute.bnd.service.*;
-import aQute.lib.osgi.*;
-import aQute.libg.header.*;
 
 public class XMLTypeProcessor implements AnalyzerPlugin {