Latest bnd code

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1350613 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/aQute/lib/base64/Base64.java b/bundleplugin/src/main/java/aQute/lib/base64/Base64.java
index 151adc4..777ac91 100755
--- a/bundleplugin/src/main/java/aQute/lib/base64/Base64.java
+++ b/bundleplugin/src/main/java/aQute/lib/base64/Base64.java
@@ -28,19 +28,18 @@
 		this.data = data;
 	}
 
-	
-	
 	public final static byte[] decodeBase64(String string) {
-		ByteArrayOutputStream bout= new ByteArrayOutputStream(string.length()*2/3);
+		ByteArrayOutputStream bout = new ByteArrayOutputStream(string.length() * 2 / 3);
 		StringReader rdr = new StringReader(string.trim());
 		try {
-			decode(rdr,bout);
-		} catch (Exception e) {
+			decode(rdr, bout);
+		}
+		catch (Exception e) {
 			// cannot happen
 		}
 		return bout.toByteArray();
 	}
-	
+
 	public final static void decode(Reader rdr, OutputStream out) throws Exception {
 		int register = 0;
 		int i = 0;
@@ -48,22 +47,19 @@
 
 		byte test[] = new byte[3];
 		int c;
-		while ((c=rdr.read()) >= 0) {
+		while ((c = rdr.read()) >= 0) {
 
 			if (c > 0x7F)
-				throw new IllegalArgumentException(
-						"Invalid base64 character in " + rdr
-								+ ", character value > 128 ");
-			
+				throw new IllegalArgumentException("Invalid base64 character in " + rdr + ", character value > 128 ");
+
 			int v = 0;
-			if ( c == '=' ) {
+			if (c == '=') {
 				pads++;
 			} else {
 				v = values[c];
-				if ( v < 0 )
-					throw new IllegalArgumentException(
-							"Invalid base64 character in " + rdr + ", " + c );
-			}					
+				if (v < 0)
+					throw new IllegalArgumentException("Invalid base64 character in " + rdr + ", " + c);
+			}
 			register <<= 6;
 			register |= v;
 			test[2] = (byte) (register & 0xFF);
@@ -82,19 +78,19 @@
 
 	static private void flush(OutputStream out, int register, int pads) throws IOException {
 		switch (pads) {
-		case 0:
-			out.write(0xFF & (register >> 16));
-			out.write(0xFF & (register >> 8));
-			out.write(0xFF & (register >> 0));
-			break;
-			
-		case 1:
-			out.write(0xFF & (register >> 16));
-			out.write(0xFF & (register >> 8));
-			break;
-			
-		case 2:
-			out.write(0xFF & (register >> 16));
+			case 0 :
+				out.write(0xFF & (register >> 16));
+				out.write(0xFF & (register >> 8));
+				out.write(0xFF & (register >> 0));
+				break;
+
+			case 1 :
+				out.write(0xFF & (register >> 16));
+				out.write(0xFF & (register >> 8));
+				break;
+
+			case 2 :
+				out.write(0xFF & (register >> 16));
 		}
 	}
 
@@ -110,24 +106,24 @@
 		StringWriter sw = new StringWriter();
 		ByteArrayInputStream bin = new ByteArrayInputStream(data);
 		try {
-			encode(bin,sw);
-		} catch (IOException e) {
+			encode(bin, sw);
+		}
+		catch (IOException e) {
 			// can't happen
 		}
 		return sw.toString();
 	}
-	
 
 	public Object toData() {
 		return data;
 	}
 
 	public static void encode(InputStream in, Appendable sb) throws IOException {
-		//StringBuilder sb = new StringBuilder();
+		// StringBuilder sb = new StringBuilder();
 		int buf = 0;
 		int bits = 0;
 		int out = 0;
-		
+
 		while (true) {
 			if (bits >= 6) {
 				bits -= 6;
diff --git a/bundleplugin/src/main/java/aQute/lib/codec/Codec.java b/bundleplugin/src/main/java/aQute/lib/codec/Codec.java
index 6de09cf..6072ebd 100644
--- a/bundleplugin/src/main/java/aQute/lib/codec/Codec.java
+++ b/bundleplugin/src/main/java/aQute/lib/codec/Codec.java
@@ -4,6 +4,7 @@
 import java.lang.reflect.*;
 
 public interface Codec {
-	Object decode(Reader in, Type type) throws Exception;	
+	Object decode(Reader in, Type type) throws Exception;
+
 	void encode(Type t, Object o, Appendable out) throws Exception;
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/codec/HCodec.java b/bundleplugin/src/main/java/aQute/lib/codec/HCodec.java
index f97e695..c174e52 100644
--- a/bundleplugin/src/main/java/aQute/lib/codec/HCodec.java
+++ b/bundleplugin/src/main/java/aQute/lib/codec/HCodec.java
@@ -15,7 +15,7 @@
 	}
 
 	public <T> T decode(InputStream in, Class<T> t) throws Exception {
-		return t.cast(decode(in, (Type)t));
+		return t.cast(decode(in, (Type) t));
 	}
 
 	public <T> T decode(Reader in, Class<T> t) throws Exception {
@@ -35,7 +35,8 @@
 		OutputStreamWriter wr = new OutputStreamWriter(out, "UTF-8");
 		try {
 			codec.encode(t, o, wr);
-		} finally {
+		}
+		finally {
 			wr.flush();
 		}
 	}
@@ -46,10 +47,12 @@
 			InputStreamReader rdr = new InputStreamReader(fin, "UTF-8");
 			try {
 				return t.cast(decode(rdr, t));
-			} finally {
+			}
+			finally {
 				rdr.close();
 			}
-		} finally {
+		}
+		finally {
 			fin.close();
 		}
 
@@ -61,10 +64,12 @@
 			Writer wr = new OutputStreamWriter(oout, "UTF-8");
 			try {
 				codec.encode(t, o, wr);
-			} finally {
+			}
+			finally {
 				wr.close();
 			}
-		} finally {
+		}
+		finally {
 			oout.close();
 		}
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/EnumerationIterator.java b/bundleplugin/src/main/java/aQute/lib/collections/EnumerationIterator.java
index ec7aec6..1bb9f0d 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/EnumerationIterator.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/EnumerationIterator.java
@@ -8,11 +8,11 @@
  * @param <T>
  */
 public class EnumerationIterator<T> implements Iterable<T>, Iterator<T> {
-	
+
 	public static <T> EnumerationIterator<T> iterator(Enumeration<T> e) {
 		return new EnumerationIterator<T>(e);
 	}
-	
+
 	final Enumeration<T>	enumerator;
 	volatile boolean		done	= false;
 
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/ExtList.java b/bundleplugin/src/main/java/aQute/lib/collections/ExtList.java
index 4c4f558..40c80ca 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/ExtList.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/ExtList.java
@@ -5,24 +5,24 @@
 public class ExtList<T> extends ArrayList<T> {
 	private static final long	serialVersionUID	= 1L;
 
-	public ExtList(T ... ts) {
+	public ExtList(T... ts) {
 		super(ts.length);
-		for (T t : ts){
+		for (T t : ts) {
 			add(t);
 		}
 	}
-	
+
 	public String join() {
 		return join(",");
 	}
 
 	public String join(String del) {
 		StringBuilder sb = new StringBuilder();
-		String d= "";
-		for ( T t : this) {
+		String d = "";
+		for (T t : this) {
 			sb.append(d);
-			d=del;
-			if ( t != null)
+			d = del;
+			if (t != null)
 				sb.append(t.toString());
 		}
 		return sb.toString();
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/IteratorList.java b/bundleplugin/src/main/java/aQute/lib/collections/IteratorList.java
index cb96d16..63ddbeb 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/IteratorList.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/IteratorList.java
@@ -5,8 +5,8 @@
 public class IteratorList<T> extends ArrayList<T> {
 	private static final long	serialVersionUID	= 1L;
 
-	public IteratorList(Iterator<T> i){
-		while(i.hasNext())
+	public IteratorList(Iterator<T> i) {
+		while (i.hasNext())
 			add(i.next());
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/LineCollection.java b/bundleplugin/src/main/java/aQute/lib/collections/LineCollection.java
index a04ab36..0670712 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/LineCollection.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/LineCollection.java
@@ -12,7 +12,7 @@
 	}
 
 	public LineCollection(File in) throws IOException {
-		this(new InputStreamReader( new FileInputStream(in),"UTF-8"));
+		this(new InputStreamReader(new FileInputStream(in), "UTF-8"));
 	}
 
 	public LineCollection(Reader reader) throws IOException {
@@ -37,7 +37,8 @@
 			if (next == null)
 				reader.close();
 			return result;
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			// ignore
 			return null;
 		}
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/Logic.java b/bundleplugin/src/main/java/aQute/lib/collections/Logic.java
index 75322dd..6daeaad 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/Logic.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/Logic.java
@@ -3,18 +3,18 @@
 import java.util.*;
 
 public class Logic {
-	
-	public static <T> Collection<T> retain( Collection<T> first, Collection<T> ... sets) {
+
+	public static <T> Collection<T> retain(Collection<T> first, Collection<T>... sets) {
 		Set<T> result = new HashSet<T>(first);
-		for ( Collection<T> set : sets ) {
+		for (Collection<T> set : sets) {
 			result.retainAll(set);
 		}
 		return result;
 	}
-	
-	public static <T> Collection<T> remove( Collection<T> first, Collection<T> ... sets) {
+
+	public static <T> Collection<T> remove(Collection<T> first, Collection<T>... sets) {
 		Set<T> result = new HashSet<T>(first);
-		for ( Collection<T> set : sets ) {
+		for (Collection<T> set : sets) {
 			result.removeAll(set);
 		}
 		return result;
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java b/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
index fcf28ac..21c1509 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/MultiMap.java
@@ -2,110 +2,111 @@
 
 import java.util.*;
 
-public class MultiMap<K,V> extends HashMap<K,List<V>> {
+public class MultiMap<K, V> extends HashMap<K,List<V>> {
 	private static final long	serialVersionUID	= 1L;
-	final boolean noduplicates;
-	final Class<?> keyClass;
-	final Class<?> valueClass;
-	
-	final Set<V> EMPTY = Collections.emptySet();
-	
+	final boolean				noduplicates;
+	final Class< ? >			keyClass;
+	final Class< ? >			valueClass;
+
+	final Set<V>				EMPTY				= Collections.emptySet();
+
 	public MultiMap() {
 		noduplicates = false;
 		keyClass = Object.class;
 		valueClass = Object.class;
 	}
-	
-	public MultiMap(Class<K> keyClass, Class<V> valueClass, boolean noduplicates ) {
-		this.noduplicates = noduplicates;		
+
+	public MultiMap(Class<K> keyClass, Class<V> valueClass, boolean noduplicates) {
+		this.noduplicates = noduplicates;
 		this.keyClass = keyClass;
 		this.valueClass = valueClass;
 	}
-	
-	@SuppressWarnings("unchecked") public boolean add( K key, V value ) {
+
+	@SuppressWarnings("unchecked")
+	public boolean add(K key, V value) {
 		assert keyClass.isInstance(key);
 		assert valueClass.isInstance(value);
-		
+
 		List<V> set = get(key);
-		if ( set == null) {
-			set=new ArrayList<V>();
-			if ( valueClass != Object.class) {
-				set = Collections.checkedList(set, (Class<V>)valueClass);
+		if (set == null) {
+			set = new ArrayList<V>();
+			if (valueClass != Object.class) {
+				set = Collections.checkedList(set, (Class<V>) valueClass);
 			}
-			put(key,set);
-		}else {
+			put(key, set);
+		} else {
 			if (noduplicates) {
-				if ( set.contains(value))
+				if (set.contains(value))
 					return false;
 			}
 		}
 		return set.add(value);
 	}
-	
-	@SuppressWarnings("unchecked") public boolean addAll( K key, Collection<? extends V> value ) {
+
+	@SuppressWarnings("unchecked")
+	public boolean addAll(K key, Collection< ? extends V> value) {
 		assert keyClass.isInstance(key);
 		List<V> set = get(key);
-		if ( set == null) {
-			set=new ArrayList<V>();
-			if ( valueClass != Object.class) {
-				set = Collections.checkedList(set, (Class<V>)valueClass);
+		if (set == null) {
+			set = new ArrayList<V>();
+			if (valueClass != Object.class) {
+				set = Collections.checkedList(set, (Class<V>) valueClass);
 			}
-			put(key,set);
-		} else
-		if ( noduplicates) {
-			boolean r=false;
-			for ( V v : value) {
+			put(key, set);
+		} else if (noduplicates) {
+			boolean r = false;
+			for (V v : value) {
 				assert valueClass.isInstance(v);
-				if ( !set.contains(value))
-					r|=set.add(v);
+				if (!set.contains(value))
+					r |= set.add(v);
 			}
 			return r;
 		}
 		return set.addAll(value);
 	}
-	
-	public boolean remove( K key, V value ) {
+
+	public boolean remove(K key, V value) {
 		assert keyClass.isInstance(key);
 		assert valueClass.isInstance(value);
-		
+
 		List<V> set = get(key);
-		if ( set == null) {
+		if (set == null) {
 			return false;
 		}
 		boolean result = set.remove(value);
-		if ( set.isEmpty())
+		if (set.isEmpty())
 			remove(key);
 		return result;
 	}
-	
-	public boolean removeAll( K key, Collection<V> value ) {
+
+	public boolean removeAll(K key, Collection<V> value) {
 		assert keyClass.isInstance(key);
 		List<V> set = get(key);
-		if ( set == null) {
+		if (set == null) {
 			return false;
 		}
 		boolean result = set.removeAll(value);
-		if ( set.isEmpty())
+		if (set.isEmpty())
 			remove(key);
 		return result;
 	}
-	
+
 	public Iterator<V> iterate(K key) {
 		assert keyClass.isInstance(key);
 		List<V> set = get(key);
-		if ( set == null)
+		if (set == null)
 			return EMPTY.iterator();
 		return set.iterator();
 	}
-	
+
 	public Iterator<V> all() {
 		return new Iterator<V>() {
-			Iterator<List<V>> master = values().iterator();
-			Iterator<V> current = null;
-			
+			Iterator<List<V>>	master	= values().iterator();
+			Iterator<V>			current	= null;
+
 			public boolean hasNext() {
-				if ( current == null || !current.hasNext()) {
-					if ( master.hasNext()) {
+				if (current == null || !current.hasNext()) {
+					if (master.hasNext()) {
 						current = master.next().iterator();
 						return current.hasNext();
 					}
@@ -121,35 +122,35 @@
 			public void remove() {
 				current.remove();
 			}
-			
+
 		};
 	}
-	
+
 	public Map<K,V> flatten() {
 		Map<K,V> map = new LinkedHashMap<K,V>();
-		for ( Map.Entry<K, List<V>> entry : entrySet()) {
+		for (Map.Entry<K,List<V>> entry : entrySet()) {
 			List<V> v = entry.getValue();
-			if ( v == null || v.isEmpty())
+			if (v == null || v.isEmpty())
 				continue;
 
 			map.put(entry.getKey(), v.get(0));
 		}
 		return map;
 	}
-	
+
 	public MultiMap<V,K> transpose() {
 		MultiMap<V,K> inverted = new MultiMap<V,K>();
-		for ( Map.Entry<K, List<V>> entry : entrySet()) {
+		for (Map.Entry<K,List<V>> entry : entrySet()) {
 			K key = entry.getKey();
-			
+
 			List<V> value = entry.getValue();
-			if ( value == null)
+			if (value == null)
 				continue;
-			
-			for ( V v : value)
+
+			for (V v : value)
 				inverted.add(v, key);
 		}
-		
+
 		return inverted;
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/collections/SortedList.java b/bundleplugin/src/main/java/aQute/lib/collections/SortedList.java
index 220d875..ad5ef4c 100644
--- a/bundleplugin/src/main/java/aQute/lib/collections/SortedList.java
+++ b/bundleplugin/src/main/java/aQute/lib/collections/SortedList.java
@@ -5,30 +5,28 @@
 /**
  * An immutbale list that sorts objects by their natural order or through a
  * comparator. It has convenient methods/constructors to create it from
- * collections and iterators.
- * 
- * Why not maintain the lists in their sorted form? Well, TreeMaps are quite
- * expensive ... I once profiled bnd and was shocked how much memory the Jar
- * class took due to the TreeMaps. I could not easily change it unfortunately.
- * The other reason is that Parameters uses a LinkedHashMap because the
- * preferred order should be the declaration order. However, sometimes you need
- * to sort the keys by name.
- * 
- * Last, and most important reason, is that sometimes you do not know what
- * collection you have or it is not available in a sort ordering (MultiMap for
- * example) ... I found myself sorting these things over and over again and
- * decided to just make an immutable SortedList that is easy to slice and dice
+ * collections and iterators. Why not maintain the lists in their sorted form?
+ * Well, TreeMaps are quite expensive ... I once profiled bnd and was shocked
+ * how much memory the Jar class took due to the TreeMaps. I could not easily
+ * change it unfortunately. The other reason is that Parameters uses a
+ * LinkedHashMap because the preferred order should be the declaration order.
+ * However, sometimes you need to sort the keys by name. Last, and most
+ * important reason, is that sometimes you do not know what collection you have
+ * or it is not available in a sort ordering (MultiMap for example) ... I found
+ * myself sorting these things over and over again and decided to just make an
+ * immutable SortedList that is easy to slice and dice
  * 
  * @param <T>
  */
-@SuppressWarnings("unchecked") public class SortedList<T> implements SortedSet<T>, List<T> {
-	static SortedList<?>		empty		= new SortedList<Object>();
+@SuppressWarnings("unchecked")
+public class SortedList<T> implements SortedSet<T>, List<T> {
+	static SortedList< ? >		empty		= new SortedList<Object>();
 
 	final T[]					list;
 	final int					start;
 	final int					end;
 	final Comparator<T>			cmp;
-	Class<?>					type;
+	Class< ? >					type;
 	static Comparator<Object>	comparator	= //
 
 											new Comparator<Object>() {
@@ -78,20 +76,23 @@
 			return (n - 1) - start;
 		}
 
-		@Deprecated public void remove() {
+		@Deprecated
+		public void remove() {
 			throw new UnsupportedOperationException("Immutable");
 		}
 
-		@Deprecated public void set(T e) {
+		@Deprecated
+		public void set(T e) {
 			throw new UnsupportedOperationException("Immutable");
 		}
 
-		@Deprecated public void add(T e) {
+		@Deprecated
+		public void add(T e) {
 			throw new UnsupportedOperationException("Immutable");
 		}
 	}
 
-	public SortedList(Collection<? extends Comparable<?>> x) {
+	public SortedList(Collection< ? extends Comparable< ? >> x) {
 		this((Collection<T>) x, 0, x.size(), (Comparator<T>) comparator);
 	}
 
@@ -135,7 +136,7 @@
 		this.cmp = comparator2;
 	}
 
-	public SortedList(Collection<? extends T> x, int start, int end, Comparator<T> cmp) {
+	public SortedList(Collection< ? extends T> x, int start, int end, Comparator<T> cmp) {
 		if (start > end) {
 			int tmp = start;
 			start = end;
@@ -183,7 +184,8 @@
 		return list.clone();
 	}
 
-	@SuppressWarnings("hiding") public <T> T[] toArray(T[] a) {
+	@SuppressWarnings("hiding")
+	public <T> T[] toArray(T[] a) {
 		if (a == null || a.length < list.length) {
 			return (T[]) list.clone();
 		}
@@ -199,7 +201,7 @@
 		throw new UnsupportedOperationException("Immutable");
 	}
 
-	public boolean containsAll(Collection<?> c) {
+	public boolean containsAll(Collection< ? > c) {
 		if (c.isEmpty())
 			return true;
 
@@ -215,15 +217,15 @@
 		return false;
 	}
 
-	public boolean addAll(Collection<? extends T> c) {
+	public boolean addAll(Collection< ? extends T> c) {
 		throw new UnsupportedOperationException("Immutable");
 	}
 
-	public boolean retainAll(Collection<?> c) {
+	public boolean retainAll(Collection< ? > c) {
 		throw new UnsupportedOperationException("Immutable");
 	}
 
-	public boolean removeAll(Collection<?> c) {
+	public boolean removeAll(Collection< ? > c) {
 		throw new UnsupportedOperationException("Immutable");
 	}
 
@@ -231,7 +233,7 @@
 		throw new UnsupportedOperationException("Immutable");
 	}
 
-	public Comparator<? super T> comparator() {
+	public Comparator< ? super T> comparator() {
 		return cmp;
 	}
 
@@ -299,7 +301,8 @@
 		return get(end - 1);
 	}
 
-	@Deprecated public boolean addAll(int index, Collection<? extends T> c) {
+	@Deprecated
+	public boolean addAll(int index, Collection< ? extends T> c) {
 		throw new UnsupportedOperationException("Immutable");
 	}
 
@@ -307,15 +310,18 @@
 		return list[index + start];
 	}
 
-	@Deprecated public T set(int index, T element) {
+	@Deprecated
+	public T set(int index, T element) {
 		throw new UnsupportedOperationException("Immutable");
 	}
 
-	@Deprecated public void add(int index, T element) {
+	@Deprecated
+	public void add(int index, T element) {
 		throw new UnsupportedOperationException("Immutable");
 	}
 
-	@Deprecated public T remove(int index) {
+	@Deprecated
+	public T remove(int index) {
 		throw new UnsupportedOperationException("Immutable");
 	}
 
@@ -358,11 +364,13 @@
 		return new SortedList<T>(this, fromIndex, toIndex);
 	}
 
-	@Deprecated public boolean equals(Object other) {
+	@Deprecated
+	public boolean equals(Object other) {
 		return super.equals(other);
 	}
 
-	@Deprecated public int hashCode() {
+	@Deprecated
+	public int hashCode() {
 		return super.hashCode();
 	}
 
@@ -377,11 +385,11 @@
 		return true;
 	}
 
-	public Class<?> getType() {
+	public Class< ? > getType() {
 		return type;
 	}
 
-	public void setType(Class<?> type) {
+	public void setType(Class< ? > type) {
 		this.type = type;
 	}
 
@@ -411,7 +419,7 @@
 		return false;
 	}
 
-	public static <T extends Comparable<?>> SortedList<T> fromIterator(Iterator<T> it) {
+	public static <T extends Comparable< ? >> SortedList<T> fromIterator(Iterator<T> it) {
 		IteratorList<T> l = new IteratorList<T>(it);
 		return new SortedList<T>(l);
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/converter/Converter.java b/bundleplugin/src/main/java/aQute/lib/converter/Converter.java
index 6b5af19..f22f840 100644
--- a/bundleplugin/src/main/java/aQute/lib/converter/Converter.java
+++ b/bundleplugin/src/main/java/aQute/lib/converter/Converter.java
@@ -12,16 +12,17 @@
  * conversion
  * 
  * @author aqute
- * 
  */
-@SuppressWarnings({"unchecked", "rawtypes"})
+@SuppressWarnings({
+		"unchecked", "rawtypes"
+})
 public class Converter {
 	public interface Hook {
 		Object convert(Type dest, Object o) throws Exception;
 	}
 
 	boolean			fatal	= true;
-	Map<Type, Hook>	hooks = new HashMap<Type, Converter.Hook>();
+	Map<Type,Hook>	hooks	= new HashMap<Type,Converter.Hook>();
 
 	public <T> T convert(Class<T> type, Object o) throws Exception {
 		// Is it a compatible type?
@@ -30,18 +31,22 @@
 		return (T) convert((Type) type, o);
 	}
 
+	public <T> T convert(TypeReference<T> type, Object o) throws Exception {
+		return (T) convert( type.getType(), o);
+	}
+	
 	public Object convert(Type type, Object o) throws Exception {
 		if (o == null)
 			return null; // compatible with any
 
 		
 		Hook hook = hooks.get(type);
-		if ( hook != null ) {
+		if (hook != null) {
 			Object value = hook.convert(type, o);
-			if ( value != null)
+			if (value != null)
 				return value;
 		}
-		
+
 		Class resultType = getRawClass(type);
 		Class< ? > actualType = o.getClass();
 
@@ -116,61 +121,47 @@
 				return n.longValue() == 0 ? false : true;
 
 			resultType = Boolean.class;
+		} else if (resultType == byte.class || resultType == Byte.class) {
+			Number n = number(o);
+			if (n != null)
+				return n.byteValue();
+			resultType = Byte.class;
+		} else if (resultType == char.class || resultType == Character.class) {
+			Number n = number(o);
+			if (n != null)
+				return (char) n.shortValue();
+			resultType = Character.class;
+		} else if (resultType == short.class || resultType == Short.class) {
+			Number n = number(o);
+			if (n != null)
+				return n.shortValue();
+
+			resultType = Short.class;
+		} else if (resultType == int.class || resultType == Integer.class) {
+			Number n = number(o);
+			if (n != null)
+				return n.intValue();
+
+			resultType = Integer.class;
+		} else if (resultType == long.class || resultType == Long.class) {
+			Number n = number(o);
+			if (n != null)
+				return n.longValue();
+
+			resultType = Long.class;
+		} else if (resultType == float.class || resultType == Float.class) {
+			Number n = number(o);
+			if (n != null)
+				return n.floatValue();
+
+			resultType = Float.class;
+		} else if (resultType == double.class || resultType == Double.class) {
+			Number n = number(o);
+			if (n != null)
+				return n.doubleValue();
+
+			resultType = Double.class;
 		}
-		else
-			if (resultType == byte.class || resultType == Byte.class) {
-				Number n = number(o);
-				if (n != null)
-					return n.byteValue();
-				resultType = Byte.class;
-			}
-			else
-				if (resultType == char.class || resultType == Character.class) {
-					Number n = number(o);
-					if (n != null)
-						return (char) n.shortValue();
-					resultType = Character.class;
-				}
-				else
-					if (resultType == short.class || resultType == Short.class) {
-						Number n = number(o);
-						if (n != null)
-							return n.shortValue();
-
-						resultType = Short.class;
-					}
-					else
-						if (resultType == int.class || resultType == Integer.class) {
-							Number n = number(o);
-							if (n != null)
-								return n.intValue();
-
-							resultType = Integer.class;
-						}
-						else
-							if (resultType == long.class || resultType == Long.class) {
-								Number n = number(o);
-								if (n != null)
-									return n.longValue();
-
-								resultType = Long.class;
-							}
-							else
-								if (resultType == float.class || resultType == Float.class) {
-									Number n = number(o);
-									if (n != null)
-										return n.floatValue();
-
-									resultType = Float.class;
-								}
-								else
-									if (resultType == double.class || resultType == Double.class) {
-										Number n = number(o);
-										if (n != null)
-											return n.doubleValue();
-
-										resultType = Double.class;
-									}
 
 		assert !resultType.isPrimitive();
 
@@ -193,15 +184,13 @@
 				Constructor< ? > c = resultType.getConstructor(String.class);
 				return c.newInstance(o.toString());
 			}
-			catch (Throwable t) {
-			}
+			catch (Throwable t) {}
 			try {
 				Method m = resultType.getMethod("valueOf", String.class);
 				if (Modifier.isStatic(m.getModifiers()))
 					return m.invoke(null, o.toString());
 			}
-			catch (Throwable t) {
-			}
+			catch (Throwable t) {}
 
 			if (resultType == Character.class && input.length() == 1)
 				return input.charAt(0);
@@ -236,7 +225,7 @@
 
 		if (o instanceof Map) {
 			try {
-				Map<Object, Object> map = (Map) o;
+				Map<Object,Object> map = (Map) o;
 				Object instance = resultType.newInstance();
 				for (Map.Entry e : map.entrySet()) {
 					String key = (String) e.getKey();
@@ -276,35 +265,27 @@
 		return null;
 	}
 
-	private Collection collection(Type collectionType, Class< ? extends Collection> rawClass,
-			Object o) throws Exception {
+	private Collection collection(Type collectionType, Class< ? extends Collection> rawClass, Object o)
+			throws Exception {
 		Collection collection;
 		if (rawClass.isInterface() || Modifier.isAbstract(rawClass.getModifiers())) {
 			if (rawClass.isAssignableFrom(ArrayList.class))
 				collection = new ArrayList();
+			else if (rawClass.isAssignableFrom(HashSet.class))
+				collection = new HashSet();
+			else if (rawClass.isAssignableFrom(TreeSet.class))
+				collection = new TreeSet();
+			else if (rawClass.isAssignableFrom(LinkedList.class))
+				collection = new LinkedList();
+			else if (rawClass.isAssignableFrom(Vector.class))
+				collection = new Vector();
+			else if (rawClass.isAssignableFrom(Stack.class))
+				collection = new Stack();
+			else if (rawClass.isAssignableFrom(ConcurrentLinkedQueue.class))
+				collection = new ConcurrentLinkedQueue();
 			else
-				if (rawClass.isAssignableFrom(HashSet.class))
-					collection = new HashSet();
-				else
-					if (rawClass.isAssignableFrom(TreeSet.class))
-						collection = new TreeSet();
-					else
-						if (rawClass.isAssignableFrom(LinkedList.class))
-							collection = new LinkedList();
-						else
-							if (rawClass.isAssignableFrom(Vector.class))
-								collection = new Vector();
-							else
-								if (rawClass.isAssignableFrom(Stack.class))
-									collection = new Stack();
-								else
-									if (rawClass.isAssignableFrom(ConcurrentLinkedQueue.class))
-										collection = new ConcurrentLinkedQueue();
-									else
-										return (Collection) error("Cannot find a suitable collection for the collection interface "
-												+ rawClass);
-		}
-		else
+				return (Collection) error("Cannot find a suitable collection for the collection interface " + rawClass);
+		} else
 			collection = rawClass.newInstance();
 
 		Type subType = Object.class;
@@ -321,22 +302,18 @@
 		return collection;
 	}
 
-	private Map map(Type mapType, Class< ? extends Map< ? , ? >> rawClass, Object o)
-			throws Exception {
+	private Map map(Type mapType, Class< ? extends Map< ? , ? >> rawClass, Object o) throws Exception {
 		Map result;
 		if (rawClass.isInterface() || Modifier.isAbstract(rawClass.getModifiers())) {
 			if (rawClass.isAssignableFrom(HashMap.class))
 				result = new HashMap();
+			else if (rawClass.isAssignableFrom(TreeMap.class))
+				result = new TreeMap();
+			else if (rawClass.isAssignableFrom(ConcurrentHashMap.class))
+				result = new ConcurrentHashMap();
 			else
-				if (rawClass.isAssignableFrom(TreeMap.class))
-					result = new TreeMap();
-				else
-					if (rawClass.isAssignableFrom(ConcurrentHashMap.class))
-						result = new ConcurrentHashMap();
-					else
-						return (Map) error("Cannot find suitable map for map interface " + rawClass);
-		}
-		else
+				return (Map) error("Cannot find suitable map for map interface " + rawClass);
+		} else
 			result = rawClass.newInstance();
 
 		Map< ? , ? > input = toMap(o);
@@ -439,8 +416,7 @@
 	public void setFatalIsException(boolean b) {
 		fatal = b;
 	}
-	
-	
+
 	public Converter hook(Type type, Hook hook) {
 		this.hooks.put(type, hook);
 		return this;
diff --git a/bundleplugin/src/main/java/aQute/lib/converter/TypeReference.java b/bundleplugin/src/main/java/aQute/lib/converter/TypeReference.java
new file mode 100644
index 0000000..2b52308
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/lib/converter/TypeReference.java
@@ -0,0 +1,10 @@
+package aQute.lib.converter;
+
+import java.lang.reflect.*;
+
+public class TypeReference<T> implements Type {
+
+	public Type getType() {
+		return ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
+	}
+}
diff --git a/bundleplugin/src/main/java/aQute/lib/data/AllowNull.java b/bundleplugin/src/main/java/aQute/lib/data/AllowNull.java
index 2bbf253..0b25300 100644
--- a/bundleplugin/src/main/java/aQute/lib/data/AllowNull.java
+++ b/bundleplugin/src/main/java/aQute/lib/data/AllowNull.java
@@ -3,7 +3,9 @@
 import java.lang.annotation.*;
 
 @Retention(RetentionPolicy.RUNTIME)
-@Target(value={ElementType.FIELD})
+@Target(value = {
+	ElementType.FIELD
+})
 public @interface AllowNull {
 	String reason() default "";
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/data/Data.java b/bundleplugin/src/main/java/aQute/lib/data/Data.java
index d790d2e..f44d1a7 100644
--- a/bundleplugin/src/main/java/aQute/lib/data/Data.java
+++ b/bundleplugin/src/main/java/aQute/lib/data/Data.java
@@ -20,7 +20,6 @@
 				if (allowNull == null)
 					formatter.format("Value for %s must not be null\n", f.getName());
 			} else {
-				
 
 				if (patternValidator != null) {
 					Pattern p = Pattern.compile(patternValidator.value());
@@ -28,8 +27,8 @@
 					if (!m.matches()) {
 						String reason = patternValidator.reason();
 						if (reason.length() == 0)
-							formatter.format("Value for %s=%s does not match pattern %s\n",
-									f.getName(), value, patternValidator.value());
+							formatter.format("Value for %s=%s does not match pattern %s\n", f.getName(), value,
+									patternValidator.value());
 						else
 							formatter.format("Value for %s=%s %s\n", f.getName(), value, reason);
 					}
@@ -39,29 +38,31 @@
 					if (o instanceof String) {
 						try {
 							o = Double.parseDouble((String) o);
-						} catch (Exception e) {
+						}
+						catch (Exception e) {
 							formatter.format("Value for %s=%s %s\n", f.getName(), value, "Not a number");
 						}
 					}
-					
+
 					try {
 						Number n = (Number) o;
 						long number = n.longValue();
 						if (number >= numericValidator.min() && number < numericValidator.max()) {
-							formatter.format("Value for %s=%s not in valid range (%s,%s]\n",
-									f.getName(), value, numericValidator.min(), numericValidator.max());
+							formatter.format("Value for %s=%s not in valid range (%s,%s]\n", f.getName(), value,
+									numericValidator.min(), numericValidator.max());
 						}
-					} catch (ClassCastException e) {
+					}
+					catch (ClassCastException e) {
 						formatter.format("Value for %s=%s [%s,%s) is not a number\n", f.getName(), value,
 								numericValidator.min(), numericValidator.max());
 					}
 				}
 			}
 		}
-		if ( sb.length() == 0)
+		if (sb.length() == 0)
 			return null;
-		
-		if ( sb.length() > 0)
+
+		if (sb.length() > 0)
 			sb.delete(sb.length() - 1, sb.length());
 		return sb.toString();
 	}
@@ -69,8 +70,8 @@
 	public static void details(Object data, Appendable out) throws Exception {
 		Field fields[] = data.getClass().getFields();
 		Formatter formatter = new Formatter(out);
-		
-		for ( Field f : fields ) {
+
+		for (Field f : fields) {
 			String name = f.getName();
 			name = Character.toUpperCase(name.charAt(0)) + name.substring(1);
 			formatter.format("%-40s %s\n", name, f.get(data));
diff --git a/bundleplugin/src/main/java/aQute/lib/data/Numeric.java b/bundleplugin/src/main/java/aQute/lib/data/Numeric.java
index 19d60cf..eb1534e 100644
--- a/bundleplugin/src/main/java/aQute/lib/data/Numeric.java
+++ b/bundleplugin/src/main/java/aQute/lib/data/Numeric.java
@@ -3,9 +3,13 @@
 import java.lang.annotation.*;
 
 @Retention(RetentionPolicy.RUNTIME)
-@Target(value={ElementType.FIELD})
+@Target(value = {
+	ElementType.FIELD
+})
 public @interface Numeric {
 	long min() default Long.MIN_VALUE;
+
 	long max() default Long.MAX_VALUE;
+
 	String reason() default "";
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/data/Validator.java b/bundleplugin/src/main/java/aQute/lib/data/Validator.java
index e8a8d4f..48324e8 100644
--- a/bundleplugin/src/main/java/aQute/lib/data/Validator.java
+++ b/bundleplugin/src/main/java/aQute/lib/data/Validator.java
@@ -3,8 +3,11 @@
 import java.lang.annotation.*;
 
 @Retention(RetentionPolicy.RUNTIME)
-@Target(value={ElementType.FIELD})
+@Target(value = {
+	ElementType.FIELD
+})
 public @interface Validator {
 	String value();
+
 	String reason() default "";
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java b/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java
index 780c32f..cd98036 100644
--- a/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java
+++ b/bundleplugin/src/main/java/aQute/lib/deployer/FileInstallRepo.java
@@ -13,138 +13,137 @@
 
 public class FileInstallRepo extends FileRepo {
 
-	String group;
-	boolean dirty;
-	Reporter reporter;
-	Pattern              REPO_FILE   = Pattern
-    .compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+)\\.(jar|lib)");
-	
-    public void setProperties(Map<String, String> map) {
-    	super.setProperties(map);
-    	group = map.get("group");
-    }
-    public void setReporter(Reporter reporter) {
-    	super.setReporter(reporter);
-        this.reporter = reporter;
-    }
+	String		group;
+	boolean		dirty;
+	Reporter	reporter;
+	Pattern		REPO_FILE	= Pattern.compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+)\\.(jar|lib)");
 
-    public File put(Jar jar) throws Exception {
-        dirty = true;
-        Manifest manifest = jar.getManifest();
-        if (manifest == null)
-            throw new IllegalArgumentException("No manifest in JAR: " + jar);
+	public void setProperties(Map<String,String> map) {
+		super.setProperties(map);
+		group = map.get("group");
+	}
 
-        String bsn = manifest.getMainAttributes().getValue(
-                Analyzer.BUNDLE_SYMBOLICNAME);
-        if (bsn == null)
-            throw new IllegalArgumentException("No Bundle SymbolicName set");
+	public void setReporter(Reporter reporter) {
+		super.setReporter(reporter);
+		this.reporter = reporter;
+	}
 
-        Parameters b = Processor.parseHeader(bsn, null);
-        if (b.size() != 1)
-            throw new IllegalArgumentException("Multiple bsn's specified " + b);
+	public File put(Jar jar) throws Exception {
+		dirty = true;
+		Manifest manifest = jar.getManifest();
+		if (manifest == null)
+			throw new IllegalArgumentException("No manifest in JAR: " + jar);
 
-        for (String key : b.keySet()) {
-            bsn = key;
-            if (!Verifier.SYMBOLICNAME.matcher(bsn).matches())
-                throw new IllegalArgumentException(
-                        "Bundle SymbolicName has wrong format: " + bsn);
-        }
+		String bsn = manifest.getMainAttributes().getValue(Analyzer.BUNDLE_SYMBOLICNAME);
+		if (bsn == null)
+			throw new IllegalArgumentException("No Bundle SymbolicName set");
 
-        String versionString = manifest.getMainAttributes().getValue(
-                Analyzer.BUNDLE_VERSION);
-        Version version;
-        if (versionString == null)
-            version = new Version();
-        else
-            version = new Version(versionString);
+		Parameters b = Processor.parseHeader(bsn, null);
+		if (b.size() != 1)
+			throw new IllegalArgumentException("Multiple bsn's specified " + b);
 
-        File dir;
-        if (group == null) {
-        	dir = getRoot();
-        } else {
-        	dir= new File(getRoot(), group);
-        	dir.mkdirs();
-        }
-        String fName = bsn + "-" + version.getMajor() + "."
-                + version.getMinor() + "." + version.getMicro() + ".jar";
-        File file = new File(dir, fName);
+		for (String key : b.keySet()) {
+			bsn = key;
+			if (!Verifier.SYMBOLICNAME.matcher(bsn).matches())
+				throw new IllegalArgumentException("Bundle SymbolicName has wrong format: " + bsn);
+		}
 
-        jar.write(file);
-        fireBundleAdded(jar, file);
+		String versionString = manifest.getMainAttributes().getValue(Analyzer.BUNDLE_VERSION);
+		Version version;
+		if (versionString == null)
+			version = new Version();
+		else
+			version = new Version(versionString);
 
-        file = new File(dir, bsn + "-latest.jar");
-        if (file.isFile() && file.lastModified() < jar.lastModified()) {
-            jar.write(file);
-        }
-        return file;
-    }
-    public boolean refresh() {
-        if ( dirty ) {
-            dirty = false;
-            return true;
-        } else 
-            return false;
-    }
+		File dir;
+		if (group == null) {
+			dir = getRoot();
+		} else {
+			dir = new File(getRoot(), group);
+			dir.mkdirs();
+		}
+		String fName = bsn + "-" + version.getMajor() + "." + version.getMinor() + "." + version.getMicro() + ".jar";
+		File file = new File(dir, fName);
+
+		jar.write(file);
+		fireBundleAdded(jar, file);
+
+		file = new File(dir, bsn + "-latest.jar");
+		if (file.isFile() && file.lastModified() < jar.lastModified()) {
+			jar.write(file);
+		}
+		return file;
+	}
+
+	public boolean refresh() {
+		if (dirty) {
+			dirty = false;
+			return true;
+		} else
+			return false;
+	}
+
 	@Override
 	public List<String> list(String regex) {
-	       Instruction pattern = null;
-	        if (regex != null)
-	            pattern = new Instruction(regex);
+		Instruction pattern = null;
+		if (regex != null)
+			pattern = new Instruction(regex);
 
-	        String list[] = getRoot().list();
-	        List<String> result = new ArrayList<String>();
-	        for (String f : list) {
-                Matcher m = REPO_FILE.matcher(f);
-                if (!m.matches()) {
-                	continue;
-                }
-                String s = m.group(1);
-	            if (pattern == null || pattern.matches(s))
-	                result.add(s);
-	        }
-	        return result;
+		String list[] = getRoot().list();
+		List<String> result = new ArrayList<String>();
+		for (String f : list) {
+			Matcher m = REPO_FILE.matcher(f);
+			if (!m.matches()) {
+				continue;
+			}
+			String s = m.group(1);
+			if (pattern == null || pattern.matches(s))
+				result.add(s);
+		}
+		return result;
 	}
+
 	@Override
 	public File[] get(String bsn, String versionRange) throws MalformedURLException {
-	       // If the version is set to project, we assume it is not
-        // for us. A project repo will then get it.
-        if (versionRange != null && versionRange.equals("project"))
-            return null;
+		// If the version is set to project, we assume it is not
+		// for us. A project repo will then get it.
+		if (versionRange != null && versionRange.equals("project"))
+			return null;
 
-        //
-        // The version range we are looking for can
-        // be null (for all) or a version range.
-        //
-        VersionRange range;
-        if (versionRange == null || versionRange.equals("latest")) {
-            range = new VersionRange("0");
-        } else
-            range = new VersionRange(versionRange);
+		//
+		// The version range we are looking for can
+		// be null (for all) or a version range.
+		//
+		VersionRange range;
+		if (versionRange == null || versionRange.equals("latest")) {
+			range = new VersionRange("0");
+		} else
+			range = new VersionRange(versionRange);
 
-        //
-        // Iterator over all the versions for this BSN.
-        // Create a sorted map over the version as key
-        // and the file as URL as value. Only versions
-        // that match the desired range are included in
-        // this list.
-        //
-        File instances[] = getRoot().listFiles();
-        SortedMap<Version, File> versions = new TreeMap<Version, File>();
-        for (int i = 0; i < instances.length; i++) {
-            Matcher m = REPO_FILE.matcher(instances[i].getName());
-            if (m.matches() && m.group(1).equals(bsn)) {
-                String versionString = m.group(2);
-                Version version;
-                if (versionString.equals("latest"))
-                    version = new Version(Integer.MAX_VALUE);
-                else
-                    version = new Version(versionString);
+		//
+		// Iterator over all the versions for this BSN.
+		// Create a sorted map over the version as key
+		// and the file as URL as value. Only versions
+		// that match the desired range are included in
+		// this list.
+		//
+		File instances[] = getRoot().listFiles();
+		SortedMap<Version,File> versions = new TreeMap<Version,File>();
+		for (int i = 0; i < instances.length; i++) {
+			Matcher m = REPO_FILE.matcher(instances[i].getName());
+			if (m.matches() && m.group(1).equals(bsn)) {
+				String versionString = m.group(2);
+				Version version;
+				if (versionString.equals("latest"))
+					version = new Version(Integer.MAX_VALUE);
+				else
+					version = new Version(versionString);
 
-                if (range.includes(version))
-                    versions.put(version, instances[i]);
-            }
-        }
-        return versions.values().toArray(new File[versions.size()]);
+				if (range.includes(version))
+					versions.put(version, instances[i]);
+			}
+		}
+		return versions.values().toArray(new File[versions.size()]);
 	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java b/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java
index 8cd39f1..3e79730 100644
--- a/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java
+++ b/bundleplugin/src/main/java/aQute/lib/deployer/FileRepo.java
@@ -17,18 +17,16 @@
 	public final static String	READONLY	= "readonly";
 	public final static String	NAME		= "name";
 
-	File[]					EMPTY_FILES	= new File[0];
-	protected File			root;
-	Registry				registry;
-	boolean					canWrite	= true;
-	Pattern					REPO_FILE	= Pattern
-												.compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+|latest)\\.(jar|lib)");
-	Reporter				reporter;
-	boolean					dirty;
-	String					name;
+	File[]						EMPTY_FILES	= new File[0];
+	protected File				root;
+	Registry					registry;
+	boolean						canWrite	= true;
+	Pattern						REPO_FILE	= Pattern.compile("([-a-zA-z0-9_\\.]+)-([0-9\\.]+|latest)\\.(jar|lib)");
+	Reporter					reporter;
+	boolean						dirty;
+	String						name;
 
-	public FileRepo() {
-	}
+	public FileRepo() {}
 
 	public FileRepo(String name, File location, boolean canWrite) {
 		this.name = name;
@@ -40,7 +38,7 @@
 		// for extensions
 	}
 
-	public void setProperties(Map<String, String> map) {
+	public void setProperties(Map<String,String> map) {
 		String location = map.get(LOCATION);
 		if (location == null)
 			throw new IllegalArgumentException("Location must be set on a FileRepo plugin");
@@ -93,7 +91,7 @@
 		// this list.
 		//
 		File instances[] = f.listFiles();
-		SortedMap<Version, File> versions = new TreeMap<Version, File>();
+		SortedMap<Version,File> versions = new TreeMap<Version,File>();
 		for (int i = 0; i < instances.length; i++) {
 			Matcher m = REPO_FILE.matcher(instances[i].getName());
 			if (m.matches() && m.group(1).equals(bsn)) {
@@ -111,7 +109,9 @@
 
 		File[] files = versions.values().toArray(EMPTY_FILES);
 		if ("latest".equals(versionRange) && files.length > 0) {
-			return new File[] { files[files.length - 1] };
+			return new File[] {
+				files[files.length - 1]
+			};
 		}
 		return files;
 	}
@@ -149,8 +149,8 @@
 		else
 			version = new Version(versionString);
 
-		reporter.trace("bsn=%s version=%s",bsn,version);
-		
+		reporter.trace("bsn=%s version=%s", bsn, version);
+
 		File dir = new File(root, bsn);
 		dir.mkdirs();
 		String fName = bsn + "-" + version.getWithoutQualifier() + ".jar";
@@ -178,12 +178,12 @@
 	protected void fireBundleAdded(Jar jar, File file) {
 		if (registry == null)
 			return;
-		List<RepositoryListenerPlugin> listeners = registry
-				.getPlugins(RepositoryListenerPlugin.class);
+		List<RepositoryListenerPlugin> listeners = registry.getPlugins(RepositoryListenerPlugin.class);
 		for (RepositoryListenerPlugin listener : listeners) {
 			try {
 				listener.bundleAdded(this, jar, file);
-			} catch (Exception e) {
+			}
+			catch (Exception e) {
 				if (reporter != null)
 					reporter.warning("Repository listener threw an unexpected exception: %s", e);
 			}
@@ -275,16 +275,14 @@
 	public Jar get(String bsn, Version v) throws Exception {
 		init();
 		File bsns = new File(root, bsn);
-		File version = new File(bsns, bsn + "-" + v.getMajor() + "." + v.getMinor() + "."
-				+ v.getMicro() + ".jar");
-		if ( version.exists())
+		File version = new File(bsns, bsn + "-" + v.getMajor() + "." + v.getMinor() + "." + v.getMicro() + ".jar");
+		if (version.exists())
 			return new Jar(version);
 		else
 			return null;
 	}
 
-	public File get(String bsn, String version, Strategy strategy, Map<String, String> properties)
-			throws Exception {
+	public File get(String bsn, String version, Strategy strategy, Map<String,String> properties) throws Exception {
 		if (version == null)
 			version = "0.0.0";
 
@@ -313,10 +311,10 @@
 
 		if (files.length >= 0) {
 			switch (strategy) {
-			case LOWEST:
-				return files[0];
-			case HIGHEST:
-				return files[files.length - 1];
+				case LOWEST :
+					return files[0];
+				case HIGHEST :
+					return files[files.length - 1];
 			}
 		}
 		return null;
diff --git a/bundleplugin/src/main/java/aQute/lib/filter/Filter.java b/bundleplugin/src/main/java/aQute/lib/filter/Filter.java
index ab75db9..2a7792c 100755
--- a/bundleplugin/src/main/java/aQute/lib/filter/Filter.java
+++ b/bundleplugin/src/main/java/aQute/lib/filter/Filter.java
@@ -51,18 +51,18 @@
 			boolean val;
 
 			switch (tail.charAt(0)) {
-			case '&':
-				val = doAnd();
-				break;
-			case '|':
-				val = doOr();
-				break;
-			case '!':
-				val = doNot();
-				break;
-			default:
-				val = doSimple();
-				break;
+				case '&' :
+					val = doAnd();
+					break;
+				case '|' :
+					val = doOr();
+					break;
+				case '!' :
+					val = doNot();
+					break;
+				default :
+					val = doSimple();
+					break;
 			}
 
 			if (!prefix(")"))
@@ -131,15 +131,15 @@
 			int ix = 0;
 			label: for (; ix < len; ix++) {
 				switch (tail.charAt(ix)) {
-				case '(':
-				case ')':
-				case '<':
-				case '>':
-				case '=':
-				case '~':
-				case '*':
-				case '\\':
-					break label;
+					case '(' :
+					case ')' :
+					case '<' :
+					case '>' :
+					case '=' :
+					case '~' :
+					case '*' :
+					case '\\' :
+						break label;
 				}
 			}
 			String attr = tail.substring(0, ix).toLowerCase();
@@ -156,20 +156,20 @@
 			label: for (; ix < len; ix++) {
 				char c = tail.charAt(ix);
 				switch (c) {
-				case '(':
-				case ')':
-					break label;
-				case '*':
-					sb.append(WILDCARD);
-					break;
-				case '\\':
-					if (ix == len - 1)
+					case '(' :
+					case ')' :
 						break label;
-					sb.append(tail.charAt(++ix));
-					break;
-				default:
-					sb.append(c);
-					break;
+					case '*' :
+						sb.append(WILDCARD);
+						break;
+					case '\\' :
+						if (ix == len - 1)
+							break label;
+						sb.append(tail.charAt(++ix));
+						break;
+					default :
+						sb.append(c);
+						break;
 				}
 			}
 			tail = tail.substring(ix);
@@ -184,7 +184,7 @@
 			if (obj == null)
 				return false;
 			try {
-				Class<?> numClass = obj.getClass();
+				Class< ? > numClass = obj.getClass();
 				if (numClass == String.class) {
 					return compareString((String) obj, op, s);
 				} else if (numClass == Character.class) {
@@ -211,8 +211,8 @@
 					return compareSign(op, new BigInteger(s).compareTo((BigInteger) obj));
 				} else if (numClass == BigDecimal.class) {
 					return compareSign(op, new BigDecimal(s).compareTo((BigDecimal) obj));
-				} else if (obj instanceof Collection<?>) {
-					for (Object x : (Collection<?>) obj)
+				} else if (obj instanceof Collection< ? >) {
+					for (Object x : (Collection< ? >) obj)
 						if (compare(x, op, s))
 							return true;
 				} else if (numClass.isArray()) {
@@ -221,16 +221,16 @@
 						if (compare(Array.get(obj, i), op, s))
 							return true;
 				}
-			} catch (Exception e) {
 			}
+			catch (Exception e) {}
 			return false;
 		}
 	}
 
 	class DictQuery extends Query {
-		private Dictionary<?, ?>	dict;
+		private Dictionary< ? , ? >	dict;
 
-		DictQuery(Dictionary<?, ?> dict) {
+		DictQuery(Dictionary< ? , ? > dict) {
 			this.dict = dict;
 		}
 
@@ -246,18 +246,20 @@
 			throw new IllegalArgumentException("Null query");
 	}
 
-	public boolean match(Dictionary<?, ?> dict) {
+	public boolean match(Dictionary< ? , ? > dict) {
 		try {
 			return new DictQuery(dict).match();
-		} catch (IllegalArgumentException e) {
+		}
+		catch (IllegalArgumentException e) {
 			return false;
 		}
 	}
 
 	public String verify() {
 		try {
-			new DictQuery(new Hashtable<Object, Object>()).match();
-		} catch (IllegalArgumentException e) {
+			new DictQuery(new Hashtable<Object,Object>()).match();
+		}
+		catch (IllegalArgumentException e) {
 			return e.getMessage();
 		}
 		return null;
@@ -277,25 +279,25 @@
 
 	boolean compareString(String s1, int op, String s2) {
 		switch (op) {
-		case EQ:
-			return patSubstr(s1, s2);
-		case APPROX:
-			return fixupString(s2).equals(fixupString(s1));
-		default:
-			return compareSign(op, s2.compareTo(s1));
+			case EQ :
+				return patSubstr(s1, s2);
+			case APPROX :
+				return fixupString(s2).equals(fixupString(s1));
+			default :
+				return compareSign(op, s2.compareTo(s1));
 		}
 	}
 
 	boolean compareSign(int op, int cmp) {
 		switch (op) {
-		case LE:
-			return cmp >= 0;
-		case GE:
-			return cmp <= 0;
-		case EQ:
-			return cmp == 0;
-		default: /* APPROX */
-			return cmp == 0;
+			case LE :
+				return cmp >= 0;
+			case GE :
+				return cmp <= 0;
+			case EQ :
+				return cmp == 0;
+			default : /* APPROX */
+				return cmp == 0;
 		}
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/lib/getopt/CommandLine.java b/bundleplugin/src/main/java/aQute/lib/getopt/CommandLine.java
index f95b6c4..a5185e4 100644
--- a/bundleplugin/src/main/java/aQute/lib/getopt/CommandLine.java
+++ b/bundleplugin/src/main/java/aQute/lib/getopt/CommandLine.java
@@ -17,16 +17,18 @@
  * parameter of Options type. Usually this is an interface that extends Options.
  * The methods on this interface are options or flags (when they return
  * boolean).
- * 
  */
-@SuppressWarnings("unchecked") public class CommandLine {
-	static int		LINELENGTH	= 60;
-	static Pattern	ASSIGNMENT	= Pattern.compile("(\\w[\\w\\d]*+)\\s*=\\s*([^\\s]+)\\s*");
-	Reporter		reporter;
-	Justif			justif = new Justif(60);
-	
+@SuppressWarnings("unchecked")
+public class CommandLine {
+	static int			LINELENGTH	= 60;
+	static Pattern		ASSIGNMENT	= Pattern.compile("(\\w[\\w\\d]*+)\\s*=\\s*([^\\s]+)\\s*");
+	Reporter			reporter;
+	Justif				justif		= new Justif(60);
+	CommandLineMessages	msg;
+
 	public CommandLine(Reporter reporter) {
 		this.reporter = reporter;
+		msg = ReporterMessages.base(reporter, CommandLineMessages.class);
 	}
 
 	/**
@@ -56,11 +58,11 @@
 		//
 
 		List<String> arguments = new ArrayList<String>(input);
-		Map<String, Method> commands = getCommands(target);
+		Map<String,Method> commands = getCommands(target);
 
 		Method m = commands.get(cmd);
 		if (m == null) {
-			reporter.error("No such command %s\n", cmd);
+			msg.NoSuchCommand_(cmd);
 			return help(target, null, null);
 		}
 
@@ -68,7 +70,7 @@
 		// Parse the options
 		//
 
-		Class<? extends Options> optionClass = (Class<? extends Options>) m.getParameterTypes()[0];
+		Class< ? extends Options> optionClass = (Class< ? extends Options>) m.getParameterTypes()[0];
 		Options options = getOptions(optionClass, arguments);
 		if (options == null) {
 			// had some error, already reported
@@ -85,7 +87,7 @@
 			// Check for commands without any arguments
 
 			if (patterns.length == 0 && arguments.size() > 0) {
-				reporter.error("This command takes no arguments but found %s\n", arguments);
+				msg.TooManyArguments_(arguments);
 				return help(target, cmd, null);
 			}
 
@@ -108,7 +110,7 @@
 
 				if (i > arguments.size()) {
 					if (!optional)
-						reporter.error("Missing argument %s\n", patterns[i]);
+						msg.MissingArgument_(patterns[i]);
 					return help(target, cmd, optionClass);
 				}
 			}
@@ -116,8 +118,7 @@
 			// Check if we have unconsumed arguments left
 
 			if (i < arguments.size()) {
-				reporter.error("Too many arguments specified %s, expecting %s\n", arguments,
-						Arrays.asList(patterns));
+				msg.TooManyArguments_(arguments);
 				return help(target, cmd, optionClass);
 			}
 		}
@@ -129,7 +130,7 @@
 		return help(target, cmd, optionClass);
 	}
 
-	private String help(Object target, String cmd, Class<? extends Options> type) throws Exception {
+	private String help(Object target, String cmd, Class< ? extends Options> type) throws Exception {
 		StringBuilder sb = new StringBuilder();
 		Formatter f = new Formatter(sb);
 		if (cmd == null)
@@ -148,13 +149,11 @@
 	 * Parse the options in a command line and return an interface that provides
 	 * the options from this command line. This will parse up to (and including)
 	 * -- or an argument that does not start with -
-	 * 
 	 */
-	public <T extends Options> T getOptions(Class<T> specification, List<String> arguments)
-			throws Exception {
-		Map<String, String> properties = Create.map();
-		Map<String, Object> values = new HashMap<String, Object>();
-		Map<String, Method> options = getOptions(specification);
+	public <T extends Options> T getOptions(Class<T> specification, List<String> arguments) throws Exception {
+		Map<String,String> properties = Create.map();
+		Map<String,Object> values = new HashMap<String,Object>();
+		Map<String,Method> options = getOptions(specification);
 
 		argloop: while (arguments.size() > 0) {
 
@@ -173,7 +172,7 @@
 					String name = option.substring(2);
 					Method m = options.get(name);
 					if (m == null)
-						reporter.error("Unrecognized option %s\n", name);
+						msg.UnrecognizedOption_(name);
 					else
 						assignOptionValue(values, m, arguments, true);
 
@@ -185,15 +184,14 @@
 
 						char optionChar = option.charAt(j);
 
-						for (Entry<String, Method> entry : options.entrySet()) {
+						for (Entry<String,Method> entry : options.entrySet()) {
 							if (entry.getKey().charAt(0) == optionChar) {
 								boolean last = (j + 1) >= option.length();
-								assignOptionValue(values, entry.getValue(),
-										arguments, last);
+								assignOptionValue(values, entry.getValue(), arguments, last);
 								continue charloop;
 							}
 						}
-						reporter.error("No such option -%s\n", optionChar);
+						msg.UnrecognizedOption_(optionChar + "");
 					}
 				}
 			} else {
@@ -207,11 +205,11 @@
 
 		// check if all required elements are set
 
-		for (Entry<String, Method> entry : options.entrySet()) {
+		for (Entry<String,Method> entry : options.entrySet()) {
 			Method m = entry.getValue();
 			String name = entry.getKey();
 			if (!values.containsKey(name) && isMandatory(m))
-				reporter.error("Required option --%s not set", name);
+				msg.OptionNotSet_(name);
 		}
 
 		values.put(".", arguments);
@@ -223,8 +221,8 @@
 	/**
 	 * Answer a list of the options specified in an options interface
 	 */
-	private Map<String, Method> getOptions(Class<? extends Options> interf) {
-		Map<String, Method> map = new TreeMap<String, Method>();
+	private Map<String,Method> getOptions(Class< ? extends Options> interf) {
+		Map<String,Method> map = new TreeMap<String,Method>();
 
 		for (Method m : interf.getMethods()) {
 			if (m.getName().startsWith("_"))
@@ -259,8 +257,7 @@
 	 *            if this is the last in a multi single character option
 	 * @return
 	 */
-	public void assignOptionValue(Map<String, Object> options, Method m, List<String> args,
-			boolean last) {
+	public void assignOptionValue(Map<String,Object> options, Method m, List<String> args, boolean last) {
 		String name = m.getName();
 		Type type = m.getGenericReturnType();
 
@@ -274,15 +271,12 @@
 			// The option is followed by an argument
 
 			if (!last) {
-				reporter.error(
-						"Option --%s not last in a set of 1-letter options (%s) but it requires an argument of type ",
-						name, name.charAt(0), getTypeDescriptor(type));
+				msg.Option__WithArgumentNotLastInAvvreviation_(name, name.charAt(0), getTypeDescriptor(type));
 				return;
 			}
 
 			if (args.isEmpty()) {
-				reporter.error("Missing argument %s for option --%s, -%s ",
-						getTypeDescriptor(type), name, name.charAt(0));
+				msg.MissingArgument__(name, name.charAt(0));
 				return;
 			}
 
@@ -301,7 +295,7 @@
 			} else {
 
 				if (options.containsKey(name)) {
-					reporter.error("The option %s can only occur once", name);
+					msg.OptionCanOnlyOccurOnce_(name);
 					return;
 				}
 
@@ -314,10 +308,10 @@
 	 * Provide a help text.
 	 */
 
-	public void help(Formatter f, Object target, String cmd, Class<? extends Options> specification) {
+	public void help(Formatter f, Object target, String cmd, Class< ? extends Options> specification) {
 		Description descr = specification.getAnnotation(Description.class);
 		Arguments patterns = specification.getAnnotation(Arguments.class);
-		Map<String, Method> options = getOptions(specification);
+		Map<String,Method> options = getOptions(specification);
 
 		String description = descr == null ? "" : descr.value();
 
@@ -339,7 +333,7 @@
 		}
 
 		f.format("OPTIONS\n");
-		for (Entry<String, Method> entry : options.entrySet()) {
+		for (Entry<String,Method> entry : options.entrySet()) {
 			String optionName = entry.getKey();
 			Method m = entry.getValue();
 
@@ -347,8 +341,7 @@
 			Description d = m.getAnnotation(Description.class);
 			boolean required = isMandatory(m);
 
-			String methodDescription = cfg != null ? cfg.description() : (d == null ? "" : d
-					.value());
+			String methodDescription = cfg != null ? cfg.description() : (d == null ? "" : d.value());
 
 			f.format("   %s -%s, --%s %s%s - %s\n", required ? " " : "[", //
 					optionName.charAt(0), //
@@ -398,7 +391,7 @@
 		if (m == null)
 			f.format("No such command: %s\n", cmd);
 		else {
-			Class<? extends Options> options = (Class<? extends Options>) m.getParameterTypes()[0];
+			Class< ? extends Options> options = (Class< ? extends Options>) m.getParameterTypes()[0];
 			help(f, target, cmd, options);
 		}
 	}
@@ -409,13 +402,13 @@
 	 * @param target
 	 * @return
 	 */
-	public Map<String, Method> getCommands(Object target) {
-		Map<String, Method> map = new TreeMap<String, Method>();
+	public Map<String,Method> getCommands(Object target) {
+		Map<String,Method> map = new TreeMap<String,Method>();
 
 		for (Method m : target.getClass().getMethods()) {
 
 			if (m.getParameterTypes().length == 1 && m.getName().startsWith("_")) {
-				Class<?> clazz = m.getParameterTypes()[0];
+				Class< ? > clazz = m.getParameterTypes()[0];
 				if (Options.class.isAssignableFrom(clazz)) {
 					String name = m.getName().substring(1);
 					map.put(name, m);
@@ -453,7 +446,7 @@
 			ParameterizedType pt = (ParameterizedType) type;
 			Type c = pt.getRawType();
 			if (c instanceof Class) {
-				if (Collection.class.isAssignableFrom((Class<?>) c)) {
+				if (Collection.class.isAssignableFrom((Class< ? >) c)) {
 					return getTypeDescriptor(pt.getActualTypeArguments()[0]) + "*";
 				}
 			}
@@ -461,7 +454,7 @@
 		if (!(type instanceof Class))
 			return "<>";
 
-		Class<?> clazz = (Class<?>) type;
+		Class< ? > clazz = (Class< ? >) type;
 
 		if (clazz == Boolean.class || clazz == boolean.class)
 			return ""; // Is a flag
diff --git a/bundleplugin/src/main/java/aQute/lib/getopt/CommandLineMessages.java b/bundleplugin/src/main/java/aQute/lib/getopt/CommandLineMessages.java
new file mode 100644
index 0000000..afeb0b9
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/lib/getopt/CommandLineMessages.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) OSGi Alliance (2012). All Rights Reserved.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package aQute.lib.getopt;
+
+import java.util.*;
+
+import aQute.libg.reporter.*;
+
+public interface CommandLineMessages extends Messages {
+
+	ERROR Option__WithArgumentNotLastInAvvreviation_(String name, char charAt, String typeDescriptor);
+
+	ERROR MissingArgument__(String name, char charAt);
+
+	ERROR OptionCanOnlyOccurOnce_(String name);
+
+	ERROR NoSuchCommand_(String cmd);
+
+	ERROR TooManyArguments_(List<String> arguments);
+
+	ERROR MissingArgument_(String string);
+
+	ERROR UnrecognizedOption_(String name);
+
+	ERROR OptionNotSet_(String name);
+
+}
diff --git a/bundleplugin/src/main/java/aQute/lib/getopt/Options.java b/bundleplugin/src/main/java/aQute/lib/getopt/Options.java
index aab2b7f..ff2b168 100644
--- a/bundleplugin/src/main/java/aQute/lib/getopt/Options.java
+++ b/bundleplugin/src/main/java/aQute/lib/getopt/Options.java
@@ -4,8 +4,12 @@
 
 public interface Options {
 	List<String> _();
+
 	CommandLine _command();
+
 	Map<String,String> _properties();
+
 	boolean _ok();
+
 	boolean _help();
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/hex/Hex.java b/bundleplugin/src/main/java/aQute/lib/hex/Hex.java
index 3c7fa4a..ffceded 100755
--- a/bundleplugin/src/main/java/aQute/lib/hex/Hex.java
+++ b/bundleplugin/src/main/java/aQute/lib/hex/Hex.java
@@ -2,59 +2,61 @@
 
 import java.io.*;
 
-
 /*
  * Hex converter.
  * 
  * TODO Implement string to byte[]
  */
 public class Hex {
-	final static char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
+	final static char[]	HEX	= {
+			'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+							};
+
 	public final static byte[] toByteArray(String string) {
 		string = string.trim();
-		if ( (string.length() & 1) != 0)
+		if ((string.length() & 1) != 0)
 			throw new IllegalArgumentException("a hex string must have an even length");
 
-		byte[]out = new byte[ string.length()/2];
-		for ( int i=0; i < out.length; i++) {
-			int high = nibble(string.charAt(i*2))<<4;
-			int low = nibble(string.charAt(i*2+1));
+		byte[] out = new byte[string.length() / 2];
+		for (int i = 0; i < out.length; i++) {
+			int high = nibble(string.charAt(i * 2)) << 4;
+			int low = nibble(string.charAt(i * 2 + 1));
 			out[i] = (byte) (high + low);
 		}
 		return out;
 	}
 
-	
-	public final static int nibble( char c) {
+	public final static int nibble(char c) {
 		if (c >= '0' && c <= '9')
 			return c - '0';
-		
-		if ( c>='A' && c<='F')
+
+		if (c >= 'A' && c <= 'F')
 			return c - 'A' + 10;
-		if ( c>='a' && c<='f')
+		if (c >= 'a' && c <= 'f')
 			return c - 'a' + 10;
-		
+
 		throw new IllegalArgumentException("Not a hex digit: " + c);
 	}
-	
+
 	public final static String toHexString(byte data[]) {
 		StringBuilder sb = new StringBuilder();
 		try {
-			append(sb,data);
-		} catch (IOException e) {
+			append(sb, data);
+		}
+		catch (IOException e) {
 			// cannot happen with sb
 		}
 		return sb.toString();
 	}
-	
-	public final static void append( Appendable sb, byte [] data ) throws IOException {
-		for ( int i =0; i<data.length; i++) {
-			sb.append( nibble( data[i] >> 4));
-			sb.append( nibble( data[i]));
+
+	public final static void append(Appendable sb, byte[] data) throws IOException {
+		for (int i = 0; i < data.length; i++) {
+			sb.append(nibble(data[i] >> 4));
+			sb.append(nibble(data[i]));
 		}
 	}
 
-	private final static char nibble(int i) {	
+	private final static char nibble(int i) {
 		return HEX[i & 0xF];
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/index/Index.java b/bundleplugin/src/main/java/aQute/lib/index/Index.java
index 4414f9d..da19f68 100644
--- a/bundleplugin/src/main/java/aQute/lib/index/Index.java
+++ b/bundleplugin/src/main/java/aQute/lib/index/Index.java
@@ -12,8 +12,6 @@
  *   123 -> 123, 244   -> 2
  *   245 -> 245, ...
  * </pre>
- * 
- * 
  */
 public class Index implements Iterable<byte[]> {
 	final static int					LEAF		= 0;
@@ -29,7 +27,7 @@
 	final int							valueSize	= 8;
 	final int							capacity;
 	public Page							root;
-	final LinkedHashMap<Integer, Page>	cache		= new LinkedHashMap<Integer, Index.Page>();
+	final LinkedHashMap<Integer,Page>	cache		= new LinkedHashMap<Integer,Index.Page>();
 	final MappedByteBuffer				settings;
 
 	private int							nextPage;
@@ -81,7 +79,8 @@
 							i = getPage(c).iterator();
 						}
 						return i.hasNext();
-					} catch (IOException e) {
+					}
+					catch (IOException e) {
 						throw new RuntimeException(e);
 					}
 
@@ -246,7 +245,8 @@
 			StringBuilder sb = new StringBuilder();
 			try {
 				toString(sb, "");
-			} catch (IOException e) {
+			}
+			catch (IOException e) {
 				e.printStackTrace();
 			}
 			return sb.toString();
@@ -254,8 +254,8 @@
 
 		public void toString(StringBuilder sb, String indent) throws IOException {
 			for (int i = 0; i < n; i++) {
-				sb.append(String.format("%s %02d:%02d %20s %s %d\n", indent, number, i,
-						hex(k(i), 0, 4), leaf ? "==" : "->", c(i)));
+				sb.append(String.format("%s %02d:%02d %20s %s %d\n", indent, number, i, hex(k(i), 0, 4), leaf ? "=="
+						: "->", c(i)));
 				if (!leaf) {
 					long c = c(i);
 					Page sub = getPage((int) c);
@@ -303,8 +303,8 @@
 
 			this.keySize = settings.getInt(KEYSIZE);
 			if (keySize != 0 && this.keySize != keySize)
-				throw new IllegalStateException("Invalid key size for Index file. The file is "
-						+ this.keySize + " and was expected to be " + this.keySize);
+				throw new IllegalStateException("Invalid key size for Index file. The file is " + this.keySize
+						+ " and was expected to be " + this.keySize);
 
 			root = getPage(1);
 			nextPage = (int) (this.file.size() / pageSize);
diff --git a/bundleplugin/src/main/java/aQute/lib/io/IO.java b/bundleplugin/src/main/java/aQute/lib/io/IO.java
index 3d4458e..183d92a 100644
--- a/bundleplugin/src/main/java/aQute/lib/io/IO.java
+++ b/bundleplugin/src/main/java/aQute/lib/io/IO.java
@@ -16,7 +16,8 @@
 				w.write(buffer, 0, size);
 				size = r.read(buffer);
 			}
-		} finally {
+		}
+		finally {
 			r.close();
 			w.flush();
 		}
@@ -26,19 +27,20 @@
 		copy(r, w, "UTF-8");
 	}
 
-	public static void copy(byte []r, Writer w) throws IOException {
-		copy( new ByteArrayInputStream(r), w, "UTF-8");
+	public static void copy(byte[] r, Writer w) throws IOException {
+		copy(new ByteArrayInputStream(r), w, "UTF-8");
 	}
 
-	public static void copy(byte []r, OutputStream w) throws IOException {
-		copy( new ByteArrayInputStream(r), w);
+	public static void copy(byte[] r, OutputStream w) throws IOException {
+		copy(new ByteArrayInputStream(r), w);
 	}
 
 	public static void copy(InputStream r, Writer w, String charset) throws IOException {
 		try {
 			InputStreamReader isr = new InputStreamReader(r, charset);
 			copy(isr, w);
-		} finally {
+		}
+		finally {
 			r.close();
 		}
 	}
@@ -51,7 +53,8 @@
 		try {
 			OutputStreamWriter osw = new OutputStreamWriter(o, charset);
 			copy(r, osw);
-		} finally {
+		}
+		finally {
 			r.close();
 		}
 	}
@@ -70,7 +73,8 @@
 				out.write(buffer, 0, size);
 				size = in.read(buffer);
 			}
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 	}
@@ -83,7 +87,8 @@
 				bb.put(buffer, 0, size);
 				size = in.read(buffer);
 			}
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 	}
@@ -100,7 +105,6 @@
 		copy(in.getInputStream(), md);
 	}
 
-
 	public static void copy(InputStream in, MessageDigest md) throws IOException {
 		byte[] buffer = new byte[10000];
 		try {
@@ -109,7 +113,8 @@
 				md.update(buffer, 0, size);
 				size = in.read(buffer);
 			}
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 	}
@@ -142,14 +147,14 @@
 			FileOutputStream out = new FileOutputStream(b);
 			try {
 				copy(new FileInputStream(a), out);
-			} finally {
+			}
+			finally {
 				out.close();
 			}
 		} else if (a.isDirectory()) {
 			b.mkdirs();
 			if (!b.isDirectory())
-				throw new IllegalArgumentException(
-						"target directory for a directory must be a directory: " + b);
+				throw new IllegalArgumentException("target directory for a directory must be a directory: " + b);
 			File subs[] = a.listFiles();
 			for (File sub : subs) {
 				copy(sub, new File(b, sub.getName()));
@@ -162,7 +167,8 @@
 		FileOutputStream out = new FileOutputStream(b);
 		try {
 			copy(a, out);
-		} finally {
+		}
+		finally {
 			out.close();
 		}
 	}
@@ -216,6 +222,10 @@
 		return sw.toString();
 	}
 
+	public static File getFile(String filename) {
+		return new File(filename.replace("/", File.separator));
+	}
+	
 	public static File getFile(File base, String file) {
 		File f = new File(file);
 		if (f.isAbsolute())
@@ -236,20 +246,63 @@
 		return new File(f, file).getAbsoluteFile();
 	}
 
+	/** Deletes the specified file.
+	 * Folders are recursively deleted.<br>
+	 * If file(s) cannot be deleted, no feedback is provided (fail silently).
+	 * @param f file to be deleted
+	 */
 	public static void delete(File f) {
+		try {
+			deleteWithException(f);
+		} catch (IOException e) {
+			// Ignore a failed delete
+		}
+	}
+	
+	/** Deletes the specified file.
+	 * Folders are recursively deleted.<br>
+	 * Throws exception if any of the files could not be deleted.
+	 * @param f file to be deleted
+	 * @throws IOException if the file (or contents of a folder) could not be deleted
+	 */
+	public static void deleteWithException(File f) throws IOException {
 		f = f.getAbsoluteFile();
+		if (!f.exists()) return;
 		if (f.getParentFile() == null)
 			throw new IllegalArgumentException("Cannot recursively delete root for safety reasons");
 
+		boolean wasDeleted = true;
 		if (f.isDirectory()) {
 			File[] subs = f.listFiles();
-			for (File sub : subs)
-				delete(sub);
+			for (File sub : subs) {
+				try {
+					deleteWithException(sub);
+				} catch (IOException e) {
+					wasDeleted = false;
+				}
+			}
 		}
 
-		f.delete();
+		boolean fDeleted = f.delete();
+		if (!fDeleted || !wasDeleted) {
+			throw new IOException("Failed to delete " + f.getAbsoluteFile());
+		}
 	}
 
+    /** Deletes <code>to</code> file if it exists, and renames <code>from</code> file to <code>to</code>.<br>
+     * Throws exception the rename operation fails.
+     * @param from source file
+     * @param to destination file
+     * @throws IOException if the rename operation fails
+     */
+    public static void rename(File from, File to) throws IOException {
+    	IO.deleteWithException(to);
+    	
+    	boolean renamed = from.renameTo(to);
+    	if (!renamed) throw new IOException("Could not rename " + from.getAbsoluteFile() + " to " + to.getAbsoluteFile());
+    }
+
+
 	public static long drain(InputStream in) throws IOException {
 		long result = 0;
 		byte[] buffer = new byte[10000];
@@ -259,14 +312,15 @@
 				result += size;
 				size = in.read(buffer);
 			}
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 		return result;
 	}
 
-	public void copy(Collection<?> c, OutputStream out) throws IOException {
-		Writer w = new OutputStreamWriter(out,"UTF-8");
+	public void copy(Collection< ? > c, OutputStream out) throws IOException {
+		Writer w = new OutputStreamWriter(out, "UTF-8");
 		PrintWriter ps = new PrintWriter(w);
 		for (Object o : c) {
 			ps.println(o);
@@ -276,13 +330,14 @@
 	}
 
 	public static Throwable close(Closeable in) {
-		if ( in == null)
+		if (in == null)
 			return null;
-		
+
 		try {
 			in.close();
 			return null;
-		} catch (Throwable e) {
+		}
+		catch (Throwable e) {
 			return e;
 		}
 	}
@@ -304,18 +359,18 @@
 		FileOutputStream fout = new FileOutputStream(out);
 		try {
 			store(o, fout, encoding);
-		} finally {
+		}
+		finally {
 			fout.close();
 		}
 	}
 
-	public static void store(Object o, OutputStream fout) throws UnsupportedEncodingException,
-			IOException {
+	public static void store(Object o, OutputStream fout) throws UnsupportedEncodingException, IOException {
 		store(o, fout, "UTF-8");
 	}
 
-	public static void store(Object o, OutputStream fout, String encoding)
-			throws UnsupportedEncodingException, IOException {
+	public static void store(Object o, OutputStream fout, String encoding) throws UnsupportedEncodingException,
+			IOException {
 		String s;
 
 		if (o == null)
@@ -325,7 +380,8 @@
 
 		try {
 			fout.write(s.getBytes(encoding));
-		} finally {
+		}
+		finally {
 			fout.close();
 		}
 	}
@@ -333,7 +389,8 @@
 	public static InputStream stream(String s) {
 		try {
 			return new ByteArrayInputStream(s.getBytes("UTF-8"));
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			// Ignore
 			return null;
 		}
@@ -355,33 +412,34 @@
 		return new StringReader(s);
 	}
 
-
 	public static BufferedReader reader(File f, String encoding) throws IOException {
-		return reader( new FileInputStream(f), encoding);
+		return reader(new FileInputStream(f), encoding);
 	}
-	
+
 	public static BufferedReader reader(File f) throws IOException {
-		return reader(f,"UTF-8");
+		return reader(f, "UTF-8");
 	}
-	
+
 	public static PrintWriter writer(File f, String encoding) throws IOException {
-		return writer( new FileOutputStream(f),encoding);
+		return writer(new FileOutputStream(f), encoding);
 	}
-	
+
 	public static PrintWriter writer(File f) throws IOException {
 		return writer(f, "UTF-8");
 	}
-	
+
 	public static PrintWriter writer(OutputStream out, String encoding) throws IOException {
-		return new PrintWriter( new OutputStreamWriter( out,encoding));
+		return new PrintWriter(new OutputStreamWriter(out, encoding));
 	}
+
 	public static BufferedReader reader(InputStream in, String encoding) throws IOException {
-		return new BufferedReader( new InputStreamReader(in, encoding));
+		return new BufferedReader(new InputStreamReader(in, encoding));
 	}
-	
+
 	public static BufferedReader reader(InputStream in) throws IOException {
 		return reader(in, "UTF-8");
 	}
+
 	public static PrintWriter writer(OutputStream out) throws IOException {
 		return writer(out, "UTF-8");
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/io/LimitedInputStream.java b/bundleplugin/src/main/java/aQute/lib/io/LimitedInputStream.java
index bf9a21f..b48ce5e 100644
--- a/bundleplugin/src/main/java/aQute/lib/io/LimitedInputStream.java
+++ b/bundleplugin/src/main/java/aQute/lib/io/LimitedInputStream.java
@@ -14,7 +14,8 @@
 		this.size = size;
 	}
 
-	@Override public int read() throws IOException {
+	@Override
+	public int read() throws IOException {
 		if (left <= 0) {
 			eof();
 			return -1;
@@ -24,27 +25,31 @@
 		return in.read();
 	}
 
-	@Override public int available() throws IOException {		
+	@Override
+	public int available() throws IOException {
 		return Math.min(left, in.available());
 	}
 
-	@Override public void close() throws IOException {
+	@Override
+	public void close() throws IOException {
 		eof();
 		in.close();
 	}
 
-	protected void eof() {
-	}
+	protected void eof() {}
 
-	@Override public synchronized void mark(int readlimit) {
+	@Override
+	public synchronized void mark(int readlimit) {
 		throw new UnsupportedOperationException();
 	}
 
-	@Override public boolean markSupported() {
+	@Override
+	public boolean markSupported() {
 		return false;
 	}
 
-	@Override public int read(byte[] b, int off, int len) throws IOException {
+	@Override
+	public int read(byte[] b, int off, int len) throws IOException {
 		int min = Math.min(len, left);
 		if (min == 0)
 			return 0;
@@ -55,23 +60,26 @@
 		return read;
 	}
 
-	@Override public int read(byte[] b) throws IOException {
-		return read(b,0,b.length);
+	@Override
+	public int read(byte[] b) throws IOException {
+		return read(b, 0, b.length);
 	}
 
-	@Override public synchronized void reset() throws IOException {
+	@Override
+	public synchronized void reset() throws IOException {
 		throw new UnsupportedOperationException();
 	}
 
-	@Override public long skip(long n) throws IOException {
+	@Override
+	public long skip(long n) throws IOException {
 		long count = 0;
 		byte buffer[] = new byte[1024];
-		while ( n > 0 && read() >= 0) {
+		while (n > 0 && read() >= 0) {
 			int size = read(buffer);
-			if ( size <= 0)
+			if (size <= 0)
 				return count;
-			count+=size;
-			n-=size;
+			count += size;
+			n -= size;
 		}
 		return count;
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/json/ArrayHandler.java b/bundleplugin/src/main/java/aQute/lib/json/ArrayHandler.java
index 62af4a7..1eb83ac 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/ArrayHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/ArrayHandler.java
@@ -12,8 +12,7 @@
 	}
 
 	@Override
-	void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
 		app.append("[");
 		String del = "";
 		int l = Array.getLength(object);
@@ -29,8 +28,7 @@
 	Object decodeArray(Decoder r) throws Exception {
 		ArrayList<Object> list = new ArrayList<Object>();
 		r.codec.parseArray(list, componentType, r);
-		Object array = Array.newInstance(r.codec.getRawClass(componentType),
-				list.size());
+		Object array = Array.newInstance(r.codec.getRawClass(componentType), list.size());
 		int n = 0;
 		for (Object o : list)
 			Array.set(array, n++, o);
diff --git a/bundleplugin/src/main/java/aQute/lib/json/BooleanHandler.java b/bundleplugin/src/main/java/aQute/lib/json/BooleanHandler.java
index d3b56ea..5dd4990 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/BooleanHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/BooleanHandler.java
@@ -6,24 +6,28 @@
 
 public class BooleanHandler extends Handler {
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
-		app.append( object.toString());
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
+		app.append(object.toString());
 	}
-	
-	@Override Object decode(boolean s) {
+
+	@Override
+	Object decode(boolean s) {
 		return s;
 	}
 
-	@Override Object decode(String s) {
+	@Override
+	Object decode(String s) {
 		return Boolean.parseBoolean(s);
 	}
 
-	@Override Object decode(Number s) {
+	@Override
+	Object decode(Number s) {
 		return s.intValue() != 0;
 	}
 
-	@Override Object decode() {
+	@Override
+	Object decode() {
 		return false;
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/lib/json/ByteArrayHandler.java b/bundleplugin/src/main/java/aQute/lib/json/ByteArrayHandler.java
index 65f5f74..d956a6c 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/ByteArrayHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/ByteArrayHandler.java
@@ -8,12 +8,13 @@
 
 public class ByteArrayHandler extends Handler {
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
 		StringHandler.string(app, Base64.encodeBase64((byte[]) object));
 	}
 
-	@Override Object decodeArray(Decoder r) throws Exception {
+	@Override
+	Object decodeArray(Decoder r) throws Exception {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 
 		ArrayList<Object> list = new ArrayList<Object>();
@@ -24,7 +25,8 @@
 		return out.toByteArray();
 	}
 
-	@Override Object decode(String s) throws Exception {
+	@Override
+	Object decode(String s) throws Exception {
 		return Base64.decodeBase64(s);
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/json/CharacterHandler.java b/bundleplugin/src/main/java/aQute/lib/json/CharacterHandler.java
index 7009e0c..3d00cdc 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/CharacterHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/CharacterHandler.java
@@ -5,26 +5,30 @@
 
 public class CharacterHandler extends Handler {
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws Exception {	
-		Character c  = (Character) object;
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws Exception {
+		Character c = (Character) object;
 		int v = (int) c.charValue();
-		app.append( v+"" );
+		app.append(v + "");
 	}
-	
-	@Override Object decode(boolean s) {
+
+	@Override
+	Object decode(boolean s) {
 		return s ? 't' : 'f';
 	}
 
-	@Override Object decode(String s) {
+	@Override
+	Object decode(String s) {
 		return (char) Integer.parseInt(s);
 	}
 
-	@Override Object decode(Number s) {
+	@Override
+	Object decode(Number s) {
 		return (char) s.shortValue();
 	}
 
-	@Override Object decode() {
+	@Override
+	Object decode() {
 		return 0;
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/lib/json/CollectionHandler.java b/bundleplugin/src/main/java/aQute/lib/json/CollectionHandler.java
index 89492c1..0ebfc62 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/CollectionHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/CollectionHandler.java
@@ -6,10 +6,10 @@
 import java.util.concurrent.*;
 
 public class CollectionHandler extends Handler {
-	Class<?>	rawClass;
+	Class< ? >	rawClass;
 	Type		componentType;
-	
-	CollectionHandler(Class<?> rawClass, Type componentType) {
+
+	CollectionHandler(Class< ? > rawClass, Type componentType) {
 		this.componentType = componentType;
 		if (rawClass.isInterface()) {
 			if (rawClass.isAssignableFrom(ArrayList.class))
@@ -29,15 +29,14 @@
 			else if (rawClass.isAssignableFrom(CopyOnWriteArraySet.class))
 				rawClass = CopyOnWriteArraySet.class;
 			else
-				throw new IllegalArgumentException("Unknown interface type for collection: "
-						+ rawClass);
+				throw new IllegalArgumentException("Unknown interface type for collection: " + rawClass);
 		}
 		this.rawClass = rawClass;
 	}
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
-		Iterable<?> collection = (Iterable<?>) object;
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
+		Iterable< ? > collection = (Iterable< ? >) object;
 
 		app.append("[");
 		String del = "";
@@ -49,7 +48,9 @@
 		app.append("]");
 	}
 
-	@SuppressWarnings("unchecked") @Override Object decodeArray(Decoder r) throws Exception {
+	@SuppressWarnings("unchecked")
+	@Override
+	Object decodeArray(Decoder r) throws Exception {
 		Collection<Object> c = (Collection<Object>) rawClass.newInstance();
 		r.codec.parseArray(c, componentType, r);
 		return c;
diff --git a/bundleplugin/src/main/java/aQute/lib/json/DateHandler.java b/bundleplugin/src/main/java/aQute/lib/json/DateHandler.java
index d4f262e..784fcbe 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/DateHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/DateHandler.java
@@ -8,8 +8,8 @@
 public class DateHandler extends Handler {
 	final static SimpleDateFormat	sdf	= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
 		String s;
 		synchronized (sdf) {
 			s = sdf.format((Date) object);
@@ -17,13 +17,15 @@
 		StringHandler.string(app, s);
 	}
 
-	@Override Object decode(String s) throws Exception {
+	@Override
+	Object decode(String s) throws Exception {
 		synchronized (sdf) {
 			return sdf.parse(s);
 		}
 	}
 
-	@Override Object decode(Number s) throws Exception {
+	@Override
+	Object decode(Number s) throws Exception {
 		return new Date(s.longValue());
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/lib/json/Decoder.java b/bundleplugin/src/main/java/aQute/lib/json/Decoder.java
index 3cbed4b..703331d 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/Decoder.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/Decoder.java
@@ -5,15 +5,17 @@
 import java.security.*;
 import java.util.*;
 
+import aQute.lib.converter.*;
+
 public class Decoder implements Closeable {
 	final JSONCodec		codec;
 	Reader				reader;
 	int					current;
 	MessageDigest		digest;
-	Map<String, Object>	extra;
-	String encoding = "UTF-8";
-	
-	boolean strict;
+	Map<String,Object>	extra;
+	String				encoding	= "UTF-8";
+
+	boolean				strict;
 
 	Decoder(JSONCodec codec) {
 		this.codec = codec;
@@ -26,12 +28,12 @@
 	public Decoder from(InputStream in) throws Exception {
 		return from(new InputStreamReader(in, encoding));
 	}
-	
+
 	public Decoder charset(String encoding) {
 		this.encoding = encoding;
 		return this;
 	}
-	
+
 	public Decoder strict() {
 		this.strict = true;
 		return this;
@@ -65,7 +67,8 @@
 		return digest.digest();
 	}
 
-	@SuppressWarnings("unchecked") public <T> T get(Class<T> clazz) throws Exception {
+	@SuppressWarnings("unchecked")
+	public <T> T get(Class<T> clazz) throws Exception {
 		return (T) codec.decode(clazz, this);
 	}
 
@@ -77,6 +80,11 @@
 		return codec.decode(null, this);
 	}
 
+	@SuppressWarnings("unchecked")
+	public <T> T get(TypeReference<T> ref) throws Exception {
+		return (T) codec.decode(ref.getType(), this);
+	}
+
 	int read() throws Exception {
 		current = reader.read();
 		if (digest != null) {
@@ -129,9 +137,9 @@
 		reader.close();
 	}
 
-	public Map<String, Object> getExtra() {
+	public Map<String,Object> getExtra() {
 		if (extra == null)
-			extra = new HashMap<String, Object>();
+			extra = new HashMap<String,Object>();
 		return extra;
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/json/Encoder.java b/bundleplugin/src/main/java/aQute/lib/json/Encoder.java
index 09990ed..b6112e7 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/Encoder.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/Encoder.java
@@ -20,7 +20,7 @@
 		if (app == null)
 			to();
 
-		codec.encode(this, object, null, new IdentityHashMap<Object, Type>());
+		codec.encode(this, object, null, new IdentityHashMap<Object,Type>());
 		return this;
 	}
 
@@ -95,7 +95,7 @@
 			((Closeable) app).close();
 	}
 
-	void encode(Object object, Type type, Map<Object, Type> visited) throws Exception {
+	void encode(Object object, Type type, Map<Object,Type> visited) throws Exception {
 		codec.encode(this, object, type, visited);
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/lib/json/EnumHandler.java b/bundleplugin/src/main/java/aQute/lib/json/EnumHandler.java
index dbdb492..85aad12 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/EnumHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/EnumHandler.java
@@ -6,18 +6,19 @@
 
 public class EnumHandler extends Handler {
 	@SuppressWarnings("rawtypes")
-	final Class				type;
+	final Class	type;
 
-	public EnumHandler(Class<?> type) {
+	public EnumHandler(Class< ? > type) {
 		this.type = type;
 	}
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
 		StringHandler.string(app, object.toString());
 	}
 
-	@SuppressWarnings("unchecked") Object decode(String s) throws Exception {
+	@SuppressWarnings("unchecked")
+	Object decode(String s) throws Exception {
 		return Enum.valueOf(type, s);
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/lib/json/FileHandler.java b/bundleplugin/src/main/java/aQute/lib/json/FileHandler.java
index 2f0eea5..c024090 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/FileHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/FileHandler.java
@@ -8,18 +8,19 @@
 
 public class FileHandler extends Handler {
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
 		File f = (File) object;
-		if ( !f.isFile())
-			throw new RuntimeException("Encoding a file requires the file to exist and to be a normal file " + f );
-		
+		if (!f.isFile())
+			throw new RuntimeException("Encoding a file requires the file to exist and to be a normal file " + f);
+
 		FileInputStream in = new FileInputStream(f);
 		try {
 			app.append('"');
 			Base64.encode(in, app);
 			app.append('"');
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 	}
@@ -29,7 +30,8 @@
 		FileOutputStream fout = new FileOutputStream(tmp);
 		try {
 			Base64.decode(new StringReader(s), fout);
-		} finally {
+		}
+		finally {
 			fout.close();
 		}
 		return tmp;
diff --git a/bundleplugin/src/main/java/aQute/lib/json/Handler.java b/bundleplugin/src/main/java/aQute/lib/json/Handler.java
index 18957e8..f002f50 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/Handler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/Handler.java
@@ -5,8 +5,7 @@
 import java.util.*;
 
 abstract class Handler {
-	abstract void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception;
+	abstract void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception;
 
 	Object decodeObject(Decoder isr) throws Exception {
 		throw new UnsupportedOperationException("Cannot be mapped to object " + this);
diff --git a/bundleplugin/src/main/java/aQute/lib/json/JSONCodec.java b/bundleplugin/src/main/java/aQute/lib/json/JSONCodec.java
index fa5c751..032f08f 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/JSONCodec.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/JSONCodec.java
@@ -39,22 +39,18 @@
 	final static String								START_CHARACTERS	= "[{\"-0123456789tfn";
 
 	// Handlers
-	private final static WeakHashMap<Type, Handler>	handlers			= new WeakHashMap<Type, Handler>();
+	private final static WeakHashMap<Type,Handler>	handlers			= new WeakHashMap<Type,Handler>();
 	private static StringHandler					sh					= new StringHandler();
 	private static BooleanHandler					bh					= new BooleanHandler();
 	private static CharacterHandler					ch					= new CharacterHandler();
-	private static CollectionHandler				dch					= new CollectionHandler(
-																				ArrayList.class,
+	private static CollectionHandler				dch					= new CollectionHandler(ArrayList.class,
 																				Object.class);
-	private static SpecialHandler					sph					= new SpecialHandler(
-																				Pattern.class,
-																				null, null);
+	private static SpecialHandler					sph					= new SpecialHandler(Pattern.class, null, null);
 	private static DateHandler						sdh					= new DateHandler();
 	private static FileHandler						fh					= new FileHandler();
 	private static ByteArrayHandler					byteh				= new ByteArrayHandler();
 
-	boolean ignorenull;
-	
+	boolean											ignorenull;
 
 	/**
 	 * Create a new Encoder with the state and appropriate API.
@@ -77,7 +73,7 @@
 	/*
 	 * Work horse encode methods, all encoding ends up here.
 	 */
-	void encode(Encoder app, Object object, Type type, Map<Object, Type> visited) throws Exception {
+	void encode(Encoder app, Object object, Type type, Map<Object,Type> visited) throws Exception {
 
 		// Get the null out of the way
 
@@ -104,11 +100,8 @@
 	 * stuff. It returns a handler for each type. If no appropriate handler
 	 * exists, it will create one for the given type. There are actually quite a
 	 * lot of handlers since Java is not very object oriented.
-	 * 
 	 * @param type
-	 * 
 	 * @return
-	 * 
 	 * @throws Exception
 	 */
 	Handler getHandler(Type type) throws Exception {
@@ -146,7 +139,7 @@
 
 		if (type instanceof Class) {
 
-			Class<?> clazz = (Class<?>) type;
+			Class< ? > clazz = (Class< ? >) type;
 
 			if (Enum.class.isAssignableFrom(clazz))
 				h = new EnumHandler(clazz);
@@ -162,16 +155,18 @@
 				h = new NumberHandler(clazz);
 			else {
 				Method valueOf = null;
-				Constructor<?> constructor = null;
+				Constructor< ? > constructor = null;
 
 				try {
 					constructor = clazz.getConstructor(String.class);
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					// Ignore
 				}
 				try {
 					valueOf = clazz.getMethod("valueOf", String.class);
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					// Ignore
 				}
 				if (constructor != null || valueOf != null)
@@ -190,22 +185,19 @@
 				ParameterizedType pt = (ParameterizedType) type;
 				Type rawType = pt.getRawType();
 				if (rawType instanceof Class) {
-					Class<?> rawClass = (Class<?>) rawType;
+					Class< ? > rawClass = (Class< ? >) rawType;
 					if (Iterable.class.isAssignableFrom(rawClass))
 						h = new CollectionHandler(rawClass, pt.getActualTypeArguments()[0]);
 					else if (Map.class.isAssignableFrom(rawClass))
-						h = new MapHandler(rawClass, pt.getActualTypeArguments()[0],
-								pt.getActualTypeArguments()[1]);
+						h = new MapHandler(rawClass, pt.getActualTypeArguments()[0], pt.getActualTypeArguments()[1]);
 					else
-						throw new IllegalArgumentException(
-								"Found a parameterized type that is not a map or collection");
+						throw new IllegalArgumentException("Found a parameterized type that is not a map or collection");
 				}
 			} else if (type instanceof GenericArrayType) {
 				GenericArrayType gat = (GenericArrayType) type;
 				h = new ArrayHandler(getRawClass(type), gat.getGenericComponentType());
 			} else
-				throw new IllegalArgumentException(
-						"Found a parameterized type that is not a map or collection");
+				throw new IllegalArgumentException("Found a parameterized type that is not a map or collection");
 		}
 		synchronized (handlers) {
 			// We might actually have duplicates
@@ -225,87 +217,86 @@
 			// type information
 
 			switch (c) {
-			case '{':
-				type = LinkedHashMap.class;
-				break;
+				case '{' :
+					type = LinkedHashMap.class;
+					break;
 
-			case '[':
-				type = ArrayList.class;
-				break;
+				case '[' :
+					type = ArrayList.class;
+					break;
 
-			case '"':
-				return parseString(isr);
+				case '"' :
+					return parseString(isr);
 
-			case 'n':
-				isr.expect("ull");
-				return null;
+				case 'n' :
+					isr.expect("ull");
+					return null;
 
-			case 't':
-				isr.expect("rue");
-				return true;
+				case 't' :
+					isr.expect("rue");
+					return true;
 
-			case 'f':
-				isr.expect("alse");
-				return false;
+				case 'f' :
+					isr.expect("alse");
+					return false;
 
-			case '0':
-			case '1':
-			case '2':
-			case '3':
-			case '4':
-			case '5':
-			case '6':
-			case '7':
-			case '8':
-			case '9':
-			case '-':
-				return parseNumber(isr);
+				case '0' :
+				case '1' :
+				case '2' :
+				case '3' :
+				case '4' :
+				case '5' :
+				case '6' :
+				case '7' :
+				case '8' :
+				case '9' :
+				case '-' :
+					return parseNumber(isr);
 
-			default:
-				throw new IllegalArgumentException("Invalid character at begin of token: "
-						+ (char) c);
+				default :
+					throw new IllegalArgumentException("Invalid character at begin of token: " + (char) c);
 			}
 		}
 
 		h = getHandler(type);
 
 		switch (c) {
-		case '{':
-			return h.decodeObject(isr);
+			case '{' :
+				return h.decodeObject(isr);
 
-		case '[':
-			return h.decodeArray(isr);
+			case '[' :
+				return h.decodeArray(isr);
 
-		case '"':
-			return h.decode(parseString(isr));
+			case '"' :
+				return h.decode(parseString(isr));
 
-		case 'n':
-			isr.expect("ull");
-			return h.decode();
+			case 'n' :
+				isr.expect("ull");
+				return h.decode();
 
-		case 't':
-			isr.expect("rue");
-			return h.decode(Boolean.TRUE);
+			case 't' :
+				isr.expect("rue");
+				return h.decode(Boolean.TRUE);
 
-		case 'f':
-			isr.expect("alse");
-			return h.decode(Boolean.FALSE);
+			case 'f' :
+				isr.expect("alse");
+				return h.decode(Boolean.FALSE);
 
-		case '0':
-		case '1':
-		case '2':
-		case '3':
-		case '4':
-		case '5':
-		case '6':
-		case '7':
-		case '8':
-		case '9':
-		case '-':
-			return h.decode(parseNumber(isr));
+			case '0' :
+			case '1' :
+			case '2' :
+			case '3' :
+			case '4' :
+			case '5' :
+			case '6' :
+			case '7' :
+			case '8' :
+			case '9' :
+			case '-' :
+				return h.decode(parseNumber(isr));
 
-		default:
-			throw new IllegalArgumentException("Unexpected character in input stream: " + (char) c);
+			default :
+				throw new IllegalArgumentException("Unexpected character in input stream: " + (char) c);
 		}
 	}
 
@@ -317,47 +308,45 @@
 		StringBuilder sb = new StringBuilder();
 		while (c != '"') {
 			if (c < 0 || Character.isISOControl(c))
-				throw new IllegalArgumentException(
-						"JSON strings may not contain control characters: " + r.current());
+				throw new IllegalArgumentException("JSON strings may not contain control characters: " + r.current());
 
 			if (c == '\\') {
 				c = r.read();
 				switch (c) {
-				case '"':
-				case '\\':
-				case '/':
-					sb.append((char)c);
-					break;
+					case '"' :
+					case '\\' :
+					case '/' :
+						sb.append((char) c);
+						break;
 
-				case 'b':
-					sb.append('\b');
-					break;
+					case 'b' :
+						sb.append('\b');
+						break;
 
-				case 'f':
-					sb.append('\f');
-					break;
-				case 'n':
-					sb.append('\n');
-					break;
-				case 'r':
-					sb.append('\r');
-					break;
-				case 't':
-					sb.append('\t');
-					break;
-				case 'u':
-					int a3 = hexDigit(r.read()) << 12;
-					int a2 = hexDigit(r.read()) << 8;
-					int a1 = hexDigit(r.read()) << 4;
-					int a0 = hexDigit(r.read()) << 0;
-					c = a3 + a2 + a1 + a0;
-					sb.append((char) c);
-					break;
+					case 'f' :
+						sb.append('\f');
+						break;
+					case 'n' :
+						sb.append('\n');
+						break;
+					case 'r' :
+						sb.append('\r');
+						break;
+					case 't' :
+						sb.append('\t');
+						break;
+					case 'u' :
+						int a3 = hexDigit(r.read()) << 12;
+						int a2 = hexDigit(r.read()) << 8;
+						int a1 = hexDigit(r.read()) << 4;
+						int a0 = hexDigit(r.read()) << 0;
+						c = a3 + a2 + a1 + a0;
+						sb.append((char) c);
+						break;
 
-				default:
-					throw new IllegalArgumentException(
-							"The only characters after a backslash are \", \\, b, f, n, r, t, and u but got "
-									+ c);
+					default :
+						throw new IllegalArgumentException(
+								"The only characters after a backslash are \", \\, b, f, n, r, t, and u but got " + c);
 				}
 			} else
 				sb.append((char) c);
@@ -455,15 +444,15 @@
 				continue;
 			}
 
-			throw new IllegalArgumentException(
-					"Invalid character in parsing list, expected ] or , but found " + (char) c);
+			throw new IllegalArgumentException("Invalid character in parsing list, expected ] or , but found "
+					+ (char) c);
 		}
 		assert r.current() == ']';
 		r.read(); // skip closing
 	}
 
 	@SuppressWarnings("rawtypes")
-	Class<?> getRawClass(Type type) {
+	Class< ? > getRawClass(Type type) {
 		if (type instanceof Class)
 			return (Class) type;
 
@@ -477,12 +466,12 @@
 		}
 
 		throw new IllegalArgumentException(
-				"Does not support generics beyond Parameterized Type  and GenericArrayType, got "
-						+ type);
+				"Does not support generics beyond Parameterized Type  and GenericArrayType, got " + type);
 	}
 
 	/**
 	 * Ignore null values in output and input
+	 * 
 	 * @param ignorenull
 	 * @return
 	 */
diff --git a/bundleplugin/src/main/java/aQute/lib/json/MapHandler.java b/bundleplugin/src/main/java/aQute/lib/json/MapHandler.java
index 9299878..4a12c02 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/MapHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/MapHandler.java
@@ -5,11 +5,11 @@
 import java.util.*;
 
 public class MapHandler extends Handler {
-	final Class<?>	rawClass;
-	final Type		keyType;
-	final Type		valueType;
+	final Class< ? >	rawClass;
+	final Type			keyType;
+	final Type			valueType;
 
-	MapHandler(Class<?> rawClass, Type keyType, Type valueType) {
+	MapHandler(Class< ? > rawClass, Type keyType, Type valueType) {
 		this.keyType = keyType;
 		this.valueType = valueType;
 		if (rawClass.isInterface()) {
@@ -27,13 +27,13 @@
 		this.rawClass = rawClass;
 	}
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
-		Map<?, ?> map = (Map<?, ?>) object;
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
+		Map< ? , ? > map = (Map< ? , ? >) object;
 
 		app.append("{");
 		String del = "";
-		for (Map.Entry<?, ?> e : map.entrySet()) {
+		for (Map.Entry< ? , ? > e : map.entrySet()) {
 			app.append(del);
 			String key;
 			if (e.getKey() != null && (keyType == String.class || keyType == Object.class))
@@ -49,31 +49,33 @@
 		app.append("}");
 	}
 
-	@SuppressWarnings("unchecked") @Override Object decodeObject(Decoder r) throws Exception {
+	@SuppressWarnings("unchecked")
+	@Override
+	Object decodeObject(Decoder r) throws Exception {
 		assert r.current() == '{';
-		
-		Map<Object, Object> map = (Map<Object, Object>) rawClass.newInstance();
-		
+
+		Map<Object,Object> map = (Map<Object,Object>) rawClass.newInstance();
+
 		int c = r.next();
 		while (JSONCodec.START_CHARACTERS.indexOf(c) >= 0) {
 			Object key = r.codec.parseString(r);
-			if ( !(keyType == null || keyType == Object.class)) {
+			if (!(keyType == null || keyType == Object.class)) {
 				Handler h = r.codec.getHandler(keyType);
-				key = h.decode((String)key);
+				key = h.decode((String) key);
 			}
-			
+
 			c = r.skipWs();
-			if ( c != ':')
+			if (c != ':')
 				throw new IllegalArgumentException("Expected ':' but got " + (char) c);
 
 			c = r.next();
 			Object value = r.codec.decode(valueType, r);
-			if ( value != null || !r.codec.ignorenull)
+			if (value != null || !r.codec.ignorenull)
 				map.put(key, value);
 
 			c = r.skipWs();
-			
-			if (c == '}') 
+
+			if (c == '}')
 				break;
 
 			if (c == ',') {
@@ -81,8 +83,8 @@
 				continue;
 			}
 
-			throw new IllegalArgumentException(
-					"Invalid character in parsing list, expected } or , but found " + (char) c);
+			throw new IllegalArgumentException("Invalid character in parsing list, expected } or , but found "
+					+ (char) c);
 		}
 		assert r.current() == '}';
 		r.read(); // skip closing
diff --git a/bundleplugin/src/main/java/aQute/lib/json/NumberHandler.java b/bundleplugin/src/main/java/aQute/lib/json/NumberHandler.java
index 644d49a..310ca3e 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/NumberHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/NumberHandler.java
@@ -5,42 +5,45 @@
 import java.util.*;
 
 public class NumberHandler extends Handler {
-	final Class<?>	type;
+	final Class< ? >	type;
 
-	NumberHandler(Class<?> clazz) {
+	NumberHandler(Class< ? > clazz) {
 		this.type = clazz;
 	}
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws Exception {
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws Exception {
 		String s = object.toString();
-		if ( s.endsWith(".0"))
-			s  = s.substring(0,s.length()-2);
-		
+		if (s.endsWith(".0"))
+			s = s.substring(0, s.length() - 2);
+
 		app.append(s);
 	}
 
-	@Override Object decode(boolean s) {
+	@Override
+	Object decode(boolean s) {
 		return decode(s ? 1d : 0d);
 	}
 
-	@Override Object decode(String s) {
+	@Override
+	Object decode(String s) {
 		double d = Double.parseDouble(s);
 		return decode(d);
 	}
 
-	@Override Object decode() {
+	@Override
+	Object decode() {
 		return decode(0d);
 	}
 
-	@Override Object decode(Number s) {
+	@Override
+	Object decode(Number s) {
 		double dd = s.doubleValue();
-		
+
 		if (type == double.class || type == Double.class)
 			return s.doubleValue();
 
-		if ((type == int.class || type == Integer.class)
-				&& within(dd, Integer.MIN_VALUE, Integer.MAX_VALUE))
+		if ((type == int.class || type == Integer.class) && within(dd, Integer.MIN_VALUE, Integer.MAX_VALUE))
 			return s.intValue();
 
 		if ((type == long.class || type == Long.class) && within(dd, Long.MIN_VALUE, Long.MAX_VALUE))
@@ -49,8 +52,7 @@
 		if ((type == byte.class || type == Byte.class) && within(dd, Byte.MIN_VALUE, Byte.MAX_VALUE))
 			return s.byteValue();
 
-		if ((type == short.class || type == Short.class)
-				&& within(dd, Short.MIN_VALUE, Short.MAX_VALUE))
+		if ((type == short.class || type == Short.class) && within(dd, Short.MIN_VALUE, Short.MAX_VALUE))
 			return s.shortValue();
 
 		if (type == float.class || type == Float.class)
diff --git a/bundleplugin/src/main/java/aQute/lib/json/ObjectHandler.java b/bundleplugin/src/main/java/aQute/lib/json/ObjectHandler.java
index 2a876a4..50aaac0 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/ObjectHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/ObjectHandler.java
@@ -11,7 +11,7 @@
 	final Object	defaults[];
 	final Field		extra;
 
-	ObjectHandler(JSONCodec codec, Class<?> c) throws Exception {
+	ObjectHandler(JSONCodec codec, Class< ? > c) throws Exception {
 		rawClass = c;
 		fields = c.getFields();
 
@@ -35,19 +35,21 @@
 			extra = x;
 		else
 			extra = null;
-		
+
 		try {
 			Object template = c.newInstance();
 
 			for (int i = 0; i < fields.length; i++) {
 				defaults[i] = fields[i].get(template);
 			}
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			// Ignore
 		}
 	}
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited) throws Exception {
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws Exception {
 		app.append("{");
 		String del = "";
 		for (int i = 0; i < fields.length; i++) {
@@ -72,7 +74,9 @@
 		app.append("}");
 	}
 
-	@SuppressWarnings("unchecked") @Override Object decodeObject(Decoder r) throws Exception {
+	@SuppressWarnings("unchecked")
+	@Override
+	Object decodeObject(Decoder r) throws Exception {
 		assert r.current() == '{';
 		Object targetObject = rawClass.newInstance();
 
@@ -95,7 +99,7 @@
 			if (f != null) {
 				// We have a field and thus a type
 				Object value = r.codec.decode(f.getGenericType(), r);
-				if ( value != null || !r.codec.ignorenull)
+				if (value != null || !r.codec.ignorenull)
 					f.set(targetObject, value);
 			} else {
 				// No field, but may extra is defined
@@ -106,9 +110,9 @@
 					r.getExtra().put(rawClass.getName() + "." + key, value);
 				} else {
 
-					Map<String, Object> map = (Map<String, Object>) extra.get(targetObject);
+					Map<String,Object> map = (Map<String,Object>) extra.get(targetObject);
 					if (map == null) {
-						map = new LinkedHashMap<String, Object>();
+						map = new LinkedHashMap<String,Object>();
 						extra.set(targetObject, map);
 					}
 					Object value = r.codec.decode(null, r);
@@ -126,8 +130,8 @@
 				continue;
 			}
 
-			throw new IllegalArgumentException(
-					"Invalid character in parsing object, expected } or , but found " + (char) c);
+			throw new IllegalArgumentException("Invalid character in parsing object, expected } or , but found "
+					+ (char) c);
 		}
 		assert r.current() == '}';
 		r.read(); // skip closing
diff --git a/bundleplugin/src/main/java/aQute/lib/json/SpecialHandler.java b/bundleplugin/src/main/java/aQute/lib/json/SpecialHandler.java
index 33bde8f..bcd05ef 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/SpecialHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/SpecialHandler.java
@@ -13,16 +13,14 @@
 	final Constructor< ? >			constructor;
 	final static SimpleDateFormat	sdf	= new SimpleDateFormat();
 
-	public SpecialHandler(Class< ? > type, Constructor< ? > constructor,
-			Method valueOf) {
+	public SpecialHandler(Class< ? > type, Constructor< ? > constructor, Method valueOf) {
 		this.type = type;
 		this.constructor = constructor;
 		this.valueOf = valueOf;
 	}
 
 	@Override
-	void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException, Exception {
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException, Exception {
 		StringHandler.string(app, object.toString());
 	}
 
@@ -37,8 +35,7 @@
 		if (valueOf != null)
 			return valueOf.invoke(null, s);
 
-		throw new IllegalArgumentException("Do not know how to convert a "
-				+ type + " from a string");
+		throw new IllegalArgumentException("Do not know how to convert a " + type + " from a string");
 	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/json/StringHandler.java b/bundleplugin/src/main/java/aQute/lib/json/StringHandler.java
index 2450ed0..8ebfee2 100644
--- a/bundleplugin/src/main/java/aQute/lib/json/StringHandler.java
+++ b/bundleplugin/src/main/java/aQute/lib/json/StringHandler.java
@@ -6,8 +6,8 @@
 
 public class StringHandler extends Handler {
 
-	@Override void encode(Encoder app, Object object, Map<Object, Type> visited)
-			throws IOException {
+	@Override
+	void encode(Encoder app, Object object, Map<Object,Type> visited) throws IOException {
 		string(app, object.toString());
 	}
 
@@ -17,43 +17,43 @@
 		for (int i = 0; i < s.length(); i++) {
 			char c = s.charAt(i);
 			switch (c) {
-			case '"':
-				app.append("\\\"");
-				break;
+				case '"' :
+					app.append("\\\"");
+					break;
 
-			case '\\':
-				app.append("\\\\");
-				break;
+				case '\\' :
+					app.append("\\\\");
+					break;
 
-			case '\b':
-				app.append("\\b");
-				break;
+				case '\b' :
+					app.append("\\b");
+					break;
 
-			case '\f':
-				app.append("\\f");
-				break;
+				case '\f' :
+					app.append("\\f");
+					break;
 
-			case '\n':
-				app.append("\\n");
-				break;
+				case '\n' :
+					app.append("\\n");
+					break;
 
-			case '\r':
-				app.append("\\r");
-				break;
+				case '\r' :
+					app.append("\\r");
+					break;
 
-			case '\t':
-				app.append("\\t");
-				break;
+				case '\t' :
+					app.append("\\t");
+					break;
 
-			default:
-				if (Character.isISOControl(c)) {
-					app.append("\\u");
-					app.append("0123456789ABCDEF".charAt(0xF & (c >> 12)));
-					app.append("0123456789ABCDEF".charAt(0xF & (c >> 8)));
-					app.append("0123456789ABCDEF".charAt(0xF & (c >> 4)));
-					app.append("0123456789ABCDEF".charAt(0xF & (c >> 0)));
-				} else
-					app.append(c);
+				default :
+					if (Character.isISOControl(c)) {
+						app.append("\\u");
+						app.append("0123456789ABCDEF".charAt(0xF & (c >> 12)));
+						app.append("0123456789ABCDEF".charAt(0xF & (c >> 8)));
+						app.append("0123456789ABCDEF".charAt(0xF & (c >> 4)));
+						app.append("0123456789ABCDEF".charAt(0xF & (c >> 0)));
+					} else
+						app.append(c);
 			}
 		}
 		app.append('"');
@@ -113,29 +113,29 @@
 			sb.append((char) c);
 			if (instring)
 				switch (c) {
-				case '"':
-					instring = true;
-					break;
+					case '"' :
+						instring = true;
+						break;
 
-				case '[':
-				case '{':
-					level++;
-					break;
+					case '[' :
+					case '{' :
+						level++;
+						break;
 
-				case ']':
-				case '}':
-					level--;
-					break;
+					case ']' :
+					case '}' :
+						level--;
+						break;
 				}
 			else
 				switch (c) {
-				case '"':
-					instring = false;
-					break;
+					case '"' :
+						instring = false;
+						break;
 
-				case '\\':
-					sb.append((char) isr.read());
-					break;
+					case '\\' :
+						sb.append((char) isr.read());
+						break;
 				}
 
 			c = isr.read();
diff --git a/bundleplugin/src/main/java/aQute/lib/justif/Justif.java b/bundleplugin/src/main/java/aQute/lib/justif/Justif.java
index 663a9d6..841d009 100644
--- a/bundleplugin/src/main/java/aQute/lib/justif/Justif.java
+++ b/bundleplugin/src/main/java/aQute/lib/justif/Justif.java
@@ -2,11 +2,10 @@
 
 import java.util.*;
 
-
 public class Justif {
-	int []tabs;
-	
-	public Justif(int width, int ... tabs) {
+	int[]	tabs;
+
+	public Justif(int width, int... tabs) {
 		this.tabs = tabs;
 	}
 
@@ -24,7 +23,7 @@
 	 */
 	public void wrap(StringBuilder sb) {
 		List<Integer> indents = new ArrayList<Integer>();
-		
+
 		int indent = 0;
 		int linelength = 0;
 		int lastSpace = 0;
@@ -33,72 +32,71 @@
 
 		while (r < sb.length()) {
 			switch (sb.charAt(r++)) {
-			case '\n':
-				linelength = 0;
-				
-				indent = indents.isEmpty() ? 0 : indents.remove(0);
-				begin = true;
-				lastSpace = 0;
-				break;
-
-			case ' ':
-				if (begin)
-					indent++;
-				lastSpace = r - 1;
-				linelength++;
-				break;
-
-			case '\t':
-				indents.add(indent);
-				indent = linelength;
-				sb.deleteCharAt(--r);
-				
-				if (r < sb.length()) {
-					char digit = sb.charAt(r);
-					if (Character.isDigit(digit)) {
-						sb.deleteCharAt(r--);
-
-						int column = (digit - '0');
-						if (column < tabs.length)
-							indent = tabs[column];
-						else
-							indent = column * 8;
-
-						int diff = indent - linelength;
-						if (diff > 0) {
-							for (int i=0; i<diff; i++) {
-								sb.insert(r, ' ');
-							}
-							r += diff;
-							linelength += diff;
-						}
-					}
-				}
-				break;
-
-			case '\f':
-				linelength = 100000; // force a break
-				lastSpace = r-1;
-
-				//$FALL-THROUGH$
-
-			default:
-				linelength++;
-				begin = false;
-				if (lastSpace != 0 && linelength > 60) {
-					sb.setCharAt(lastSpace, '\n');
+				case '\n' :
 					linelength = 0;
 
-					for (int i = 0; i < indent; i++) {
-						sb.insert(lastSpace + 1, ' ');
-						linelength++;
-					}
-					r += indent;
+					indent = indents.isEmpty() ? 0 : indents.remove(0);
+					begin = true;
 					lastSpace = 0;
-				}
+					break;
+
+				case ' ' :
+					if (begin)
+						indent++;
+					lastSpace = r - 1;
+					linelength++;
+					break;
+
+				case '\t' :
+					indents.add(indent);
+					indent = linelength;
+					sb.deleteCharAt(--r);
+
+					if (r < sb.length()) {
+						char digit = sb.charAt(r);
+						if (Character.isDigit(digit)) {
+							sb.deleteCharAt(r);
+
+							int column = (digit - '0');
+							if (column < tabs.length)
+								indent = tabs[column];
+							else
+								indent = column * 8;
+
+							int diff = indent - linelength;
+							if (diff > 0) {
+								for (int i = 0; i < diff; i++) {
+									sb.insert(r, ' ');
+								}
+								r += diff;
+								linelength += diff;
+							}
+						}
+					}
+					break;
+
+				case '\f' :
+					linelength = 100000; // force a break
+					lastSpace = r - 1;
+
+					//$FALL-THROUGH$
+
+				default :
+					linelength++;
+					begin = false;
+					if (lastSpace != 0 && linelength > 60) {
+						sb.setCharAt(lastSpace, '\n');
+						linelength = 0;
+
+						for (int i = 0; i < indent; i++) {
+							sb.insert(lastSpace + 1, ' ');
+							linelength++;
+						}
+						r += indent;
+						lastSpace = 0;
+					}
 			}
 		}
 	}
 
-
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/About.java b/bundleplugin/src/main/java/aQute/lib/osgi/About.java
index 7265212..0fdf402 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/About.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/About.java
@@ -4,48 +4,36 @@
 
 /**
  * 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.
- * 
+ * 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.
+ * 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
index 4c52103..782e615 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/AbstractResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/AbstractResource.java
@@ -3,52 +3,54 @@
 import java.io.*;
 
 public abstract class AbstractResource implements Resource {
-    String extra;
-    byte[] calculated;
-    long   lastModified;
+	String	extra;
+	byte[]	calculated;
+	long	lastModified;
 
-    protected AbstractResource(long modified) {
-        lastModified = modified;
-    }
+	protected AbstractResource(long modified) {
+		lastModified = modified;
+	}
 
-    public String getExtra() {
-        return extra;
-    }
+	public String getExtra() {
+		return extra;
+	}
 
-    public long lastModified() {
-        return lastModified;
-    }
+	public long lastModified() {
+		return lastModified;
+	}
 
-    public InputStream openInputStream() throws IOException {
-        return new ByteArrayInputStream(getLocalBytes());
-    }
+	public InputStream openInputStream() throws IOException {
+		return new ByteArrayInputStream(getLocalBytes());
+	}
 
-    private byte[] getLocalBytes() throws IOException {
-        try {
-            if (calculated != null)
-                return calculated;
+	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;
-        }
-    }
+			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 setExtra(String extra) {
+		this.extra = extra;
+	}
 
-    public void write(OutputStream out) throws IOException {
-        out.write(getLocalBytes());
-    }
+	public void write(OutputStream out) throws IOException {
+		out.write(getLocalBytes());
+	}
 
-    abstract protected byte[] getBytes() throws Exception;
-    
-    public long size() throws IOException {
-    	return getLocalBytes().length;
-    }
+	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
index 8be2edb..8af9bc7 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Analyzer.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Analyzer.java
@@ -42,6 +42,7 @@
 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 {
@@ -57,30 +58,31 @@
 	private TypeRef									activator;
 
 	// Global parameters
-	private final MultiMap<PackageRef, PackageRef>	uses					= new MultiMap<PackageRef, PackageRef>(
-																					PackageRef.class,
-																					PackageRef.class,
+	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 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() {
-	}
+	public Analyzer() {}
 
 	/**
 	 * Specifically for Maven
 	 * 
-	 * @param properties the properties
+	 * @param properties
+	 *            the properties
 	 */
 
 	public static Properties getManifest(File dirOrJar) throws Exception {
@@ -280,7 +282,6 @@
 	}
 
 	/**
-	 * 
 	 * @return
 	 */
 	boolean isResourceOnly() {
@@ -306,9 +307,8 @@
 		boolean noExtraHeaders = "true".equalsIgnoreCase(getProperty(NOEXTRAHEADERS));
 
 		if (!noExtraHeaders) {
-			main.putValue(CREATED_BY,
-					System.getProperty("java.version") + " (" + System.getProperty("java.vendor")
-							+ ")");
+			main.putValue(CREATED_BY, System.getProperty("java.version") + " (" + System.getProperty("java.vendor")
+					+ ")");
 			main.putValue(TOOL, "Bnd-" + getBndVersion());
 			main.putValue(BND_LASTMODIFIED, "" + System.currentTimeMillis());
 		}
@@ -323,8 +323,7 @@
 		// Remove all the Java packages from the imports
 		if (!imports.isEmpty()) {
 			main.putValue(IMPORT_PACKAGE, printClauses(imports));
-		}
-		else {
+		} else {
 			main.remove(IMPORT_PACKAGE);
 		}
 
@@ -360,8 +359,7 @@
 				continue;
 			}
 
-			if (header.equals(BUNDLE_CLASSPATH) || header.equals(EXPORT_PACKAGE)
-					|| header.equals(IMPORT_PACKAGE))
+			if (header.equals(BUNDLE_CLASSPATH) || header.equals(EXPORT_PACKAGE) || header.equals(IMPORT_PACKAGE))
 				continue;
 
 			if (header.equalsIgnoreCase("Name")) {
@@ -374,14 +372,12 @@
 				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
-						if (value.trim().equals(EMPTY_HEADER))
-							main.putValue(header, "");
-						else
-							main.putValue(header, value);
+						main.putValue(header, value);
 				}
-			}
-			else {
+			} else {
 				// TODO should we report?
 			}
 		}
@@ -424,9 +420,7 @@
 
 	/**
 	 * Parse the namesection as instructions and then match them against the
-	 * current set of resources
-	 * 
-	 * For example:
+	 * current set of resources For example:
 	 * 
 	 * <pre>
 	 * 	-namesection: *;baz=true, abc/def/bar/X.class=3
@@ -435,7 +429,6 @@
 	 * 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) {
@@ -451,7 +444,7 @@
 		// 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()) {
+		for (Map.Entry<Instruction,Attrs> instr : instructions.entrySet()) {
 			boolean matched = false;
 
 			// For each instruction
@@ -480,7 +473,7 @@
 						// name section
 						//
 
-						for (Map.Entry<String, String> property : instr.getValue().entrySet()) {
+						for (Map.Entry<String,String> property : instr.getValue().entrySet()) {
 							setProperty("@", path);
 							try {
 								String processed = getReplacer().process(property.getValue());
@@ -496,8 +489,7 @@
 			}
 
 			if (!matched && resources.size() > 0)
-				warning("The instruction %s in %s did not match any resources", instr.getKey(),
-						NAMESECTION);
+				warning("The instruction %s in %s did not match any resources", instr.getKey(), NAMESECTION);
 		}
 
 	}
@@ -532,10 +524,8 @@
 				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);
+		} else {
+			warning("Invalid header (starts with @ but does not seem to be for the Name section): %s", header);
 		}
 	}
 
@@ -554,13 +544,11 @@
 			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;
 			}
-			else
-				if (value.endsWith(".bnd")) {
-					value = value.substring(0, value.length() - 4);
-					if (!value.startsWith(getBase().getName()))
-						value = projectName + "." + value;
-				}
 		}
 
 		if (value == null)
@@ -579,13 +567,14 @@
 	/**
 	 * Calculate an export header solely based on the contents of a JAR file
 	 * 
-	 * @param bundle The jar file to analyze
+	 * @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();
+		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/"))
@@ -644,7 +633,7 @@
 		return unreachable;
 	}
 
-	public MultiMap<PackageRef, PackageRef> getUses() {
+	public MultiMap<PackageRef,PackageRef> getUses() {
 		return uses;
 	}
 
@@ -663,6 +652,7 @@
 			return Long.parseLong(time);
 		}
 		catch (Exception e) {
+			// Ignore
 		}
 		return 0;
 	}
@@ -693,7 +683,8 @@
 	 * Merge the existing manifest with the instructions but do not override
 	 * existing properties.
 	 * 
-	 * @param manifest The manifest to merge with
+	 * @param manifest
+	 *            The manifest to merge with
 	 * @throws IOException
 	 */
 	public void mergeManifest(Manifest manifest) throws IOException {
@@ -729,8 +720,7 @@
 			if (classpath[i].exists()) {
 				Jar current = new Jar(classpath[i]);
 				list.add(current);
-			}
-			else {
+			} else {
 				error("Missing file on classpath: %s", classpath[i]);
 			}
 		}
@@ -799,8 +789,10 @@
 	 * 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
+	 * @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) {
@@ -856,15 +848,13 @@
 	}
 
 	/**
-	 * 
 	 * @param manifests
 	 * @throws Exception
 	 */
-	private void merge(Manifest result, Manifest old) throws IOException {
+	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();
+			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"))
@@ -874,11 +864,10 @@
 			}
 
 			// 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();
+			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());
 				}
@@ -891,7 +880,8 @@
 	 * 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.
+	 * @param properties
+	 *            Properties to verify.
 	 */
 
 	void verifyManifestHeadersCase(Properties properties) {
@@ -910,26 +900,21 @@
 	/**
 	 * 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 ...
-	 * 
+	 * 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) {
 
@@ -1003,7 +988,7 @@
 
 	public boolean referred(PackageRef packageName) {
 		// return true;
-		for (Map.Entry<PackageRef, List<PackageRef>> contained : uses.entrySet()) {
+		for (Map.Entry<PackageRef,List<PackageRef>> contained : uses.entrySet()) {
 			if (!contained.getKey().equals(packageName)) {
 				if (contained.getValue().contains(packageName))
 					return true;
@@ -1013,7 +998,6 @@
 	}
 
 	/**
-	 * 
 	 * @param jar
 	 */
 	private void getExternalExports(Jar jar, Packages classpathExports) {
@@ -1022,7 +1006,7 @@
 			if (m != null) {
 				Domain domain = Domain.domain(m);
 				Parameters exported = domain.getExportPackage();
-				for (Entry<String, Attrs> e : exported.entrySet()) {
+				for (Entry<String,Attrs> e : exported.entrySet()) {
 					PackageRef ref = getPackageRef(e.getKey());
 					if (!classpathExports.containsKey(ref)) {
 						// TODO e.getValue().put(SOURCE_DIRECTIVE,
@@ -1055,8 +1039,7 @@
 			setProperty(CURRENT_PACKAGE, packageName);
 			try {
 				Attrs importAttributes = imports.get(packageRef);
-				Attrs exportAttributes = exports.get(packageRef,
-						classpathExports.get(packageRef, new Attrs()));
+				Attrs exportAttributes = exports.get(packageRef, classpathExports.get(packageRef, new Attrs()));
 
 				String exportVersion = exportAttributes.getVersion();
 				String importRange = importAttributes.getVersion();
@@ -1064,8 +1047,7 @@
 				if (exportVersion == null) {
 					// TODO Should check if the source is from a bundle.
 
-				}
-				else {
+				} else {
 
 					//
 					// Version Policy - Import version substitution. We
@@ -1076,8 +1058,7 @@
 					//
 
 					boolean provider = isTrue(importAttributes.get(PROVIDE_DIRECTIVE))
-							|| isTrue(exportAttributes.get(PROVIDE_DIRECTIVE))
-							|| provided.contains(packageRef);
+							|| isTrue(exportAttributes.get(PROVIDE_DIRECTIVE)) || provided.contains(packageRef);
 
 					exportVersion = cleanupVersion(exportVersion);
 
@@ -1087,8 +1068,7 @@
 						if (importRange != null) {
 							importRange = cleanupVersion(importRange);
 							importRange = getReplacer().process(importRange);
-						}
-						else
+						} else
 							importRange = getVersionPolicy(provider);
 
 					}
@@ -1180,7 +1160,7 @@
 				if (exporterAttributes == null)
 					continue;
 
-				for (Map.Entry<String, String> entry : exporterAttributes.entrySet()) {
+				for (Map.Entry<String,String> entry : exporterAttributes.entrySet()) {
 					String key = entry.getKey();
 					if (key.equalsIgnoreCase(SPECIFICATION_VERSION))
 						key = VERSION_ATTRIBUTE;
@@ -1202,9 +1182,7 @@
 	}
 
 	/**
-	 * Fixup Attributes
-	 * 
-	 * Execute any macros on an export and
+	 * Fixup Attributes Execute any macros on an export and
 	 */
 
 	void fixupAttributes(Attrs attributes) {
@@ -1236,7 +1214,7 @@
 		}
 
 		// Remove any ! valued attributes
-		for (Iterator<Entry<String, String>> i = attributes.entrySet().iterator(); i.hasNext();) {
+		for (Iterator<Entry<String,String>> i = attributes.entrySet().iterator(); i.hasNext();) {
 			String v = i.next().getValue();
 			if (v.equals("!"))
 				i.remove();
@@ -1246,8 +1224,10 @@
 	/**
 	 * Calculate a version from a version policy.
 	 * 
-	 * @param version The actual exported version
-	 * @param impl true for implementations and false for clients
+	 * @param version
+	 *            The actual exported version
+	 * @param impl
+	 *            true for implementations and false for clients
 	 */
 
 	String calculateVersionRange(String version, boolean impl) {
@@ -1267,7 +1247,7 @@
 	 * @param uses
 	 * @throws MojoExecutionException
 	 */
-	void doUses(Packages exports, MultiMap<PackageRef, PackageRef> uses, Packages imports) {
+	void doUses(Packages exports, MultiMap<PackageRef,PackageRef> uses, Packages imports) {
 		if ("true".equalsIgnoreCase(getProperty(NOUSES)))
 			return;
 
@@ -1291,8 +1271,8 @@
 	 * @param uses
 	 * @param imports
 	 */
-	protected void doUses(PackageRef packageRef, Packages exports,
-			MultiMap<PackageRef, PackageRef> uses, Packages 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
@@ -1328,12 +1308,10 @@
 				setProperty(CURRENT_USES, sb.toString());
 				override = getReplacer().process(override);
 				unsetProperty(CURRENT_USES);
-			}
-			else
+			} else
 				// This is for backward compatibility 0.0.287
 				// can be deprecated over time
-				override = override.replaceAll(USES_USES, Matcher.quoteReplacement(sb.toString()))
-						.trim();
+				override = override.replaceAll(USES_USES, Matcher.quoteReplacement(sb.toString())).trim();
 
 			if (override.endsWith(","))
 				override = override.substring(0, override.length() - 1);
@@ -1374,8 +1352,7 @@
 	 * @param value
 	 * @throws Exception
 	 */
-	void setPackageInfo(PackageRef packageRef, Resource r, Packages classpathExports)
-			throws Exception {
+	void setPackageInfo(PackageRef packageRef, Resource r, Packages classpathExports) throws Exception {
 		if (r == null)
 			return;
 
@@ -1418,18 +1395,15 @@
 			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("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();
+				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 %d%n", name, dir.size());
+					} else {
 						out.printf("                                      %-30s <<empty>>%n", name);
 					}
 				}
@@ -1449,9 +1423,8 @@
 
 	/**
 	 * Findpath looks through the contents of the JAR and finds paths that end
-	 * with the given regular expression
-	 * 
-	 * ${findpath (; reg-expr (; replacement)? )? }
+	 * with the given regular expression ${findpath (; reg-expr (; replacement)?
+	 * )? }
 	 * 
 	 * @param args
 	 * @return
@@ -1466,8 +1439,8 @@
 
 	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)? )? }");
+			warning("Invalid nr of arguments to " + name + " " + Arrays.asList(args) + ", syntax: ${" + name
+					+ " (; reg-expr (; replacement)? )? }");
 			return null;
 		}
 
@@ -1507,9 +1480,9 @@
 		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();
+	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());
 		}
@@ -1544,15 +1517,12 @@
 		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
-				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);
+				error("Cannot convert to JAR to add to classpath %s. Not a File, Jar, or String", jar);
 		}
 	}
 
@@ -1577,8 +1547,7 @@
 
 		if (bcp.isEmpty()) {
 			analyzeJar(dot, "", true);
-		}
-		else {
+		} else {
 			boolean okToIncludeDirs = true;
 
 			for (String path : bcp.keySet()) {
@@ -1613,8 +1582,7 @@
 					catch (Exception e) {
 						warning("Invalid bundle classpath entry: " + path + " " + e);
 					}
-				}
-				else {
+				} 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
@@ -1623,8 +1591,7 @@
 							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 {
+					} else {
 						if (!"optional".equals(info.get(RESOLUTION_DIRECTIVE)))
 							warning("No sub JAR or directory " + path);
 					}
@@ -1646,7 +1613,7 @@
 	 * @throws IOException
 	 */
 	private boolean analyzeJar(Jar jar, String prefix, boolean okToIncludeDirs) throws Exception {
-		Map<String, Clazz> mismatched = new HashMap<String, Clazz>();
+		Map<String,Clazz> mismatched = new HashMap<String,Clazz>();
 
 		next: for (String path : jar.getResources().keySet()) {
 			if (path.startsWith(prefix)) {
@@ -1668,8 +1635,7 @@
 						// we found a class since the bcp has a tendency
 						// to overlap
 						if (!packageRef.isMetaData()) {
-							Resource pinfo = jar.getResource(prefix + packageRef.getPath()
-									+ "/packageinfo");
+							Resource pinfo = jar.getResource(prefix + packageRef.getPath() + "/packageinfo");
 							setPackageInfo(packageRef, pinfo, classpathExports);
 						}
 					}
@@ -1690,8 +1656,7 @@
 								// package-info can contain an Export annotation
 								info = new Attrs();
 								parsePackageInfoClass(clazz, info);
-							}
-							else {
+							} else {
 								// Otherwise we just parse it simply
 								clazz.parseClassFile();
 							}
@@ -1712,16 +1677,14 @@
 						// warning
 						if (okToIncludeDirs) // assume already reported
 							mismatched.put(clazz.getAbsolutePath(), clazz);
-					}
-					else {
+					} 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");
+								Resource pinfo = jar.getResource(prefix + packageRef.getPath() + "/packageinfo");
 								setPackageInfo(packageRef, pinfo, classpathExports);
 							}
 						}
@@ -1767,92 +1730,87 @@
 							if (Verifier.VERSION.matcher(version).matches())
 								info.put(VERSION_ATTRIBUTE, version);
 							else
-								error("Export annotation in %s has invalid version info: %s",
-										clazz, version);
+								error("Export annotation in %s has invalid version info: %s", clazz, version);
 						}
-					}
-					else {
+					} 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());
+								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())) {
+				} 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 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 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) {
+					// 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(use);
+								sb.append(m.group(2));
 								del = ",";
 							}
-							info.put(USES_DIRECTIVE, sb.toString());
 						}
+						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());
+					}
+				}
 			}
 
 		});
@@ -1866,14 +1824,11 @@
 	 * @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	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*");
@@ -1893,49 +1848,47 @@
 			String suffix = m.group(4);
 			return prefix + cleanupVersion(first) + "," + cleanupVersion(last) + suffix;
 		}
-		else {
-			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) {
+		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(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
+						result.append(micro);
 						if (qualifier != null) {
-							result.append(".0.0.");
+							result.append(".");
 							cleanupModifier(result, qualifier);
 						}
-					return result.toString();
+					} 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 (group != null && n < group.length() - 1 && group.charAt(n) == '0')
+		while (n < group.length() - 1 && group.charAt(n) == '0')
 			n++;
 		if (n == 0)
 			return group;
@@ -1950,8 +1903,7 @@
 
 		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 == '-')
+			if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')
 				result.append(c);
 		}
 	}
@@ -1972,17 +1924,16 @@
 
 			return getProperty(VERSIONPOLICY, DEFAULT_PROVIDER_POLICY);
 		}
-		else {
-			String s = getProperty(CONSUMER_POLICY);
-			if (s != null)
-				return s;
+		String s = getProperty(CONSUMER_POLICY);
+		if (s != null)
+			return s;
 
-			s = getProperty(VERSIONPOLICY_USES);
-			if (s != null)
-				return s;
+		s = getProperty(VERSIONPOLICY_USES);
+		if (s != null)
+			return s;
 
-			return getProperty(VERSIONPOLICY, DEFAULT_CONSUMER_POLICY);
-		}
+		return getProperty(VERSIONPOLICY, DEFAULT_CONSUMER_POLICY);
+
 		// String vp = implemented ? getProperty(VERSIONPOLICY_IMPL) :
 		// getProperty(VERSIONPOLICY_USES);
 		//
@@ -2019,24 +1970,21 @@
 		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);
+				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";
+			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);
+				throw new IllegalArgumentException("${classes} has invalid type: " + typeName + ". " + _classesHelp);
 
 			Instruction instr = null;
 			if (Clazz.HAS_ARGUMENT.contains(type)) {
@@ -2058,9 +2006,7 @@
 	 */
 
 	public String _exporters(String args[]) throws Exception {
-		Macro.verifyCommand(
-				args,
-				"${exporters;<packagename>}, returns the list of jars that export the given package",
+		Macro.verifyCommand(args, "${exporters;<packagename>}, returns the list of jars that export the given package",
 				null, 2, 2);
 		StringBuilder sb = new StringBuilder();
 		String del = "";
@@ -2074,14 +2020,15 @@
 		return sb.toString();
 	}
 
-	public Map<TypeRef, Clazz> getClassspace() {
+	public Map<TypeRef,Clazz> getClassspace() {
 		return classspace;
 	}
 
 	/**
 	 * Locate a resource on the class path.
 	 * 
-	 * @param path Path of the reosurce
+	 * @param path
+	 *            Path of the reosurce
 	 * @return A resource or <code>null</code>
 	 */
 	public Resource findResource(String path) {
@@ -2158,7 +2105,7 @@
 		if (require == null || require.isEmpty())
 			return;
 
-		Hashtable<String, String> map = new Hashtable<String, String>();
+		Hashtable<String,String> map = new Hashtable<String,String>();
 		map.put(Constants.VERSION_FILTER, getBndVersion());
 
 		for (String filter : require.keySet()) {
@@ -2181,8 +2128,9 @@
 	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);
+		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]);
@@ -2193,8 +2141,8 @@
 		boolean hex = args.length > 2 && args[2].equals("hex");
 		if (hex)
 			return Hex.toHexString(digester.digest().digest());
-		else
-			return Base64.encodeBase64(digester.digest().digest());
+
+		return Base64.encodeBase64(digester.digest().digest());
 	}
 
 	/**
@@ -2204,8 +2152,9 @@
 	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);
+		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)
@@ -2248,7 +2197,6 @@
 	 * 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
@@ -2263,10 +2211,10 @@
 	 * </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
-	 * 
+	 * @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
 	 */
 
@@ -2319,8 +2267,7 @@
 			// doing and inserted a literal. So
 			// we ignore any not matched literals
 			if (instruction.isLiteral()) {
-				result.merge(getPackageRef(instruction.getLiteral()), true,
-						instructions.get(instruction));
+				result.merge(getPackageRef(instruction.getLiteral()), true, instructions.get(instruction));
 				i.remove();
 				continue;
 			}
@@ -2379,7 +2326,8 @@
 	 * Untitled-[n]
 	 * </pre>
 	 * 
-	 * @param output may be null, otherwise a file path relative to base
+	 * @param output
+	 *            may be null, otherwise a file path relative to base
 	 */
 	public File getOutputFile(String output) {
 
@@ -2394,16 +2342,14 @@
 				outputDir = outputFile;
 			else
 				return outputFile;
-		}
-		else
+		} 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;
+			String outputName = bsn + "-" + v.getWithoutQualifier() + Constants.DEFAULT_JAR_EXTENSION;
 			return new File(outputDir, outputName);
 		}
 
@@ -2413,8 +2359,7 @@
 			return new File(outputDir, outputName);
 		}
 
-		error("Cannot establish an output name from %s, nor bsn, nor source file name, using Untitled",
-				output);
+		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()) {
@@ -2428,9 +2373,11 @@
 	 * 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
+	 * @param output
+	 *            the output file, if null {@link #getOutputFile(String)} is
+	 *            used.
+	 * @param force
+	 *            if it needs to be overwritten
 	 * @throws Exception
 	 */
 
@@ -2441,8 +2388,8 @@
 		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());
+		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();
@@ -2450,8 +2397,7 @@
 				File bak = new File(source.getParentFile(), source.getName() + ".bak");
 				if (!source.renameTo(bak)) {
 					error("Could not create backup file %s", bak);
-				}
-				else
+				} else
 					source.delete();
 			}
 			try {
@@ -2464,10 +2410,9 @@
 			}
 			return true;
 		}
-		else {
-			trace("Not modified %s", output);
-			return false;
-		}
+		trace("Not modified %s", output);
+		return false;
+
 	}
 
 	/**
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/AnalyzerMessages.java b/bundleplugin/src/main/java/aQute/lib/osgi/AnalyzerMessages.java
new file mode 100644
index 0000000..3efea0a
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/AnalyzerMessages.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) OSGi Alliance (2012). All Rights Reserved.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+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
index 86f8caa..cafe0e3 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Annotation.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Annotation.java
@@ -6,16 +6,16 @@
 import aQute.bnd.annotation.metatype.*;
 import aQute.lib.osgi.Descriptors.TypeRef;
 
-@SuppressWarnings("unchecked") public class Annotation {
+@SuppressWarnings("unchecked")
+public class Annotation {
 	TypeRef				name;
-	Map<String, Object>	elements;
+	Map<String,Object>	elements;
 	ElementType			member;
 	RetentionPolicy		policy;
 
-	public 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)
+		if (elements == null)
 			this.elements = Collections.emptyMap();
 		else
 			this.elements = elements;
@@ -30,11 +30,11 @@
 	public ElementType getElementType() {
 		return member;
 	}
-	
+
 	public RetentionPolicy getRetentionPolicy() {
 		return policy;
 	}
-	
+
 	public String toString() {
 		return name + ":" + member + ":" + policy + ":" + elements;
 	}
@@ -56,19 +56,20 @@
 	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 {
+
+	public <T extends java.lang.annotation.Annotation> T getAnnotation(Class<T> c) throws Exception {
 		String cname = name.getFQN();
-		if ( ! c.getName().equals(cname))
+		if (!c.getName().equals(cname))
 			return null;
-		return Configurable.createConfigurable(c, elements );
+		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
index 3126056..58d112d 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Builder.java
@@ -23,19 +23,14 @@
 import aQute.libg.header.*;
 
 /**
- * Include-Resource: ( [name '=' ] file )+
- * 
- * Private-Package: package-decl ( ',' package-decl )*
- * 
- * Export-Package: package-decl ( ',' package-decl )*
- * 
+ * 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*([^}!]+).*");
+	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;
@@ -50,8 +45,7 @@
 		super(parent);
 	}
 
-	public Builder() {
-	}
+	public Builder() {}
 
 	public Jar build() throws Exception {
 		trace("build");
@@ -60,8 +54,7 @@
 			return null;
 
 		if (getProperty(CONDUIT) != null)
-			error("Specified " + CONDUIT
-					+ " but calls build() instead of builds() (might be a programmer error");
+			error("Specified " + CONDUIT + " but calls build() instead of builds() (might be a programmer error");
 
 		Jar dot = new Jar("dot");
 		try {
@@ -77,6 +70,8 @@
 		doIncludeResources(dot);
 		doWab(dot);
 
+		doBndInfo(dot);
+
 		// Check if we override the calculation of the
 		// manifest. We still need to calculated it because
 		// we need to have analyzed the classpath.
@@ -95,8 +90,7 @@
 				catch (Exception e) {
 					error(MANIFEST + " while reading manifest file", e);
 				}
-			}
-			else {
+			} else {
 				error(MANIFEST + ", no such file " + mf);
 			}
 		}
@@ -133,6 +127,21 @@
 	}
 
 	/**
+	 * Make sure any bnd.info files are properly processed
+	 * 
+	 * @param jar
+	 */
+
+	private void doBndInfo(Jar jar) {
+		for (Entry<String,Resource> e : jar.getResources().entrySet()) {
+			if (e.getKey().endsWith("/bnd.info")) {
+				PreprocessResource pp = new PreprocessResource(this, e.getValue());
+				e.setValue(pp);
+			}
+		}
+	}
+
+	/**
 	 * Check if we need to calculate any checksums.
 	 * 
 	 * @param dot
@@ -215,16 +224,14 @@
 				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 {
+						warning("Invalid Class-Path entry %s in %s, must exist and must reside in same directory", sub,
+								f);
+					} else {
 						addWabLib(dot, sub);
 					}
 				}
 			}
-		}
-		else {
+		} else {
 			error("WAB lib does not exist %s", f);
 		}
 	}
@@ -255,14 +262,11 @@
 		changedFile(f);
 	}
 
-	protected void changedFile(File f) {
-	}
+	protected void changedFile(File f) {}
 
 	/**
-	 * Sign the jar file.
-	 * 
-	 * -sign : <alias> [ ';' 'password:=' <password> ] [ ';' 'keystore:='
-	 * <keystore> ] [ ';' 'sign-password:=' <pw> ] ( ',' ... )*
+	 * Sign the jar file. -sign : <alias> [ ';' 'password:=' <password> ] [ ';'
+	 * 'keystore:=' <keystore> ] [ ';' 'sign-password:=' <pw> ] ( ',' ... )*
 	 * 
 	 * @return
 	 */
@@ -276,7 +280,7 @@
 		List<SignerPlugin> signers = getPlugins(SignerPlugin.class);
 
 		Parameters infos = parseHeader(signing);
-		for (Entry<String, Attrs> entry : infos.entrySet()) {
+		for (Entry<String,Attrs> entry : infos.entrySet()) {
 			for (SignerPlugin signer : signers) {
 				signer.sign(this, entry.getKey());
 			}
@@ -303,7 +307,7 @@
 		addClose(jar);
 		for (PackageRef pref : referred) {
 			for (Jar cpe : getClasspath()) {
-				Map<String, Resource> map = cpe.getDirectories().get(pref.getPath());
+				Map<String,Resource> map = cpe.getDirectories().get(pref.getPath());
 				if (map != null) {
 					jar.addDirectory(map, false);
 					break;
@@ -335,7 +339,7 @@
 	}
 
 	public void cleanupVersion(Packages packages, String defaultVersion) {
-		for (Map.Entry<PackageRef, Attrs> entry : packages.entrySet()) {
+		for (Map.Entry<PackageRef,Attrs> entry : packages.entrySet()) {
 			Attrs attributes = entry.getValue();
 			String v = attributes.get(Constants.VERSION_ATTRIBUTE);
 			if (v == null && defaultVersion != null) {
@@ -343,8 +347,7 @@
 					v = defaultVersion;
 					if (isPedantic())
 						warning("Used bundle version %s for exported package %s", v, entry.getKey());
-				}
-				else {
+				} else {
 					if (isPedantic())
 						warning("No export version for exported package %s", entry.getKey());
 				}
@@ -369,8 +372,9 @@
 			String packagePath = packageRef.getPath();
 
 			boolean found = false;
-			String[] fixed = {"packageinfo", "package.html", "module-info.java",
-					"package-info.java"};
+			String[] fixed = {
+					"packageinfo", "package.html", "module-info.java", "package-info.java"
+			};
 
 			for (Iterator<File> i = getSourcePath().iterator(); i.hasNext();) {
 				File root = i.next();
@@ -401,8 +405,7 @@
 					Resource resource = jar.getResource(sourcePath);
 					if (resource != null) {
 						dot.putResource("OSGI-OPT/src/" + sourcePath, resource);
-					}
-					else {
+					} else {
 						resource = jar.getResource("OSGI-OPT/src/" + sourcePath);
 						if (resource != null) {
 							dot.putResource("OSGI-OPT/src/" + sourcePath, resource);
@@ -411,8 +414,7 @@
 				}
 			}
 			if (getSourcePath().isEmpty())
-				warning("Including sources but " + SOURCEPATH
-						+ " does not contain any source directories ");
+				warning("Including sources but " + SOURCEPATH + " does not contain any source directories ");
 			// TODO copy from the jars where they came from
 		}
 	}
@@ -432,8 +434,7 @@
 						File f = getFile(file);
 						if (!f.isDirectory()) {
 							error("Adding a sourcepath that is not a directory: " + f);
-						}
-						else {
+						} else {
 							sourcePath.add(f);
 						}
 					}
@@ -451,13 +452,13 @@
 		getInfo(verifier);
 	}
 
-	private void doExpand(Jar dot) throws IOException {
+	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>();
+		MultiMap<String,Jar> packages = new MultiMap<String,Jar>();
 		for (Jar srce : getClasspath()) {
-			for (Entry<String, Map<String, Resource>> e : srce.getDirectories().entrySet()) {
+			for (Entry<String,Map<String,Resource>> e : srce.getDirectories().entrySet()) {
 				if (e.getValue() != null)
 					packages.add(e.getKey(), srce);
 			}
@@ -474,8 +475,7 @@
 			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);
+				warning("Unused Private-Package instructions, no such package(s) on the class path: %s", unused);
 			}
 		}
 
@@ -500,10 +500,10 @@
 	 * @param name
 	 * @param instructions
 	 */
-	private Set<Instruction> doExpand(Jar jar, MultiMap<String, Jar> index, Instructions filter) {
+	private Set<Instruction> doExpand(Jar jar, MultiMap<String,Jar> index, Instructions filter) {
 		Set<Instruction> unused = Create.set();
 
-		for (Entry<Instruction, Attrs> e : filter.entrySet()) {
+		for (Entry<Instruction,Attrs> e : filter.entrySet()) {
 			Instruction instruction = e.getKey();
 			if (instruction.isDuplicate())
 				continue;
@@ -518,9 +518,8 @@
 
 			boolean used = false;
 
-			for (Iterator<Entry<String, List<Jar>>> entry = index.entrySet().iterator(); entry
-					.hasNext();) {
-				Entry<String, List<Jar>> p = entry.next();
+			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);
@@ -626,14 +625,9 @@
 	private void copy(Jar dest, Jar srce, String path, boolean overwrite) {
 		dest.copy(srce, path, overwrite);
 
-		String key = path + "/bnd.info";
-		Resource r = dest.getResource(key);
-		if (r != null)
-			dest.putResource(key, new PreprocessResource(this, r));
-
 		if (hasSources()) {
 			String srcPath = "OSGI-OPT/src/" + path;
-			Map<String, Resource> srcContents = srce.getDirectories().get(srcPath);
+			Map<String,Resource> srcContents = srce.getDirectories().get(srcPath);
 			if (srcContents != null) {
 				dest.addDirectory(srcContents, overwrite);
 			}
@@ -680,16 +674,19 @@
 	/**
 	 * 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.
+	 * @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()) {
+	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
@@ -728,8 +725,7 @@
 			includes = getProperty(INCLUDERESOURCE);
 			if (includes == null || includes.length() == 0)
 				includes = getProperty("Include-Resource");
-		}
-		else
+		} else
 			warning("Please use -includeresource instead of Bundle-Includes");
 
 		doIncludeResource(jar, includes);
@@ -741,15 +737,14 @@
 		doIncludeResource(jar, clauses);
 	}
 
-	private void doIncludeResource(Jar jar, Parameters clauses) throws ZipException, IOException,
-			Exception {
-		for (Entry<String, Attrs> entry : clauses.entrySet()) {
+	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 {
+	private void doIncludeResource(Jar jar, String name, Map<String,String> extra) throws ZipException, IOException,
+			Exception {
 
 		boolean preprocess = false;
 		boolean absentIsOk = false;
@@ -771,56 +766,47 @@
 		}
 
 		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);
+			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];
 			}
-			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;
+			// Handle directories
+			if (sourceFile.isDirectory()) {
+				destinationPath = doResourceDirectory(jar, extra, preprocess, sourceFile, destinationPath);
+				return;
+			}
 
-					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);
 
-					// destinationPath = checkDestinationPath(destinationPath);
+			if (!sourceFile.exists()) {
+				if (absentIsOk)
+					return;
 
-					if (!sourceFile.exists()) {
-						if (absentIsOk)
-							return;
-
-						noSuchFile(jar, name, extra, source, destinationPath);
-					}
-					else
-						copy(jar, destinationPath, sourceFile, preprocess, extra);
-				}
+				noSuchFile(jar, name, extra, source, destinationPath);
+			} else
+				copy(jar, destinationPath, sourceFile, preprocess, extra);
+		}
 	}
 
 	/**
@@ -831,13 +817,10 @@
 	 * {@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.
+	 * 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
@@ -846,8 +829,8 @@
 	 * @param preprocess
 	 * @param absentIsOk
 	 */
-	private void doCommand(Jar jar, String source, String destination, Map<String, String> extra,
-			boolean preprocess, boolean 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;
@@ -857,10 +840,9 @@
 		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
+				error("Include-Resource.cmd for %s, requires %s, but no such file %s", source, required,
+						file.getAbsoluteFile());
+			} else
 				lastModified = Math.max(lastModified, file.lastModified());
 		}
 
@@ -874,7 +856,7 @@
 			cr = new CombinedResource();
 		}
 		trace("last modified requires %s", lastModified);
-		
+
 		for (String item : items) {
 			setProperty("@", item);
 			try {
@@ -883,7 +865,7 @@
 				File file = getFile(item);
 
 				Resource r = new CommandResource(command, this, Math.max(lastModified,
-						file.exists() ? file.lastModified():0L));
+						file.exists() ? file.lastModified() : 0L));
 
 				if (preprocess)
 					r = new PreprocessResource(this, r);
@@ -897,15 +879,15 @@
 				unsetProperty("@");
 			}
 		}
-		
+
 		// Add last so the correct modification date is used
 		// to update the modified time.
-		if ( cr != null)
+		if (cr != null)
 			jar.putResource(destination, cr);
 	}
 
-	private String doResourceDirectory(Jar jar, Map<String, String> extra, boolean preprocess,
-			File sourceFile, String destinationPath) throws Exception {
+	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;
@@ -917,22 +899,21 @@
 		Instruction.Filter iFilter = null;
 		if (filter != null) {
 			iFilter = new Instruction.Filter(new Instruction(filter), recursive, getDoNotCopy());
-		}
-		else {
+		} else {
 			iFilter = new Instruction.Filter(null, recursive, getDoNotCopy());
 		}
 
-		Map<String, File> files = newMap();
+		Map<String,File> files = newMap();
 		resolveFiles(sourceFile, iFilter, recursive, destinationPath, files, flatten);
 
-		for (Map.Entry<String, File> entry : files.entrySet()) {
+		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) {
+	private void resolveFiles(File dir, FileFilter filter, boolean recursive, String path, Map<String,File> files,
+			boolean flatten) {
 
 		if (doNotCopy(dir.getName())) {
 			return;
@@ -951,8 +932,7 @@
 					resolveFiles(file, filter, recursive, nextPath, files, flatten);
 				}
 				// Directories are ignored otherwise
-			}
-			else {
+			} else {
 				String p = appendPath(path, file.getName());
 				if (files.containsKey(p))
 					warning("Include-Resource overwrites entry %s from file %s", p, file);
@@ -961,8 +941,8 @@
 		}
 	}
 
-	private void noSuchFile(Jar jar, String clause, Map<String, String> extra, String source,
-			String destinationPath) throws Exception {
+	private void noSuchFile(Jar jar, 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
@@ -970,16 +950,14 @@
 			src.setDoNotTouchManifest();
 			JarResource jarResource = new JarResource(src);
 			jar.putResource(destinationPath, jarResource);
-		}
-		else {
+		} 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
+			} else
 				error("Input file does not exist: " + source);
 		}
 	}
@@ -994,8 +972,8 @@
 	 * @throws ZipException
 	 * @throws IOException
 	 */
-	private void extractFromJar(Jar jar, String source, String destination, boolean absentIsOk)
-			throws ZipException, 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
@@ -1018,8 +996,7 @@
 				return;
 
 			error("Can not find JAR file " + source);
-		}
-		else {
+		} else {
 			addAll(jar, sub, instr, destination);
 		}
 	}
@@ -1027,8 +1004,10 @@
 	/**
 	 * 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
+	 * @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, "");
@@ -1037,8 +1016,10 @@
 	/**
 	 * 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
+	 * @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;
@@ -1047,14 +1028,12 @@
 				continue;
 
 			if (filter == null || filter.matches(name) != filter.isNegated())
-				dupl |= to.putResource(Processor.appendPath(destination, name),
-						sub.getResource(name), true);
+				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 {
+	private void copy(Jar jar, String path, File from, boolean preprocess, Map<String,String> extra) throws Exception {
 		if (doNotCopy(from.getName()))
 			return;
 
@@ -1064,8 +1043,7 @@
 			for (int i = 0; i < files.length; i++) {
 				copy(jar, appendPath(path, files[i].getName()), files[i], preprocess, extra);
 			}
-		}
-		else {
+		} else {
 			if (from.exists()) {
 				Resource resource = new FileResource(from);
 				if (preprocess) {
@@ -1081,8 +1059,7 @@
 				if (isTrue(extra.get(LIB_DIRECTIVE))) {
 					setProperty(BUNDLE_CLASSPATH, append(getProperty(BUNDLE_CLASSPATH), path));
 				}
-			}
-			else {
+			} else {
 				error("Input file does not exist: " + from);
 			}
 		}
@@ -1242,16 +1219,15 @@
 	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]);
-			}
+		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[]) throws IOException {
+	public String _permissions(String args[]) {
 		StringBuilder sb = new StringBuilder();
 
 		for (String arg : args) {
@@ -1268,16 +1244,12 @@
 					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
-				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);
+				error("Invalid option in ${permissions}: %s", arg);
 		}
 		return sb.toString();
 	}
@@ -1293,7 +1265,7 @@
 	/**
 	 * 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-Pacakge or Private-Package
+	 * file it is on the class path and the Export-Package or Private-Package
 	 * include this resource.
 	 * 
 	 * @param f
@@ -1303,8 +1275,7 @@
 		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")));
+			clauses.putAll(parseHeader(getProperty(Constants.TESTPACKAGES, "test;presence:=optional")));
 		}
 
 		Collection<String> ir = getIncludedResourcePrefixes();
@@ -1313,7 +1284,12 @@
 
 		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)
@@ -1340,7 +1316,7 @@
 	private Collection<String> getIncludedResourcePrefixes() {
 		List<String> prefixes = new ArrayList<String>();
 		Parameters includeResource = getIncludeResource();
-		for (Entry<String, Attrs> p : includeResource.entrySet()) {
+		for (Entry<String,Attrs> p : includeResource.entrySet()) {
 			if (p.getValue().containsKey("literal"))
 				continue;
 
@@ -1354,19 +1330,26 @@
 	}
 
 	/**
-	 * Answer the string of the resource that it has in the container.
+	 * 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
+	 * @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
@@ -1381,11 +1364,9 @@
 	}
 
 	/**
-	 * 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.
+	 * 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) {
@@ -1442,7 +1423,7 @@
 		if (tree == null)
 			tree = differ.tree(this);
 
-		for (Entry<String, Attrs> entry : diffs.entrySet()) {
+		for (Entry<String,Attrs> entry : diffs.entrySet()) {
 			String path = entry.getKey();
 			File file = getFile(path);
 			if (!file.isFile()) {
@@ -1470,11 +1451,9 @@
 								error("Differ %s", p);
 						else {
 							if (warning)
-								warning("Diff found a difference in %s for packages %s", file,
-										instructions);
+								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);
+								error("Diff found a difference in %s for packages %s", file, instructions);
 							show(p, "", warning);
 						}
 					}
@@ -1529,7 +1508,7 @@
 
 		Baseline baseline = new Baseline(this, differ);
 
-		for (Entry<String, Attrs> entry : diffs.entrySet()) {
+		for (Entry<String,Attrs> entry : diffs.entrySet()) {
 			String path = entry.getKey();
 			File file = getFile(path);
 			if (!file.isFile()) {
@@ -1540,9 +1519,8 @@
 			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,
+					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);
 				}
 			}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/BundleId.java b/bundleplugin/src/main/java/aQute/lib/osgi/BundleId.java
index e500e53..87fc25f 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/BundleId.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/BundleId.java
@@ -1,9 +1,7 @@
 package aQute.lib.osgi;
 
-
 /**
  * Holds the bundle bsn + version pair
- * 
  */
 public class BundleId implements Comparable<BundleId> {
 	final String	bsn;
@@ -29,16 +27,16 @@
 	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)
+		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
index c878665..7c3d759 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/ClassDataCollector.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/ClassDataCollector.java
@@ -3,89 +3,81 @@
 import aQute.lib.osgi.Descriptors.TypeRef;
 
 public class ClassDataCollector {
-    public void classBegin(int access, TypeRef name) {
-    }
+	public void classBegin(int access, TypeRef name) {}
 
-    public boolean classStart(int access, TypeRef className) {
-        classBegin(access,className);
-        return true;
-    }
+	public boolean classStart(int access, TypeRef className) {
+		classBegin(access, className);
+		return true;
+	}
 
-    public void extendsClass(TypeRef zuper) throws Exception {
-    }
+	public void extendsClass(TypeRef zuper) throws Exception {}
 
-    public void implementsInterfaces(TypeRef[] interfaces) throws Exception {
-    }
+	public void implementsInterfaces(TypeRef[] interfaces) throws Exception {}
 
-    public void addReference(TypeRef ref) {
-    }
+	public void addReference(TypeRef ref) {}
 
-    public void annotation(Annotation annotation) {
-    }
+	public void annotation(Annotation annotation) {}
 
-    public void parameter(int p) {
-    }
+	public void parameter(int p) {}
 
-    public void method(Clazz.MethodDef defined) {
-    }
+	public void method(Clazz.MethodDef defined) {}
 
-    public void field(Clazz.FieldDef defined) {
-    }
+	public void field(Clazz.FieldDef defined) {}
 
-    public void reference(Clazz.MethodDef referenced) {
-    }
+	public void reference(Clazz.MethodDef referenced) {}
 
-    public void reference(Clazz.FieldDef referenced) {
-    }
+	public void reference(Clazz.FieldDef referenced) {}
 
-    public void classEnd() throws Exception {
-    }
+	public void classEnd() throws Exception {}
 
-    public void deprecated() 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
-     */
+	/**
+	 * 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 
+	 * @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,
-			int innerClassAccessFlags) throws Exception {		
-	}
+	public void innerClass(TypeRef innerClass, TypeRef outerClass, String innerName, int innerClassAccessFlags)
+			throws Exception {}
 
-	public void signature(String signature) {
-	}
+	public void signature(String signature) {}
 
-	public void constant(Object object) {
-	}
+	public void constant(Object object) {}
 
-	public void memberEnd() {
-	}
+	public void memberEnd() {}
 
 	public void version(int minor, int major) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	public void referenceMethod(int access, TypeRef className, String method, 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
index e182e1f..d54b084 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Clazz.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Clazz.java
@@ -87,10 +87,8 @@
 
 	}
 
-	public final static EnumSet<QUERY>	HAS_ARGUMENT	= EnumSet.of(QUERY.IMPLEMENTS,
-																QUERY.EXTENDS, QUERY.IMPORTS,
-																QUERY.NAMED, QUERY.VERSION,
-																QUERY.ANNOTATED);
+	public final static EnumSet<QUERY>	HAS_ARGUMENT	= EnumSet.of(QUERY.IMPLEMENTS, QUERY.EXTENDS, QUERY.IMPORTS,
+																QUERY.NAMED, QUERY.VERSION, QUERY.ANNOTATED);
 
 	/**
 	 * <pre>
@@ -106,29 +104,29 @@
 	 * 
 	 * @param mod
 	 */
-	final static int					ACC_PUBLIC		= 0x0001;					// Declared
+	final static int					ACC_PUBLIC		= 0x0001;												// Declared
 	// public;
 	// may
 	// be
 	// accessed
 	// from outside its package.
-	final static int					ACC_FINAL		= 0x0010;					// Declared
+	final static int					ACC_FINAL		= 0x0010;												// Declared
 	// final;
 	// no
 	// subclasses
 	// allowed.
-	final static int					ACC_SUPER		= 0x0020;					// Treat
+	final static int					ACC_SUPER		= 0x0020;												// Treat
 	// superclass
 	// methods
 	// specially when invoked by the
 	// invokespecial instruction.
-	final static int					ACC_INTERFACE	= 0x0200;					// Is
+	final static int					ACC_INTERFACE	= 0x0200;												// Is
 	// an
 	// interface,
 	// not
 	// a
 	// classs
-	final static int					ACC_ABSTRACT	= 0x0400;					// Declared
+	final static int					ACC_ABSTRACT	= 0x0400;												// Declared
 
 	// a thing not in the source code
 	final static int					ACC_SYNTHETIC	= 0x1000;
@@ -303,7 +301,7 @@
 	}
 
 	final static byte	SkipTable[]	= { //
-									0, // 0 non existent
+			0, // 0 non existent
 			-1, // 1 CONSTANT_utf8 UTF 8, handled in
 			// method
 			-1, // 2
@@ -371,7 +369,8 @@
 		InputStream in = resource.openInputStream();
 		try {
 			return parseClassFile(in, cd);
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 	}
@@ -381,7 +380,8 @@
 		try {
 			this.cd = cd;
 			return parseClassFile(din);
-		} finally {
+		}
+		finally {
 			cd = null;
 			din.close();
 		}
@@ -409,59 +409,59 @@
 		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 0 :
+					break process;
+				case 1 :
+					constantUtf8(in, poolIndex);
+					break;
 
-			case 3:
-				constantInteger(in, poolIndex);
-				break;
+				case 3 :
+					constantInteger(in, poolIndex);
+					break;
 
-			case 4:
-				constantFloat(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;
+				// 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 6 :
+					constantDouble(in, poolIndex);
+					poolIndex++;
+					break;
 
-			case 7:
-				constantClass(in, poolIndex);
-				break;
+				case 7 :
+					constantClass(in, poolIndex);
+					break;
 
-			case 8:
-				constantString(in, poolIndex);
-				break;
+				case 8 :
+					constantString(in, poolIndex);
+					break;
 
-			case 10: // Method ref
-			case 11: // Interface Method ref
-				methodRef(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;
+				// 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;
+				// 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;
 			}
 		}
 
@@ -499,8 +499,7 @@
 			if (interfacesCount > 0) {
 				interfaces = new TypeRef[interfacesCount];
 				for (int i = 0; i < interfacesCount; i++)
-					interfaces[i] = analyzer.getTypeRef((String) pool[intPool[in
-							.readUnsignedShort()]]);
+					interfaces[i] = analyzer.getTypeRef((String) pool[intPool[in.readUnsignedShort()]]);
 				if (cd != null)
 					cd.implementsInterfaces(interfaces);
 			}
@@ -526,8 +525,7 @@
 					crawl = true;
 				}
 				if (cd != null)
-					cd.field(last = new FieldDef(access_flags, name, pool[descriptor_index]
-							.toString()));
+					cd.field(last = new FieldDef(access_flags, name, pool[descriptor_index].toString()));
 				descriptors.add(Integer.valueOf(descriptor_index));
 				doAttributes(in, ElementType.FIELD, false);
 			}
@@ -539,24 +537,21 @@
 			// 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;");
+				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 )
+			if (major >= JAVA.OpenJDK7.major)
 				crawl = false;
 
 			//
@@ -614,7 +609,8 @@
 			Set<TypeRef> xref = this.xref;
 			reset();
 			return xref;
-		} finally {
+		}
+		finally {
 			if (cd != null)
 				cd.classEnd();
 		}
@@ -633,8 +629,7 @@
 			pool[poolIndex] = intPool[poolIndex];
 	}
 
-	protected void pool(Object[] pool, int[] intPool) {
-	}
+	protected void pool(Object[] pool, int[] intPool) {}
 
 	/**
 	 * @param in
@@ -762,8 +757,7 @@
 	 *            The stream
 	 * @throws Exception
 	 */
-	private void doAttributes(DataInputStream in, ElementType member, boolean crawl)
-			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
@@ -778,8 +772,7 @@
 	 *            the data stream
 	 * @throws Exception
 	 */
-	private void doAttribute(DataInputStream in, ElementType member, boolean crawl)
-			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();
@@ -825,7 +818,6 @@
 	 * }
 	 * </pre>
 	 * 
-	 * 
 	 * @param in
 	 * @throws IOException
 	 */
@@ -996,83 +988,84 @@
 		while (bb.remaining() > 0) {
 			int instruction = 0xFF & bb.get();
 			switch (instruction) {
-			case OpCodes.ldc:
-				lastReference = 0xFF & bb.get();
-				break;
+				case OpCodes.ldc :
+					lastReference = 0xFF & bb.get();
+					break;
 
-			case OpCodes.ldc_w:
-				lastReference = 0xFFFF & bb.getShort();
-				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.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.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.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);
+				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);
+					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;
-			}
+					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;
 
-			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]);
+				default :
+					lastReference = -1;
+					bb.position(bb.position() + OpCodes.OFFSETS[instruction]);
 			}
 		}
 	}
@@ -1082,8 +1075,8 @@
 		this.sourceFile = pool[sourcefile_index].toString();
 	}
 
-	private void doParameterAnnotations(DataInputStream in, ElementType member,
-			RetentionPolicy policy) throws IOException {
+	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)
@@ -1092,8 +1085,7 @@
 		}
 	}
 
-	private void doAnnotations(DataInputStream in, ElementType member, RetentionPolicy policy)
-			throws IOException {
+	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)
@@ -1105,8 +1097,8 @@
 		}
 	}
 
-	private Annotation doAnnotation(DataInputStream in, ElementType member, RetentionPolicy policy,
-			boolean collect) throws IOException {
+	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>();
@@ -1122,14 +1114,14 @@
 		}
 		TypeRef name = analyzer.getTypeRef((String) pool[type_index]);
 		int num_element_value_pairs = in.readUnsignedShort();
-		Map<String, Object> elements = null;
+		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 = new LinkedHashMap<String,Object>();
 				elements.put(element, value);
 			}
 		}
@@ -1139,56 +1131,54 @@
 			return null;
 	}
 
-	private Object doElementValue(DataInputStream in, ElementType member, RetentionPolicy policy,
-			boolean collect) throws IOException {
+	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 '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 '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 '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 '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 '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 '@' : // 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;
+			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);
+			default :
+				throw new IllegalArgumentException("Invalid value for Annotation ElementValue tag " + tag);
 		}
 	}
 
@@ -1213,9 +1203,7 @@
 
 	/**
 	 * This method parses a descriptor and adds the package of the descriptor to
-	 * the referenced packages.
-	 * 
-	 * The syntax of the descriptor is:
+	 * the referenced packages. The syntax of the descriptor is:
 	 * 
 	 * <pre>
 	 *   descriptor ::= ( '(' reference * ')' )? reference
@@ -1363,17 +1351,12 @@
 	}
 
 	/**
-	 * .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.
+	 * .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.
 	 */
@@ -1388,65 +1371,65 @@
 
 	public boolean is(QUERY query, Instruction instr, Analyzer analyzer) throws Exception {
 		switch (query) {
-		case ANY:
-			return true;
+			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()))
+			case NAMED :
+				if (instr.matches(getClassName().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)
+			case VERSION :
+				String v = major + "." + minor;
+				if (instr.matches(v))
+					return !instr.isNegated();
 				return false;
 
-			for (TypeRef annotation : annotations) {
-				if (instr.matches(annotation.getFQN()))
+			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;
 
-			return false;
+			case PUBLIC :
+				return Modifier.isPublic(accessx);
 
-		case RUNTIMEANNOTATIONS:
-			return hasClassAnnotations;
-		case CLASSANNOTATIONS:
-			return hasClassAnnotations;
+			case CONCRETE :
+				return !Modifier.isAbstract(accessx);
 
-		case ABSTRACT:
-			return Modifier.isAbstract(accessx);
+			case ANNOTATED :
+				if (annotations == null)
+					return false;
 
-		case IMPORTS:
-			for (PackageRef imp : imports) {
-				if (instr.matches(imp.getFQN()))
-					return !instr.isNegated();
-			}
+				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)
@@ -1465,12 +1448,11 @@
 
 	/**
 	 * Called when crawling the byte code and a method reference is found
-	 * 
 	 */
 	void getMethodDef(int access, int methodRefPoolIndex) {
-		if ( methodRefPoolIndex == 0)
+		if (methodRefPoolIndex == 0)
 			return;
-		
+
 		Object o = pool[methodRefPoolIndex];
 		if (o != null && o instanceof Assoc) {
 			Assoc assoc = (Assoc) o;
@@ -1493,8 +1475,7 @@
 				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");
+			throw new IllegalArgumentException("Invalid class file (or parsing is wrong), Not an assoc at a method ref");
 	}
 
 	public boolean isPublic() {
@@ -1519,26 +1500,26 @@
 			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)) + "[]";
+			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);
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/CombinedResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/CombinedResource.java
index e8566db..d76b695 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/CombinedResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/CombinedResource.java
@@ -14,16 +14,15 @@
  * limitations under the License.
  */
 
-
 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;
-	
+	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) {
@@ -31,7 +30,7 @@
 				// Ignore
 			}
 		};
-		for ( Resource r : resources ) {
+		for (Resource r : resources) {
 			r.write(unclosable);
 			unclosable.flush();
 		}
@@ -47,5 +46,4 @@
 		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
index c9e3c8a..0fa43fe 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/CommandResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/CommandResource.java
@@ -14,7 +14,6 @@
  * limitations under the License.
  */
 
-
 package aQute.lib.osgi;
 
 import java.io.*;
@@ -22,10 +21,10 @@
 import aQute.libg.command.*;
 
 public class CommandResource extends WriteResource {
-	final long lastModified;
-	final Builder domain;
-	final String command;
-	
+	final long		lastModified;
+	final Builder	domain;
+	final String	command;
+
 	public CommandResource(String command, Builder domain, long lastModified) {
 		this.lastModified = lastModified;
 		this.domain = domain;
@@ -38,25 +37,26 @@
 		StringBuilder stdout = new StringBuilder();
 		try {
 			domain.trace("executing command %s", command);
-			Command cmd = new Command("sh -l");
+			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("\\s*,\\s*", File.pathSeparator);
 				path = path.replaceAll("\\$\\{@\\}", oldpath);
 				cmd.var("PATH", path);
 				domain.trace("PATH: %s", path);
 			}
 			OutputStreamWriter osw = new OutputStreamWriter(out);
-			int result = cmd.execute(command,stdout, errors);
+			int result = cmd.execute(command, stdout, errors);
 			osw.append(stdout);
 			osw.flush();
-			if ( result != 0) {
+			if (result != 0) {
 				domain.error("executing command failed %s %s", command, stdout + "\n" + errors);
 			}
-		} catch( Exception e) {
+		}
+		catch (Exception e) {
 			domain.error("executing command failed %s %s", command, e.getMessage());
 		}
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java b/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
index 8df703f..df0bbf0 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Constants.java
@@ -12,294 +12,293 @@
 	 * @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							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";
-	String								SIGNATURE_TEST								= "-signaturetest";
+	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";
+	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							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							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";
 	@Deprecated
-	String								NOPE										= "-nope";
-	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								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							NOPE										= "-nope";
+	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							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";
 	@Deprecated
-	String								VERSIONPOLICY_IMPL							= "-versionpolicy-impl";
+	String							VERSIONPOLICY_IMPL							= "-versionpolicy-impl";
 	@Deprecated
-	String								VERSIONPOLICY_USES							= "-versionpolicy-uses";
-	String								PROVIDER_POLICY								= "-provider-policy";
-	String								CONSUMER_POLICY								= "-consumer-policy";
+	String							VERSIONPOLICY_USES							= "-versionpolicy-uses";
+	String							PROVIDER_POLICY								= "-provider-policy";
+	String							CONSUMER_POLICY								= "-consumer-policy";
 	@Deprecated
-	String								VERSIONPOLICY								= "-versionpolicy";
-	String								WAB											= "-wab";
-	String								WABLIB										= "-wablib";
-	String								REQUIRE_BND									= "-require-bnd";
+	String							VERSIONPOLICY								= "-versionpolicy";
+	String							WAB											= "-wab";
+	String							WABLIB										= "-wablib";
+	String							REQUIRE_BND									= "-require-bnd";
 
 	// Deprecated
-	String								CLASSPATH									= "-classpath";
-	String								OUTPUT										= "-output";
+	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				};
+	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		};
+	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:";
+	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							KEYSTORE_LOCATION_DIRECTIVE					= "keystore:";
+	String							KEYSTORE_PROVIDER_DIRECTIVE					= "provider:";
+	String							KEYSTORE_PASSWORD_DIRECTIVE					= "password:";
+	String							SIGN_PASSWORD_DIRECTIVE						= "sign-password:";
 
-	String								NONE										= "none";
+	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
+	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
-																					};
+																				// TODO
+																				};
 
-	String								USES_USES									= "<<USES>>";
-	String								CURRENT_USES								= "@uses";
-	String								IMPORT_REFERENCE							= "reference";
-	String								IMPORT_PRIVATE								= "private";
-	String[]							importDirectives							= {
-			IMPORT_REFERENCE, IMPORT_PRIVATE										};
+	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)");
+	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							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							CURRENT_VERSION								= "@";
+	String							CURRENT_PACKAGE								= "@package";
 
-	String								BUILDFILES									= "buildfiles";
+	String							BUILDFILES									= "buildfiles";
 
-	String								EMPTY_HEADER								= "<<EMPTY>>";
+	String							EMPTY_HEADER								= "<<EMPTY>>";
 
-	String								EMBEDDED_REPO								= "/embedded-repo.jar";
-	String								LAUNCHER_PLUGIN								= "Launcher-Plugin";
-	String								TESTER_PLUGIN								= "Tester-Plugin";
+	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_LAUNCHER_BSN						= "biz.aQute.launcher";
+	String							DEFAULT_TESTER_BSN							= "biz.aQute.junit";
 
-	String								DEFAULT_DO_NOT_COPY							= "CVS|\\.svn|\\.git|\\.DS_Store";
+	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:";
+	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:";
+	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:";
+	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();
+	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 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					= 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));
+	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
index 366ca57..c15e436 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Descriptors.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Descriptors.java
@@ -5,30 +5,29 @@
 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();
+	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	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);
 
+	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>{
+	public interface TypeRef extends Comparable<TypeRef> {
 		String getBinary();
 
 		String getFQN();
@@ -55,7 +54,7 @@
 
 	}
 
-	public static class PackageRef implements Comparable<PackageRef>{
+	public static class PackageRef implements Comparable<PackageRef> {
 		final String	binaryName;
 		final String	fqn;
 		final boolean	java;
@@ -63,21 +62,23 @@
 		private PackageRef(String binaryName) {
 			this.binaryName = fqnToBinary(binaryName);
 			this.fqn = binaryToFQN(binaryName);
-			this.java = this.fqn.startsWith("java.") ; // && !this.fqn.equals("java.sql)"
-			
+			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??
 		}
 
 		private PackageRef() {
 			this.binaryName = "";
-			this.fqn=".";
+			this.fqn = ".";
 			this.java = false;
 		}
 
 		public PackageRef getDuplicate() {
-			return new PackageRef(binaryName+Constants.DUPLICATE_MARKER);
+			return new PackageRef(binaryName + Constants.DUPLICATE_MARKER);
 		}
+
 		public String getFQN() {
 			return fqn;
 		}
@@ -97,7 +98,7 @@
 		public String toString() {
 			return fqn;
 		}
-		
+
 		boolean isDefaultPackage() {
 			return this.fqn.equals(".");
 		}
@@ -109,16 +110,16 @@
 		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.
 		 * 
@@ -128,7 +129,7 @@
 		public boolean isMetaData() {
 			if (isDefaultPackage())
 				return true;
-			
+
 			for (int i = 0; i < Constants.METAPACKAGES.length; i++) {
 				if (fqn.startsWith(Constants.METAPACKAGES[i]))
 					return true;
@@ -146,7 +147,7 @@
 		final PackageRef	packageRef;
 
 		ConcreteRef(PackageRef packageRef, String binaryName) {
-			if ( packageRef.getFQN().length() < 2 )
+			if (packageRef.getFQN().length() < 2)
 				System.err.println("in default pack? " + binaryName);
 			this.binaryName = binaryName;
 			this.fqn = binaryToFQN(binaryName);
@@ -220,11 +221,11 @@
 		}
 
 		public int compareTo(TypeRef other) {
-			if ( this == other)
+			if (this == other)
 				return 0;
 			return fqn.compareTo(other.getFQN());
 		}
-		
+
 	}
 
 	private static class ArrayRef implements TypeRef {
@@ -249,7 +250,7 @@
 		public String getSourcePath() {
 			return component.getSourcePath();
 		}
-		
+
 		public boolean isPrimitive() {
 			return false;
 		}
@@ -294,17 +295,17 @@
 		}
 
 		public int compareTo(TypeRef other) {
-			if ( this == other)
+			if (this == other)
 				return 0;
-			
+
 			return getFQN().compareTo(other.getFQN());
 		}
 
 	}
 
-	public TypeRef getTypeRef(String binaryClassName) {		
+	public TypeRef getTypeRef(String binaryClassName) {
 		assert !binaryClassName.endsWith(".class");
-		
+
 		TypeRef ref = typeRefCache.get(binaryClassName);
 		if (ref != null)
 			return ref;
@@ -315,34 +316,34 @@
 		} 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;
+					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)
+			if (ref != null)
 				return ref;
-			
+
 			PackageRef pref;
 			int n = binaryClassName.lastIndexOf('/');
 			if (n < 0)
@@ -352,13 +353,13 @@
 
 			ref = new ConcreteRef(pref, binaryClassName);
 		}
-		
+
 		typeRefCache.put(binaryClassName, ref);
 		return ref;
 	}
 
 	public PackageRef getPackageRef(String binaryPackName) {
-		if (binaryPackName.indexOf('.') >= 0 ) {
+		if (binaryPackName.indexOf('.') >= 0) {
 			binaryPackName = binaryPackName.replace('.', '/');
 		}
 		PackageRef ref = packageCache.get(binaryPackName);
@@ -411,28 +412,28 @@
 			}
 
 			switch (c) {
-			case 'L':
-				while ((c = descriptor.charAt(index++)) != ';') {
-					// TODO
+				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;
+					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 + "]");
+				default :
+					throw new IllegalArgumentException("Invalid type in descriptor: " + c + " from " + descriptor + "["
+							+ index + "]");
 			}
 			types.add(getTypeRef(sb.toString()));
 			return index;
@@ -450,13 +451,11 @@
 			if (other == null || other.getClass() != getClass())
 				return false;
 
-			return Arrays.equals(prototype, ((Descriptor) other).prototype)
-					&& type == ((Descriptor) other).type;
+			return Arrays.equals(prototype, ((Descriptor) other).prototype) && type == ((Descriptor) other).type;
 		}
 
 		public int hashCode() {
-			return prototype == null ? type.hashCode() : type.hashCode()
-					^ Arrays.hashCode(prototype);
+			return prototype == null ? type.hashCode() : type.hashCode() ^ Arrays.hashCode(prototype);
 		}
 
 		public String toString() {
@@ -470,7 +469,7 @@
 
 	public static String getShortName(String fqn) {
 		assert fqn.indexOf('/') < 0;
-		
+
 		int n = fqn.lastIndexOf('.');
 		if (n >= 0) {
 			return fqn.substring(n + 1);
@@ -480,10 +479,10 @@
 
 	public static String binaryToFQN(String binary) {
 		StringBuilder sb = new StringBuilder();
-		for ( int i=0, l=binary.length(); i<l; i++) {
+		for (int i = 0, l = binary.length(); i < l; i++) {
 			char c = binary.charAt(i);
-			
-			if ( c == '/')
+
+			if (c == '/')
 				sb.append('.');
 			else
 				sb.append(c);
@@ -514,35 +513,35 @@
 	}
 
 	public TypeRef getTypeRefFromFQN(String fqn) {
-		if ( fqn.equals("boolean"))
+		if (fqn.equals("boolean"))
 			return BOOLEAN;
-		
-		if ( fqn.equals("byte"))
+
+		if (fqn.equals("byte"))
 			return BOOLEAN;
-		
-		if ( fqn.equals("char"))
+
+		if (fqn.equals("char"))
 			return CHAR;
-		
-		if ( fqn.equals("short"))
+
+		if (fqn.equals("short"))
 			return SHORT;
-		
-		if ( fqn.equals("int"))
+
+		if (fqn.equals("int"))
 			return INTEGER;
-		
-		if ( fqn.equals("long"))
+
+		if (fqn.equals("long"))
 			return LONG;
-		
-		if ( fqn.equals("float"))
+
+		if (fqn.equals("float"))
 			return FLOAT;
-		
-		if ( fqn.equals("double"))
+
+		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));
+		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
index b6ef379..f520378 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Domain.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Domain.java
@@ -13,7 +13,6 @@
  * 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> {
 
@@ -38,15 +37,18 @@
 	public static Domain domain(final Attributes attrs) {
 		return new Domain() {
 
-			@Override public String get(String key) {
+			@Override
+			public String get(String key) {
 				return attrs.getValue(key);
 			}
 
-			@Override public void set(String key, String value) {
+			@Override
+			public void set(String key, String value) {
 				attrs.putValue(key, value);
 			}
 
-			@Override public Iterator<String> iterator() {
+			@Override
+			public Iterator<String> iterator() {
 				final Iterator<Object> it = attrs.keySet().iterator();
 
 				return new Iterator<String>() {
@@ -70,19 +72,23 @@
 	public static Domain domain(final Processor processor) {
 		return new Domain() {
 
-			@Override public String get(String key) {
+			@Override
+			public String get(String key) {
 				return processor.getProperty(key);
 			}
 
-			@Override public String get(String key, String deflt) {
+			@Override
+			public String get(String key, String deflt) {
 				return processor.getProperty(key, deflt);
 			}
 
-			@Override public void set(String key, String value) {
+			@Override
+			public void set(String key, String value) {
 				processor.setProperty(key, value);
 			}
 
-			@Override public Iterator<String> iterator() {
+			@Override
+			public Iterator<String> iterator() {
 				final Iterator<String> it = processor.getPropertyKeys(true).iterator();
 
 				return new Iterator<String>() {
@@ -104,18 +110,21 @@
 		};
 	}
 
-	public static Domain domain(final Map<String, String> map) {
+	public static Domain domain(final Map<String,String> map) {
 		return new Domain() {
 
-			@Override public String get(String key) {
+			@Override
+			public String get(String key) {
 				return map.get(key);
 			}
 
-			@Override public void set(String key, String value) {
+			@Override
+			public void set(String key, String value) {
 				map.put(key, value);
 			}
 
-			@Override public Iterator<String> iterator() {
+			@Override
+			public Iterator<String> iterator() {
 				return map.keySet().iterator();
 			}
 		};
@@ -155,7 +164,7 @@
 
 	public Parameters getIncludeResource() {
 		Parameters ic = getParameters(INCLUDE_RESOURCE);
-		ic.putAll( getParameters(INCLUDERESOURCE));
+		ic.putAll(getParameters(INCLUDERESOURCE));
 		return ic;
 	}
 
@@ -232,24 +241,24 @@
 	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());
+		set(BUNDLE_VERSION, v.toString());
 	}
 
 	public void setBundleVersion(Version version) {
-		set(BUNDLE_VERSION,version.toString());
+		set(BUNDLE_VERSION, version.toString());
 	}
 
 	public void setFailOk(boolean b) {
-		set(FAIL_OK, 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
index ebc93ee..3aff084 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/EmbeddedResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/EmbeddedResource.java
@@ -75,7 +75,8 @@
 		InputStream in = resource.openInputStream();
 		try {
 			build(sub, in, resource.lastModified());
-		} catch( Exception e ) {
+		}
+		catch (Exception e) {
 			e.printStackTrace();
 		}
 		finally {
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/FileResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/FileResource.java
index b849878..4d2459d 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/FileResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/FileResource.java
@@ -6,7 +6,7 @@
 public class FileResource implements Resource {
 	File	file;
 	String	extra;
-	
+
 	public FileResource(File file) {
 		this.file = file;
 	}
@@ -16,11 +16,7 @@
 	}
 
 	public static void build(Jar jar, File directory, Pattern doNotCopy) {
-		traverse(
-				jar,
-				directory.getAbsolutePath().length(),
-				directory,
-				doNotCopy);
+		traverse(jar, directory.getAbsolutePath().length(), directory, doNotCopy);
 	}
 
 	public String toString() {
@@ -31,8 +27,7 @@
 		copy(this, out);
 	}
 
-	static synchronized void copy(Resource resource, OutputStream out)
-			throws Exception {
+	static synchronized void copy(Resource resource, OutputStream out) throws Exception {
 		InputStream in = resource.openInputStream();
 		try {
 			byte buffer[] = new byte[20000];
@@ -47,19 +42,17 @@
 		}
 	}
 
-	static void traverse(Jar jar, int rootlength, File directory,
-			Pattern doNotCopy) {
+	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);
+				String path = files[i].getAbsolutePath().substring(rootlength + 1);
 				if (File.separatorChar != '/')
 					path = path.replace(File.separatorChar, '/');
 				jar.putResource(path, new FileResource(files[i]), true);
@@ -78,8 +71,8 @@
 	public void setExtra(String extra) {
 		this.extra = extra;
 	}
-	
+
 	public long size() {
-	    return (int) file.length();
+		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
index 9263e3c..c92de90 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Instruction.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Instruction.java
@@ -60,8 +60,7 @@
 		if (s.startsWith("!")) {
 			negated = true;
 			s = s.substring(1);
-		}
-		else
+		} else
 			negated = false;
 
 		if (input.equals("*")) {
@@ -75,8 +74,7 @@
 		if (s.startsWith("=")) {
 			match = s.substring(1);
 			literal = true;
-		}
-		else {
+		} else {
 			boolean wildcards = false;
 
 			StringBuilder sb = new StringBuilder();
@@ -90,8 +88,7 @@
 							sb.append("(\\..*)?");
 							wildcards = true;
 							break loop;
-						}
-						else
+						} else
 							sb.append("\\.");
 
 						break;
@@ -119,8 +116,7 @@
 			if (!wildcards) {
 				literal = true;
 				match = s;
-			}
-			else {
+			} else {
 				literal = false;
 				match = sb.toString();
 			}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Instructions.java b/bundleplugin/src/main/java/aQute/lib/osgi/Instructions.java
index e74150c..679c374 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Instructions.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Instructions.java
@@ -4,25 +4,24 @@
 
 import aQute.libg.header.*;
 
-public class Instructions implements Map<Instruction, Attrs> {
-	private LinkedHashMap<Instruction, Attrs>	map;
-	static Map<Instruction, Attrs>				EMPTY	= Collections.emptyMap();
+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);
+			map = new LinkedHashMap<Instruction,Attrs>(other.map);
 		}
 	}
 
 	public Instructions(Collection<String> other) {
-		if ( other != null)
-			for ( String s : other  ) {
-				put( new Instruction(s), null);
+		if (other != null)
+			for (String s : other) {
+				put(new Instruction(s), null);
 			}
 	}
 
-	public Instructions() {
-	}
+	public Instructions() {}
 
 	public Instructions(Parameters contained) {
 		append(contained);
@@ -43,7 +42,8 @@
 		return map.containsKey(name);
 	}
 
-	@Deprecated public boolean containsKey(Object name) {
+	@Deprecated
+	public boolean containsKey(Object name) {
 		assert name instanceof Instruction;
 		if (map == null)
 			return false;
@@ -58,7 +58,8 @@
 		return map.containsValue(value);
 	}
 
-	@Deprecated public boolean containsValue(Object value) {
+	@Deprecated
+	public boolean containsValue(Object value) {
 		assert value instanceof Attrs;
 		if (map == null)
 			return false;
@@ -66,14 +67,15 @@
 		return map.containsValue((Attrs) value);
 	}
 
-	public Set<java.util.Map.Entry<Instruction, Attrs>> entrySet() {
+	public Set<java.util.Map.Entry<Instruction,Attrs>> entrySet() {
 		if (map == null)
 			return EMPTY.entrySet();
 
 		return map.entrySet();
 	}
 
-	@Deprecated public Attrs get(Object key) {
+	@Deprecated
+	public Attrs get(Object key) {
 		assert key instanceof Instruction;
 		if (map == null)
 			return null;
@@ -101,21 +103,22 @@
 
 	public Attrs put(Instruction key, Attrs value) {
 		if (map == null)
-			map = new LinkedHashMap<Instruction, Attrs>();
+			map = new LinkedHashMap<Instruction,Attrs>();
 
 		return map.put(key, value);
 	}
 
-	public void putAll(Map<? extends Instruction, ? extends Attrs> map) {
+	public void putAll(Map< ? extends Instruction, ? extends Attrs> map) {
 		if (this.map == null)
 			if (map.isEmpty())
 				return;
 			else
-				this.map = new LinkedHashMap<Instruction, Attrs>();
+				this.map = new LinkedHashMap<Instruction,Attrs>();
 		this.map.putAll(map);
 	}
 
-	@Deprecated public Attrs remove(Object var0) {
+	@Deprecated
+	public Attrs remove(Object var0) {
 		assert var0 instanceof Instruction;
 		if (map == null)
 			return null;
@@ -147,19 +150,20 @@
 	}
 
 	public void append(Parameters other) {
-		for (Map.Entry<String, Attrs> e : other.entrySet()) {
-			put( new Instruction(e.getKey()), e.getValue());
+		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);
+		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())
+		if (emptyIsAll && isEmpty())
 			return input;
-		
+
 		List<T> result = new ArrayList<T>();
 
 		for (Instruction instruction : keySet()) {
@@ -174,13 +178,12 @@
 					used = true;
 				}
 			}
-			if ( !used && unused != null)
+			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>();
@@ -195,22 +198,22 @@
 					o.remove();
 				} else
 					result.add(oo);
-					
+
 			}
 		}
 		return result;
 	}
 
 	public boolean matches(String value) {
-		if ( size() == 0)
+		if (size() == 0)
 			return true;
-		
-		for ( Instruction i : keySet()) {
-			if ( i.matches(value)) {
-				if ( i.isNegated())
-					return false;		// we deny this one explicitly
+
+		for (Instruction i : keySet()) {
+			if (i.matches(value)) {
+				if (i.isNegated())
+					return false; // we deny this one explicitly
 				else
-					return true;		// we allow it 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
index 497198b..032a7d1 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Jar.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Jar.java
@@ -18,21 +18,21 @@
 		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 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;
@@ -46,8 +46,7 @@
 		else if (dirOrFile.isFile()) {
 			zipFile = ZipResource.build(this, dirOrFile);
 		} else {
-			throw new IllegalArgumentException("A Jar can only accept a valid file or directory: "
-					+ dirOrFile);
+			throw new IllegalArgumentException("A Jar can only accept a valid file or directory: " + dirOrFile);
 		}
 	}
 
@@ -119,9 +118,9 @@
 				manifestFirst = true;
 		}
 		String dir = getDirectory(path);
-		Map<String, Resource> s = directories.get(dir);
+		Map<String,Resource> s = directories.get(dir);
 		if (s == null) {
-			s = new TreeMap<String, Resource>();
+			s = new TreeMap<String,Resource>();
 			directories.put(dir, s);
 			int n = dir.lastIndexOf('/');
 			while (n > 0) {
@@ -156,23 +155,23 @@
 		return path.substring(0, n);
 	}
 
-	public Map<String, Map<String, Resource>> getDirectories() {
+	public Map<String,Map<String,Resource>> getDirectories() {
 		check();
 		return directories;
 	}
 
-	public Map<String, Resource> getResources() {
+	public Map<String,Resource> getResources() {
 		check();
 		return resources;
 	}
 
-	public boolean addDirectory(Map<String, Resource> directory, boolean overwrite) {
+	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()) {
+		for (Map.Entry<String,Resource> entry : directory.entrySet()) {
 			String key = entry.getKey();
 			if (!key.endsWith(".java")) {
 				duplicates |= putResource(key, entry.getValue(), overwrite);
@@ -211,7 +210,8 @@
 		try {
 			Manifest m = new Manifest(fin);
 			setManifest(m);
-		} finally {
+		}
+		finally {
 			fin.close();
 		}
 	}
@@ -222,12 +222,14 @@
 			OutputStream out = new FileOutputStream(file);
 			try {
 				write(out);
-			} finally {
+			}
+			finally {
 				IO.close(out);
 			}
 			return;
 
-		} catch (Exception t) {
+		}
+		catch (Exception t) {
 			file.delete();
 			throw t;
 		}
@@ -240,16 +242,15 @@
 
 	public void write(OutputStream out) throws Exception {
 		check();
-		ZipOutputStream jout = nomanifest || doNotTouchManifest ? new ZipOutputStream(out)
-				: new JarOutputStream(out);
+		ZipOutputStream jout = nomanifest || doNotTouchManifest ? new ZipOutputStream(out) : new JarOutputStream(out);
 
 		switch (compression) {
-		case STORE:
-			jout.setMethod(ZipOutputStream.DEFLATED);
-			break;
+			case STORE :
+				jout.setMethod(ZipOutputStream.DEFLATED);
+				break;
 
-		default:
-			// default is DEFLATED
+			default :
+				// default is DEFLATED
 		}
 
 		Set<String> done = new HashSet<String>();
@@ -264,7 +265,7 @@
 		} else
 			doManifest(done, jout);
 
-		for (Map.Entry<String, Resource> entry : getResources().entrySet()) {
+		for (Map.Entry<String,Resource> entry : getResources().entrySet()) {
 			// Skip metainf contents
 			if (!done.contains(entry.getKey()))
 				writeResource(jout, directories, entry.getKey(), entry.getValue());
@@ -309,11 +310,8 @@
 	/**
 	 * 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
+	 * it makes the bytes platform dependent. So the following code outputs the
+	 * manifest. A Manifest consists of
 	 * 
 	 * <pre>
 	 *   'Manifest-Version: 1.0\r\n'
@@ -328,11 +326,12 @@
 	 * 
 	 * 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', ' ' };
+	static byte[]	CONTINUE	= new byte[] {
+			'\r', '\n', ' '
+								};
 
 	/**
 	 * Main function to output a manifest properly in UTF-8.
@@ -362,7 +361,6 @@
 
 	/**
 	 * 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 + ": ");
@@ -428,15 +426,15 @@
 	 *             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()) {
+		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()) {
+		for (Map.Entry<String,String> entry : map.entrySet()) {
 			writeEntry(out, entry.getKey(), entry.getValue());
 		}
 	}
@@ -444,7 +442,7 @@
 	private static Manifest clean(Manifest org) {
 
 		Manifest result = new Manifest();
-		for (Map.Entry<?, ?> entry : org.getMainAttributes().entrySet()) {
+		for (Map.Entry< ? , ? > entry : org.getMainAttributes().entrySet()) {
 			String nice = clean((String) entry.getValue());
 			result.getMainAttributes().put(entry.getKey(), nice);
 		}
@@ -455,7 +453,7 @@
 				result.getEntries().put(name, attrs);
 			}
 
-			for (Map.Entry<?, ?> entry : org.getAttributes(name).entrySet()) {
+			for (Map.Entry< ? , ? > entry : org.getAttributes(name).entrySet()) {
 				String nice = clean((String) entry.getValue());
 				attrs.put((Attributes.Name) entry.getKey(), nice);
 			}
@@ -475,8 +473,8 @@
 		return sb.toString();
 	}
 
-	private void writeResource(ZipOutputStream jout, Set<String> directories, String path,
-			Resource resource) throws Exception {
+	private void writeResource(ZipOutputStream jout, Set<String> directories, String path, Resource resource)
+			throws Exception {
 		if (resource == null)
 			return;
 		try {
@@ -493,13 +491,13 @@
 			jout.putNextEntry(ze);
 			resource.write(jout);
 			jout.closeEntry();
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			throw new Exception("Problem writing resource " + path, e);
 		}
 	}
 
-	void createDirectories(Set<String> directories, ZipOutputStream zip, String name)
-			throws IOException {
+	void createDirectories(Set<String> directories, ZipOutputStream zip, String name) throws IOException {
 		int index = name.lastIndexOf('/');
 		if (index > 0) {
 			String path = name.substring(0, index);
@@ -545,8 +543,7 @@
 				continue;
 
 			if (filter == null || filter.matches(name) != filter.isNegated())
-				dupl |= putResource(Processor.appendPath(destination, name), sub.getResource(name),
-						true);
+				dupl |= putResource(Processor.appendPath(destination, name), sub.getResource(name), true);
 		}
 		return dupl;
 	}
@@ -556,7 +553,8 @@
 		if (zipFile != null)
 			try {
 				zipFile.close();
-			} catch (IOException e) {
+			}
+			catch (IOException e) {
 				// Ignore
 			}
 		resources.clear();
@@ -589,7 +587,7 @@
 		check();
 		List<String> list = new ArrayList<String>(directories.size());
 
-		for (Map.Entry<String, Map<String, Resource>> i : directories.entrySet()) {
+		for (Map.Entry<String,Map<String,Resource>> i : directories.entrySet()) {
 			if (i.getValue() != null) {
 				String path = i.getKey();
 				String pack = path.replace('/', '.');
@@ -622,7 +620,7 @@
 		check();
 		Resource resource = resources.remove(path);
 		String dir = getDirectory(path);
-		Map<String, Resource> mdir = directories.get(dir);
+		Map<String,Resource> mdir = directories.get(dir);
 		// must be != null
 		mdir.remove(path);
 		return resource;
@@ -644,7 +642,9 @@
 	public void calcChecksums(String algorithms[]) throws Exception {
 		check();
 		if (algorithms == null)
-			algorithms = new String[] { "SHA", "MD5" };
+			algorithms = new String[] {
+					"SHA", "MD5"
+			};
 
 		Manifest m = getManifest();
 		if (m == null) {
@@ -659,7 +659,7 @@
 
 		byte buffer[] = new byte[30000];
 
-		for (Map.Entry<String, Resource> entry : resources.entrySet()) {
+		for (Map.Entry<String,Resource> entry : resources.entrySet()) {
 
 			// Skip the manifest
 			if (entry.getKey().equals("META-INF/MANIFEST.MF"))
@@ -681,7 +681,8 @@
 						d.update(buffer, 0, size);
 					size = in.read(buffer);
 				}
-			} finally {
+			}
+			finally {
 				in.close();
 			}
 			for (MessageDigest d : digests)
@@ -737,7 +738,7 @@
 			throw new IllegalArgumentException("Not a dir: " + dir.getAbsolutePath());
 		}
 
-		for (Map.Entry<String, Resource> entry : getResources().entrySet()) {
+		for (Map.Entry<String,Resource> entry : getResources().entrySet()) {
 			File f = getFile(dir, entry.getKey());
 			f.getParentFile().mkdirs();
 			IO.copy(entry.getValue().openInputStream(), f);
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/JarResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/JarResource.java
index 0c0adcd..c51aba3 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/JarResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/JarResource.java
@@ -17,7 +17,8 @@
 	public void write(OutputStream out) throws Exception {
 		try {
 			jar.write(out);
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			e.printStackTrace();
 			throw e;
 		}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java b/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
index 4ddd625..36c16dd 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Macro.java
@@ -17,17 +17,10 @@
  * 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.
+ * 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;
@@ -66,39 +59,32 @@
 					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;
+				}
 			}
-			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);
@@ -171,12 +157,10 @@
 				}
 				if (!flattening && !key.equals("@"))
 					domain.warning("No translation found for macro: " + key);
-			}
-			else {
+			} else {
 				domain.warning("Found empty macro key");
 			}
-		}
-		else {
+		} else {
 			domain.warning("Found null macro key");
 		}
 		return "${" + key + "}";
@@ -235,18 +219,20 @@
 		else {
 			String cname = "_" + method.replaceAll("-", "_");
 			try {
-				Method m = target.getClass().getMethod(cname, new Class[] {String[].class});
-				return (String) m.invoke(target, new Object[] {args});
+				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.error("%s, for cmd: %s, arguments; %s", e.getMessage(), method, Arrays.toString(args));
+				} else {
 					domain.warning("Exception in replace: " + e.getCause());
 					e.getCause().printStackTrace();
 				}
@@ -395,7 +381,6 @@
 	}
 
 	/**
-	 * 
 	 * replace ; <list> ; regex ; replace
 	 * 
 	 * @param args
@@ -453,16 +438,12 @@
 			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");
 			}
-			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, ",");
 	}
@@ -495,8 +476,7 @@
 		if (args.length < 2) {
 			domain.warning("Need at least one file name for ${dir;...}");
 			return null;
-		}
-		else {
+		} else {
 			String del = "";
 			StringBuilder sb = new StringBuilder();
 			for (int i = 1; i < args.length; i++) {
@@ -516,8 +496,7 @@
 		if (args.length < 2) {
 			domain.warning("Need at least one file name for ${basename;...}");
 			return null;
-		}
-		else {
+		} else {
 			String del = "";
 			StringBuilder sb = new StringBuilder();
 			for (int i = 1; i < args.length; i++) {
@@ -537,8 +516,7 @@
 		if (args.length < 2) {
 			domain.warning("Need at least one file name for ${isfile;...}");
 			return null;
-		}
-		else {
+		} else {
 			boolean isfile = true;
 			for (int i = 1; i < args.length; i++) {
 				File f = new File(args[i]).getAbsoluteFile();
@@ -553,8 +531,7 @@
 		if (args.length < 2) {
 			domain.warning("Need at least one file name for ${isdir;...}");
 			return null;
-		}
-		else {
+		} else {
 			boolean isdir = true;
 			for (int i = 1; i < args.length; i++) {
 				File f = new File(args[i]).getAbsoluteFile();
@@ -568,28 +545,33 @@
 	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) {
-				now = Long.parseLong(args[2]);
-				if (args.length > 3) {
-					domain.warning("Too many arguments for tstamp: " + Arrays.toString(args));
-				}
-			}
 		}
+		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>)*}
+	 * against the given directory ${lsr;<dir>;<list>(;<list>)*}
+	 * ${lsa;<dir>;<list>(;<list>)*}
 	 * 
 	 * @author aqute
-	 * 
 	 */
 
 	public String _lsr(String args[]) {
@@ -602,22 +584,18 @@
 
 	String ls(String args[], boolean relative) {
 		if (args.length < 2)
-			throw new IllegalArgumentException(
-					"the ${ls} macro must at least have a directory as parameter");
+			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);
+			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);
+			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);
+					"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()));
 
@@ -652,9 +630,6 @@
 	 * version=&quot;[${version;==;${@}},${version;=+;${@}})&quot;
 	 * </pre>
 	 * 
-	 * 
-	 * 
-	 * 
 	 * @param args
 	 * @return
 	 */
@@ -662,9 +637,10 @@
 	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};
+														+ "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);
@@ -699,26 +675,23 @@
 			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);
 				}
-				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 = ".";
@@ -741,12 +714,14 @@
 	 * @return
 	 */
 
-	static Pattern	RANGE_MASK		= Pattern.compile("(\\[|\\()(" + MASK_STRING + "),("
-											+ MASK_STRING + ")(\\]|\\))");
+	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};
+											+ "M ::= '+' | '-' | MQ\n"
+											+ "MQ ::= '~' | '='";
+	static Pattern	_rangePattern[]	= new Pattern[] {
+			null, RANGE_MASK
+									};
 
 	public String _range(String args[]) {
 		verifyCommand(args, _rangeHelp, _rangePattern, 2, 3);
@@ -780,8 +755,7 @@
 		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);
+			domain.error("${range} macro created an invalid range %s from %s and mask %s", s, version, spec);
 		}
 		return sb.toString();
 	}
@@ -861,43 +835,36 @@
 		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;
 		}
-		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[], String help, Pattern[] patterns, int low,
-			int high) {
+	public static void verifyCommand(String args[], 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());
-					}
+		} 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 = "${";
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/OpCodes.java b/bundleplugin/src/main/java/aQute/lib/osgi/OpCodes.java
index f0d3134..17b6d2b 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/OpCodes.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/OpCodes.java
@@ -1,51 +1,58 @@
 package aQute.lib.osgi;
 
 public class OpCodes {
-	final static short	nop				= 0x00;			// [No change] performs
-														// no
+	final static short	nop				= 0x00;			// [No change]
+															// performs
+															// no
 	// operation
-	final static short	aconst_null		= 0x01;			// ? null pushes a null
+	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
+	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
+															// value 0
 	// onto the stack
 	final static short	iconst_1		= 0x04;			// ? 1 loads the int
-														// value 1
+															// value 1
 	// onto the stack
 	final static short	iconst_2		= 0x05;			// ? 2 loads the int
-														// value 2
+															// value 2
 	// onto the stack
 	final static short	iconst_3		= 0x06;			// ? 3 loads the int
-														// value 3
+															// value 3
 	// onto the stack
 	final static short	iconst_4		= 0x07;			// ? 4 loads the int
-														// value 4
+															// value 4
 	// onto the stack
 	final static short	iconst_5		= 0x08;			// ? 5 loads the int
-														// value 5
+															// value 5
 	// onto the stack
-	final static short	lconst_0		= 0x09;			// ? 0L pushes the long
-														// 0 onto
+	final static short	lconst_0		= 0x09;			// ? 0L pushes the
+															// long
+															// 0 onto
 	// the stack
-	final static short	bipush			= 0x10;			// byte ? value pushes a
-														// byte
+	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
+	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
+	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 ?
+															// indexbyte2 ?
 	// value pushes a constant
 	// #index from a constant pool
 	// (String, int, float or class
@@ -53,393 +60,433 @@
 	// index is constructed as
 	// indexbyte1 << 8 + indexbyte2)
 	final static short	ldc2_w			= 0x14;			// indexbyte1,
-														// indexbyte2 ?
+															// 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
+	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
+	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
+	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
+	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
+															// loads a
 	// reference onto the stack from
 	// a local variable #index
-	final static short	lload_2			= 0x20;			// ? value load a long
-														// value
+	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
+	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
+	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
+	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
+	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
+	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
+															// double from
 	// local variable 0
 	final static short	dload_1			= 0x27;			// ? value loads a
-														// double from
+															// double from
 	// local variable 1
 	final static short	dload_2			= 0x28;			// ? value loads a
-														// double from
+															// double from
 	// local variable 2
 	final static short	dload_3			= 0x29;			// ? value loads a
-														// double from
+															// double from
 	// local variable 3
 	final static short	faload			= 0x30;			// arrayref, index ?
-														// value loads
+															// value loads
 	// a float from an array
 	final static short	daload			= 0x31;			// arrayref, index ?
-														// value loads
+															// value loads
 	// a double from an array
 	final static short	aaload			= 0x32;			// arrayref, index ?
-														// value loads
+															// value loads
 	// onto the stack a reference
 	// from an array
 	final static short	baload			= 0x33;			// arrayref, index ?
-														// value loads
+															// value loads
 	// a byte or Boolean value from
 	// an array
 	final static short	caload			= 0x34;			// arrayref, index ?
-														// value loads
+															// value loads
 	// a char from an array
 	final static short	saload			= 0x35;			// arrayref, index ?
-														// value load
+															// value load
 	// short from array
-	final static short	istore			= 0x36;			// index value ? store
-														// int value
+	final static short	istore			= 0x36;			// index value ?
+															// store
+															// int value
 	// into variable #index
-	final static short	lstore			= 0x37;			// index value ? store a
-														// long
+	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
+	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
+	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
+	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
+	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
+	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
+															// float value
 	// into local variable 0
 	final static short	fstore_1		= 0x44;			// value ? stores a
-														// float value
+															// float value
 	// into local variable 1
 	final static short	fstore_2		= 0x45;			// value ? stores a
-														// float value
+															// float value
 	// into local variable 2
 	final static short	fstore_3		= 0x46;			// value ? stores a
-														// float value
+															// float value
 	// into local variable 3
 	final static short	dstore_0		= 0x47;			// value ? stores a
-														// double into
+															// double into
 	// local variable 0
 	final static short	dstore_1		= 0x48;			// value ? stores a
-														// double into
+															// double into
 	// local variable 1
 	final static short	dstore_2		= 0x49;			// value ? stores a
-														// double into
+															// double into
 	// local variable 2
 	final static short	lastore			= 0x50;			// arrayref, index,
-														// value ?
+															// value ?
 	// store a long to an array
 	final static short	fastore			= 0x51;			// arreyref, index,
-														// value ?
+															// value ?
 	// stores a float in an array
 	final static short	dastore			= 0x52;			// arrayref, index,
-														// value ?
+															// value ?
 	// stores a double into an array
 	final static short	aastore			= 0x53;			// arrayref, index,
-														// value ?
+															// value ?
 	// stores into a reference to an
 	// array
 	final static short	bastore			= 0x54;			// arrayref, index,
-														// value ?
+															// value ?
 	// stores a byte or Boolean
 	// value into an array
 	final static short	castore			= 0x55;			// arrayref, index,
-														// value ?
+															// value ?
 	// stores a char into an array
 	final static short	sastore			= 0x56;			// arrayref, index,
-														// value ?
+															// value ?
 	// store short to array
-	final static short	pop				= 0x57;			// value ? discards the
-														// top
+	final static short	pop				= 0x57;			// value ? discards
+															// the
+															// top
 	// value on the stack
-	final static short	pop2			= 0x58;			// {value2, value1} ?
-														// discards
+	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
+	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
+															// result adds
 	// two ints together
 	final static short	ladd			= 0x61;			// value1, value2 ?
-														// result add
+															// result add
 	// two longs
 	final static short	fadd			= 0x62;			// value1, value2 ?
-														// result adds
+															// result adds
 	// two floats
 	final static short	dadd			= 0x63;			// value1, value2 ?
-														// result adds
+															// result adds
 	// two doubles
 	final static short	isub			= 0x64;			// value1, value2 ?
-														// result int
+															// result int
 	// subtract
 	final static short	lsub			= 0x65;			// value1, value2 ?
-														// result
+															// result
 	// subtract two longs
 	final static short	fsub			= 0x66;			// value1, value2 ?
-														// result
+															// result
 	// subtracts two floats
 	final static short	dsub			= 0x67;			// value1, value2 ?
-														// result
+															// result
 	// subtracts a double from
 	// another
 	final static short	imul			= 0x68;			// value1, value2 ?
-														// result
+															// result
 	// multiply two integers
 	final static short	lmul			= 0x69;			// value1, value2 ?
-														// result
+															// result
 	// multiplies two longs
 	final static short	irem			= 0x70;			// value1, value2 ?
-														// result
+															// result
 	// logical int remainder
 	final static short	lrem			= 0x71;			// value1, value2 ?
-														// result
+															// result
 	// remainder of division of two
 	// longs
 	final static short	frem			= 0x72;			// value1, value2 ?
-														// result gets
+															// result gets
 	// the remainder from a division
 	// between two floats
 	final static short	drem			= 0x73;			// value1, value2 ?
-														// result gets
+															// result gets
 	// the remainder from a division
 	// between two doubles
-	final static short	ineg			= 0x74;			// value ? result negate
-														// int
+	final static short	ineg			= 0x74;			// value ? result
+															// negate
+															// int
 	final static short	lneg			= 0x75;			// value ? result
-														// negates a long
+															// negates a long
 	final static short	fneg			= 0x76;			// value ? result
-														// negates a
+															// negates a
 	// float
 	final static short	dneg			= 0x77;			// value ? result
-														// negates a
+															// negates a
 	// double
 	final static short	ishl			= 0x78;			// value1, value2 ?
-														// result int
+															// result int
 	// shift left
 	final static short	lshl			= 0x79;			// value1, value2 ?
-														// result
+															// result
 	// bitwise shift left of a long
 	// value1 by value2 positions
 	final static short	ior				= 0x80;			// value1, value2 ?
-														// result
+															// result
 	// logical int or
 	final static short	lor				= 0x81;			// value1, value2 ?
-														// result
+															// result
 	// bitwise or of two longs
 	final static short	ixor			= 0x82;			// value1, value2 ?
-														// result int
+															// result int
 	// xor
 	final static short	lxor			= 0x83;			// value1, value2 ?
-														// result
+															// result
 	// bitwise exclusive or of two
 	// longs
 	final static short	iinc			= 0x84;			// index, const [No
-														// change]
+															// change]
 	// increment local variable
 	// #index by signed byte const
 	final static short	i2l				= 0x85;			// value ? result
-														// converts an
+															// converts an
 	// int into a long
 	final static short	i2f				= 0x86;			// value ? result
-														// converts an
+															// converts an
 	// int into a float
 	final static short	i2d				= 0x87;			// value ? result
-														// converts an
+															// converts an
 	// int into a double
 	final static short	l2i				= 0x88;			// value ? result
-														// converts a
+															// converts a
 	// long to an int
 	final static short	l2f				= 0x89;			// value ? result
-														// converts a
+															// converts a
 	// long to a float
 	final static short	d2f				= 0x90;			// value ? result
-														// converts a
+															// converts a
 	// double to a float
 	final static short	i2b				= 0x91;			// value ? result
-														// converts an
+															// converts an
 	// int into a byte
 	final static short	i2c				= 0x92;			// value ? result
-														// converts an
+															// converts an
 	// int into a character
 	final static short	i2s				= 0x93;			// value ? result
-														// converts an
+															// converts an
 	// int into a short
 	final static short	lcmp			= 0x94;			// value1, value2 ?
-														// result
+															// result
 	// compares two longs values
 	final static short	fcmpl			= 0x95;			// value1, value2 ?
-														// result
+															// result
 	// compares two floats
 	final static short	fcmpg			= 0x96;			// value1, value2 ?
-														// result
+															// result
 	// compares two floats
 	final static short	dcmpl			= 0x97;			// value1, value2 ?
-														// result
+															// result
 	// compares two doubles
 	final static short	dcmpg			= 0x98;			// value1, value2 ?
-														// result
+															// result
 	// compares two doubles
 	final static short	ifeq			= 0x99;			// branchbyte1,
-														// branchbyte2
+															// 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
+	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
+	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
+	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
+	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
+															// constant 0.0
 	// onto the stack
 	final static short	dconst_1		= 0x0f;			// ? 1.0 pushes the
-														// constant 1.0
+															// constant 1.0
 	// onto the stack
-	final static short	iload_0			= 0x1a;			// ? value loads an int
-														// value
+	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
+	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
+	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
+	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
+	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
+	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
+	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
+	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
+	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
+	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
+															// value loads
 	// an int from an array
 	final static short	laload			= 0x2f;			// arrayref, index ?
-														// value load
+															// value load
 	// a long from an array
 	final static short	astore			= 0x3a;			// index objectref ?
-														// stores a
+															// stores a
 	// reference into a local
 	// variable #index
 	final static short	istore_0		= 0x3b;			// value ? store int
-														// value into
+															// value into
 	// variable 0
 	final static short	istore_1		= 0x3c;			// value ? store int
-														// value into
+															// value into
 	// variable 1
 	final static short	istore_2		= 0x3d;			// value ? store int
-														// value into
+															// value into
 	// variable 2
 	final static short	istore_3		= 0x3e;			// value ? store int
-														// value into
+															// value into
 	// variable 3
-	final static short	lstore_0		= 0x3f;			// value ? store a long
-														// value in
+	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
+															// double into
 	// local variable 3
-	final static short	astore_0		= 0x4b;			// objectref ? stores a
+	final static short	astore_0		= 0x4b;			// objectref ?
+															// stores a
 	// reference into local variable
 	// 0
-	final static short	astore_1		= 0x4c;			// objectref ? stores a
+	final static short	astore_1		= 0x4c;			// objectref ?
+															// stores a
 	// reference into local variable
 	// 1
-	final static short	astore_2		= 0x4d;			// objectref ? stores a
+	final static short	astore_2		= 0x4d;			// objectref ?
+															// stores a
 	// reference into local variable
 	// 2
-	final static short	astore_3		= 0x4e;			// objectref ? stores a
+	final static short	astore_3		= 0x4e;			// objectref ?
+															// stores a
 	// reference into local variable
 	// 3
 	final static short	iastore			= 0x4f;			// arrayref, index,
-														// value ?
+															// value ?
 	// stores an int into an array
 	final static short	dup_x1			= 0x5a;			// value2, value1 ?
-														// 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 ?
 	// value1, value3, value2,
 	// value1 inserts a copy of the
 	// top value into the stack two
@@ -448,8 +495,9 @@
 	// value3, too) or three values
 	// (if value2 is neither double
 	// nor long) from the top
-	final static short	dup2			= 0x5c;			// {value2, value1} ?
-														// {value2,
+	final static short	dup2			= 0x5c;			// {value2, value1}
+															// ?
+															// {value2,
 	// value1}, {value2, value1}
 	// duplicate top two stack words
 	// (two values, if value1 is not
@@ -457,85 +505,85 @@
 	// value, if value1 is double or
 	// long)
 	final static short	dup2_x1			= 0x5d;			// value3, {value2,
-														// value1} ?
+															// 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,
+															// {value2,
 	// value1} ? {value2, value1},
 	// {value4, value3}, {value2,
 	// value1} duplicate two words
 	// and insert beneath fourth
 	// word
 	final static short	swap			= 0x5f;			// value2, value1 ?
-														// 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
+															// result
 	// multiplies two floats
 	final static short	dmul			= 0x6b;			// value1, value2 ?
-														// result
+															// result
 	// multiplies two doubles
 	final static short	idiv			= 0x6c;			// value1, value2 ?
-														// result
+															// result
 	// divides two integers
 	final static short	ldiv			= 0x6d;			// value1, value2 ?
-														// result
+															// result
 	// divide two longs
 	final static short	fdiv			= 0x6e;			// value1, value2 ?
-														// result
+															// result
 	// divides two floats
 	final static short	ddiv			= 0x6f;			// value1, value2 ?
-														// result
+															// result
 	// divides two doubles
 	final static short	ishr			= 0x7a;			// value1, value2 ?
-														// result int
+															// result int
 	// shift right
 	final static short	lshr			= 0x7b;			// value1, value2 ?
-														// result
+															// result
 	// bitwise shift right of a long
 	// value1 by value2 positions
 	final static short	iushr			= 0x7c;			// value1, value2 ?
-														// result int
+															// result int
 	// shift right
 	final static short	lushr			= 0x7d;			// value1, value2 ?
-														// result
+															// result
 	// bitwise shift right of a long
 	// value1 by value2 positions,
 	// unsigned
 	final static short	iand			= 0x7e;			// value1, value2 ?
-														// result
+															// result
 	// performs a logical and on two
 	// integers
 	final static short	land			= 0x7f;			// value1, value2 ?
-														// result
+															// result
 	// bitwise and of two longs
 	final static short	l2d				= 0x8a;			// value ? result
-														// converts a
+															// converts a
 	// long to a double
 	final static short	f2i				= 0x8b;			// value ? result
-														// converts a
+															// converts a
 	// float to an int
 	final static short	f2l				= 0x8c;			// value ? result
-														// converts a
+															// converts a
 	// float to a long
 	final static short	f2d				= 0x8d;			// value ? result
-														// converts a
+															// converts a
 	// float to a double
 	final static short	d2i				= 0x8e;			// value ? result
-														// converts a
+															// converts a
 	// double to an int
 	final static short	d2l				= 0x8f;			// value ? result
-														// converts a
+															// converts a
 	// double to a long
 	final static short	ifne			= 0x9a;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value ? if value is not 0,
 	// branch to instruction at
 	// branchoffset (signed short
@@ -543,7 +591,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	iflt			= 0x9b;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value ? if value is less than
 	// 0, branch to instruction at
 	// branchoffset (signed short
@@ -551,7 +599,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	ifge			= 0x9c;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value ? if value is greater
 	// than or equal to 0, branch to
 	// instruction at branchoffset
@@ -560,7 +608,7 @@
 	// branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	ifgt			= 0x9d;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value ? if value is greater
 	// than 0, branch to instruction
 	// at branchoffset (signed short
@@ -568,7 +616,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	ifle			= 0x9e;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value ? if value is less than
 	// or equal to 0, branch to
 	// instruction at branchoffset
@@ -577,7 +625,7 @@
 	// branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_icmpeq		= 0x9f;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if ints are
 	// equal, branch to instruction
 	// at branchoffset (signed short
@@ -585,7 +633,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_icmpne		= 0xa0;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if ints are
 	// not equal, branch to
 	// instruction at branchoffset
@@ -594,7 +642,7 @@
 	// branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_icmplt		= 0xa1;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if value1 is
 	// less than value2, branch to
 	// instruction at branchoffset
@@ -603,7 +651,7 @@
 	// branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_icmpge		= 0xa2;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if value1 is
 	// greater than or equal to
 	// value2, branch to instruction
@@ -612,7 +660,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_icmpgt		= 0xa3;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if value1 is
 	// greater than value2, branch
 	// to instruction at
@@ -621,7 +669,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_icmple		= 0xa4;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if value1 is
 	// less than or equal to value2,
 	// branch to instruction at
@@ -630,7 +678,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_acmpeq		= 0xa5;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if
 	// references are equal, branch
 	// to instruction at
@@ -639,7 +687,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	if_acmpne		= 0xa6;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value1, value2 ? if
 	// references are not equal,
 	// branch to instruction at
@@ -648,7 +696,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	goto_			= 0xa7;			// branchbyte1,
-														// branchbyte2 [no
+															// branchbyte2 [no
 	// change] goes to another
 	// instruction at branchoffset
 	// (signed short constructed
@@ -656,7 +704,7 @@
 	// branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	jsr				= 0xa8;			// branchbyte1,
-														// branchbyte2 ?
+															// branchbyte2 ?
 	// address jump to subroutine at
 	// branchoffset (signed short
 	// constructed from unsigned
@@ -664,12 +712,13 @@
 	// branchbyte2) and place the
 	// return address on the stack
 	final static short	ret				= 0xa9;			// index [No change]
-														// continue
+															// 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],
+	final static short	tableswitch		= 0xaa;			// [0-3 bytes
+															// padding],
 	// defaultbyte1, defaultbyte2,
 	// defaultbyte3, defaultbyte4,
 	// lowbyte1, lowbyte2, lowbyte3,
@@ -679,7 +728,8 @@
 	// index ? continue execution
 	// from an address in the table
 	// at offset index
-	final static short	lookupswitch	= 0xab;			// <0-3 bytes padding>,
+	final static short	lookupswitch	= 0xab;			// <0-3 bytes
+															// padding>,
 	// defaultbyte1, defaultbyte2,
 	// defaultbyte3, defaultbyte4,
 	// npairs1, npairs2, npairs3,
@@ -690,32 +740,34 @@
 	// execution continues from the
 	// instruction at that address
 	final static short	ireturn			= 0xac;			// value ? [empty]
-														// returns an
+															// returns an
 	// integer from a method
 	final static short	lreturn			= 0xad;			// value ? [empty]
-														// returns a
+															// returns a
 	// long value
 	final static short	freturn			= 0xae;			// value ? [empty]
-														// returns a
+															// returns a
 	// float
 	final static short	dreturn			= 0xaf;			// value ? [empty]
-														// returns a
+															// returns a
 	// double from a method
-	final static short	areturn			= 0xb0;			// objectref ? [empty]
-														// returns a
+	final static short	areturn			= 0xb0;			// objectref ?
+															// [empty]
+															// returns a
 	// reference from a method
-	final static short	return_			= 0xb1;			// ? [empty] return void
-														// from
+	final static short	return_			= 0xb1;			// ? [empty] return
+															// void
+															// from
 	// method
 	final static short	getstatic		= 0xb2;			// index1, index2 ?
-														// value gets a
+															// 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
+															// indexbyte2 value
 	// ? set static field to value
 	// in a class, where the field
 	// is identified by a field
@@ -723,7 +775,7 @@
 	// pool (indexbyte1 << 8 +
 	// indexbyte2)
 	final static short	getfield		= 0xb4;			// index1, index2
-														// objectref ?
+															// objectref ?
 	// value gets a field value of
 	// an object objectref, where
 	// the field is identified by
@@ -731,7 +783,7 @@
 	// constant pool index (index1
 	// << 8 + index2)
 	final static short	putfield		= 0xb5;			// indexbyte1,
-														// indexbyte2
+															// indexbyte2
 	// objectref, value ? set field
 	// to value in an object
 	// objectref, where the field is
@@ -740,7 +792,7 @@
 	// pool (indexbyte1 << 8 +
 	// indexbyte2)
 	final static short	invokevirtual	= 0xb6;			// indexbyte1,
-														// indexbyte2
+															// indexbyte2
 	// objectref, [arg1, arg2, ...]
 	// ? invoke virtual method on
 	// object objectref, where the
@@ -749,7 +801,7 @@
 	// constant pool (indexbyte1 <<
 	// 8 + indexbyte2)
 	final static short	invokespecial	= 0xb7;			// indexbyte1,
-														// indexbyte2
+															// indexbyte2
 	// objectref, [arg1, arg2, ...]
 	// ? invoke instance method on
 	// object objectref, where the
@@ -758,7 +810,7 @@
 	// constant pool (indexbyte1 <<
 	// 8 + indexbyte2)
 	final static short	invokestatic	= 0xb8;			// indexbyte1,
-														// indexbyte2 [arg1,
+															// indexbyte2 [arg1,
 	// arg2, ...] ? invoke a static
 	// method, where the method is
 	// identified by method
@@ -766,7 +818,7 @@
 	// pool (indexbyte1 << 8 +
 	// indexbyte2)
 	final static short	invokeinterface	= 0xb9;			// indexbyte1,
-														// indexbyte2,
+															// indexbyte2,
 	// count, 0 objectref, [arg1,
 	// arg2, ...] ? invokes an
 	// interface method on object
@@ -777,22 +829,22 @@
 	// pool (indexbyte1 << 8 +
 	// indexbyte2)
 	final static short	xxxunusedxxx	= 0xba;			// this opcode is
-														// reserved "for
+															// reserved "for
 	// historical reasons"
 	final static short	new_			= 0xbb;			// indexbyte1,
-														// indexbyte2 ?
+															// 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
+															// arrayref
 	// creates new array with count
 	// elements of primitive type
 	// identified by atype
 	final static short	anewarray		= 0xbd;			// indexbyte1,
-														// indexbyte2 count
+															// indexbyte2 count
 	// ? arrayref creates a new
 	// array of references of length
 	// count and component type
@@ -801,16 +853,17 @@
 	// << 8 + indexbyte2) in the
 	// constant pool
 	final static short	arraylength		= 0xbe;			// arrayref ? length
-														// gets the
+															// gets the
 	// length of an array
-	final static short	athrow			= 0xbf;			// objectref ? [empty],
+	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
+															// indexbyte2
 	// objectref ? objectref checks
 	// whether an objectref is of a
 	// certain type, the class
@@ -819,7 +872,7 @@
 	// (indexbyte1 << 8 +
 	// indexbyte2)
 	final static short	instanceof_		= 0xc1;			// indexbyte1,
-														// indexbyte2
+															// indexbyte2
 	// objectref ? result determines
 	// if an object objectref is of
 	// a given type, identified by
@@ -827,19 +880,20 @@
 	// constant pool (indexbyte1 <<
 	// 8 + indexbyte2)
 	final static short	monitorenter	= 0xc2;			// objectref ? enter
-														// monitor for
+															// monitor for
 	// object ("grab the lock" -
 	// start of synchronized()
 	// section)
 	final static short	monitorexit		= 0xc3;			// objectref ? exit
-														// monitor for
+															// monitor for
 	// object ("release the lock" -
 	// end of synchronized()
 	// section)
-	final static short	wide			= 0xc4;			// opcode, indexbyte1,
+	final static short	wide			= 0xc4;			// opcode,
+															// indexbyte1,
 	// indexbyte2
 	final static short	multianewarray	= 0xc5;			// indexbyte1,
-														// indexbyte2,
+															// indexbyte2,
 	// dimensions count1,
 	// [count2,...] ? arrayref
 	// create a new array of
@@ -852,7 +906,7 @@
 	// each dimension is identified
 	// by count1, [count2, etc]
 	final static short	ifnull			= 0xc6;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value ? if value is null,
 	// branch to instruction at
 	// branchoffset (signed short
@@ -860,7 +914,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	ifnonnull		= 0xc7;			// branchbyte1,
-														// branchbyte2
+															// branchbyte2
 	// value ? if value is not null,
 	// branch to instruction at
 	// branchoffset (signed short
@@ -868,7 +922,7 @@
 	// bytes branchbyte1 << 8 +
 	// branchbyte2)
 	final static short	goto_w			= 0xc8;			// branchbyte1,
-														// branchbyte2,
+															// branchbyte2,
 	// branchbyte3, branchbyte4 [no
 	// change] goes to another
 	// instruction at branchoffset
@@ -878,7 +932,7 @@
 	// branchbyte3 << 8 +
 	// branchbyte4)
 	final static short	jsr_w			= 0xc9;			// branchbyte1,
-														// branchbyte2,
+															// branchbyte2,
 	// branchbyte3, branchbyte4 ?
 	// address jump to subroutine at
 	// branchoffset (signed int
@@ -889,7 +943,7 @@
 	// branchbyte4) and place the
 	// return address on the stack
 	final static short	breakpoint		= 0xca;			// reserved for
-														// breakpoints in
+															// breakpoints in
 	// Java debuggers; should not
 	// appear in any class file
 	final static short	impdep1			= 0xfe;			// reserved for
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Packages.java b/bundleplugin/src/main/java/aQute/lib/osgi/Packages.java
index 09e8305..fae4597 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Packages.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Packages.java
@@ -5,21 +5,20 @@
 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 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);
+			map = new LinkedHashMap<Descriptors.PackageRef,Attrs>(other.map);
 		}
 	}
 
-	public Packages() {
-	}
+	public Packages() {}
 
 	public void clear() {
-		if(map!=null)
+		if (map != null)
 			map.clear();
 	}
 
@@ -30,7 +29,8 @@
 		return map.containsKey(name);
 	}
 
-	@Deprecated public boolean containsKey(Object name) {
+	@Deprecated
+	public boolean containsKey(Object name) {
 		assert name instanceof PackageRef;
 		if (map == null)
 			return false;
@@ -45,7 +45,8 @@
 		return map.containsValue(value);
 	}
 
-	@Deprecated public boolean containsValue(Object value) {
+	@Deprecated
+	public boolean containsValue(Object value) {
 		assert value instanceof Attrs;
 		if (map == null)
 			return false;
@@ -53,14 +54,15 @@
 		return map.containsValue((Attrs) value);
 	}
 
-	public Set<java.util.Map.Entry<PackageRef, Attrs>> entrySet() {
+	public Set<java.util.Map.Entry<PackageRef,Attrs>> entrySet() {
 		if (map == null)
 			return EMPTY.entrySet();
 
 		return map.entrySet();
 	}
 
-	@Deprecated public Attrs get(Object key) {
+	@Deprecated
+	public Attrs get(Object key) {
 		assert key instanceof PackageRef;
 		if (map == null)
 			return null;
@@ -98,28 +100,29 @@
 
 	public Attrs put(PackageRef key, Attrs value) {
 		if (map == null)
-			map = new LinkedHashMap<PackageRef, Attrs>();
+			map = new LinkedHashMap<PackageRef,Attrs>();
 
 		return map.put(key, value);
 	}
 
-	public void putAll(Map<? extends PackageRef, ? extends Attrs> map) {
+	public void putAll(Map< ? extends PackageRef, ? extends Attrs> map) {
 		if (this.map == null)
 			if (map.isEmpty())
 				return;
 			else
-				this.map = new LinkedHashMap<PackageRef, Attrs>();
+				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()))
+		for (Map.Entry<PackageRef, ? extends Attrs> entry : map.entrySet()) {
+			if (!containsKey(entry.getKey()))
 				put(entry.getKey(), entry.getValue());
 		}
 	}
-	
-	@Deprecated public Attrs remove(Object var0) {
+
+	@Deprecated
+	public Attrs remove(Object var0) {
 		assert var0 instanceof PackageRef;
 		if (map == null)
 			return null;
@@ -150,7 +153,7 @@
 		if (map == null)
 			return null;
 
-		for (Map.Entry<PackageRef, Attrs> pr : map.entrySet()) {
+		for (Map.Entry<PackageRef,Attrs> pr : map.entrySet()) {
 			if (pr.getKey().getFQN().equals(s))
 				return pr.getValue();
 		}
@@ -161,7 +164,7 @@
 		if (map == null)
 			return null;
 
-		for (Map.Entry<PackageRef, Attrs> pr : map.entrySet()) {
+		for (Map.Entry<PackageRef,Attrs> pr : map.entrySet()) {
 			if (pr.getKey().getBinary().equals(s))
 				pr.getValue();
 		}
@@ -184,7 +187,7 @@
 
 	public void append(StringBuilder sb) {
 		String del = "";
-		for (Map.Entry<PackageRef, Attrs> s : entrySet()) {
+		for (Map.Entry<PackageRef,Attrs> s : entrySet()) {
 			sb.append(del);
 			sb.append(s.getKey());
 			if (!s.getValue().isEmpty()) {
@@ -196,11 +199,11 @@
 	}
 
 	public void merge(PackageRef ref, boolean unique, Attrs... attrs) {
-		if ( unique ) {
-			while ( containsKey(ref))
+		if (unique) {
+			while (containsKey(ref))
 				ref = ref.getDuplicate();
 		}
-		
+
 		Attrs org = put(ref);
 		for (Attrs a : attrs) {
 			if (a != null)
@@ -210,21 +213,20 @@
 
 	public Attrs get(PackageRef packageRef, Attrs deflt) {
 		Attrs mine = get(packageRef);
-		if ( mine!=null)
+		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
index f003abc..8b3f79e 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/PreprocessResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/PreprocessResource.java
@@ -3,42 +3,43 @@
 import java.io.*;
 
 public class PreprocessResource extends AbstractResource {
-    final Resource  resource;
-    final Processor processor;
+	final Resource	resource;
+	final Processor	processor;
 
-    public PreprocessResource(Processor processor, Resource r) {
-        super(r.lastModified());
-        this.processor = processor;
-        this.resource = r;
-        setExtra(resource.getExtra());
-    }
+	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 {
+	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 {
+			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
index 655ce4d..ab1cf10 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Processor.java
@@ -96,7 +96,7 @@
 		getInfo(processor, "");
 	}
 
-	private <T> void addAll(List<String> to, List<? extends T> from, String prefix) {
+	private <T> void addAll(List<String> to, List< ? extends T> from, String prefix) {
 		for (T x : from) {
 			to.add(prefix + x);
 		}
@@ -152,8 +152,7 @@
 		p.signal();
 	}
 
-	public void signal() {
-	}
+	public void signal() {}
 
 	public List<String> getWarnings() {
 		return warnings;
@@ -250,9 +249,8 @@
 	/**
 	 * 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.
+	 * implement the Plugin interface to see these attributes. Any object can be
+	 * a plugin.
 	 * 
 	 * @return
 	 */
@@ -295,7 +293,7 @@
 		CL loader = getLoader();
 
 		// First add the plugin-specific paths from their path: directives
-		for (Entry<String, Attrs> entry : plugins.entrySet()) {
+		for (Entry<String,Attrs> entry : plugins.entrySet()) {
 			String key = removeDuplicateMarker(entry.getKey());
 			String path = entry.getValue().get(PATH_DIRECTIVE);
 			if (path != null) {
@@ -305,9 +303,9 @@
 						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);
+				}
+				catch (Exception e) {
+					error("Problem adding path %s to loader for plugin %s. Exception: (%s)", path, key, e);
 				}
 			}
 		}
@@ -320,14 +318,15 @@
 				try {
 					File f = getFile(path).getAbsoluteFile();
 					loader.add(f.toURI().toURL());
-				} catch (Exception e) {
+				}
+				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()) {
+		for (Entry<String,Attrs> entry : plugins.entrySet()) {
 			String key = entry.getKey();
 
 			try {
@@ -339,11 +338,12 @@
 				key = removeDuplicateMarker(key);
 
 				try {
-					Class<?> c = (Class<?>) loader.loadClass(key);
+					Class< ? > c = (Class< ? >) loader.loadClass(key);
 					Object plugin = c.newInstance();
 					customize(plugin, entry.getValue());
 					list.add(plugin);
-				} catch (Throwable t) {
+				}
+				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
@@ -358,7 +358,8 @@
 						missingCommand.addAll(cs);
 					}
 				}
-			} catch (Throwable e) {
+			}
+			catch (Throwable e) {
 				error("Problem loading the plugin: %s exception: (%s)", key, e);
 			}
 		}
@@ -420,12 +421,12 @@
 		return new TreeSet<T>();
 	}
 
-	public static <K, V> Map<K, V> newMap() {
-		return new LinkedHashMap<K, V>();
+	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 static <K, V> Map<K,V> newHashMap() {
+		return new LinkedHashMap<K,V>();
 	}
 
 	public <T> List<T> newList(Collection<T> t) {
@@ -436,15 +437,16 @@
 		return new TreeSet<T>(t);
 	}
 
-	public <K, V> Map<K, V> newMap(Map<K, V> t) {
-		return new LinkedHashMap<K, V>(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) {
+			}
+			catch (IOException e) {
 				// Who cares?
 			}
 		}
@@ -482,7 +484,8 @@
 			try {
 				Properties properties = loadProperties(file);
 				mergeProperties(properties, override);
-			} catch (Exception e) {
+			}
+			catch (Exception e) {
 				error("Error loading properties file: " + file);
 			}
 		} else {
@@ -494,7 +497,7 @@
 	}
 
 	public void mergeProperties(Properties properties, boolean override) {
-		for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements();) {
+		for (Enumeration< ? > e = properties.propertyNames(); e.hasMoreElements();) {
 			String key = (String) e.nextElement();
 			String value = properties.getProperty(key);
 			if (override || !getProperties().containsKey(key))
@@ -513,8 +516,8 @@
 		setProperties(p);
 	}
 
-	public void addProperties(Map<?, ?> properties) {
-		for (Entry<?, ?> entry : properties.entrySet()) {
+	public void addProperties(Map< ? , ? > properties) {
+		for (Entry< ? , ? > entry : properties.entrySet()) {
 			setProperty(entry.getKey().toString(), entry.getValue() + "");
 		}
 	}
@@ -561,11 +564,11 @@
 				try {
 					File file = getFile(ubase, value).getAbsoluteFile();
 					if (!file.isFile() && fileMustExist) {
-						error("Included file " + file
-								+ (file.exists() ? " does not exist" : " is directory"));
+						error("Included file " + file + (file.exists() ? " does not exist" : " is directory"));
 					} else
 						doIncludeFile(file, overwrite, p);
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					if (fileMustExist)
 						error("Error in processing included file: " + value, e);
 				}
@@ -610,10 +613,10 @@
 
 				doIncludes(file.getParentFile(), sub);
 				// make sure we do not override properties
-				for (Map.Entry<?, ?> entry : sub.entrySet()) {
+				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) {
@@ -622,7 +625,8 @@
 							target.setProperty(extensionKey, value);
 					}
 				}
-			} finally {
+			}
+			finally {
 				IO.close(in);
 			}
 		}
@@ -645,8 +649,7 @@
 				if (changed)
 					break;
 
-				changed |= !file.exists()
-						|| updateModified(file.lastModified(), "include file: " + file);
+				changed |= !file.exists() || updateModified(file.lastModified(), "include file: " + file);
 			}
 		}
 
@@ -667,8 +670,7 @@
 		propertiesChanged();
 	}
 
-	public void propertiesChanged() {
-	}
+	public void propertiesChanged() {}
 
 	/**
 	 * Set the properties by file. Setting the properties this way will also set
@@ -705,7 +707,8 @@
 					error("No such properties file: " + propertiesFile);
 				}
 			}
-		} catch (IOException e) {
+		}
+		catch (IOException e) {
 			error("Could not load properties " + propertiesFile);
 		}
 	}
@@ -729,11 +732,11 @@
 	 * @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
 	 * 
@@ -802,7 +805,8 @@
 		try {
 			Properties p = loadProperties(in, file.getAbsolutePath());
 			return p;
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 	}
@@ -818,7 +822,8 @@
 			Properties p = new Properties();
 			p.load(in);
 			return replaceAll(p, "\\$\\{\\.\\}", name);
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			error("Error during loading properties file: " + name + ", error:" + e);
 			return new Properties();
 		}
@@ -832,8 +837,8 @@
 
 	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();
+		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);
@@ -850,17 +855,17 @@
 	 * @return the clauses
 	 * @throws IOException
 	 */
-	public static String printClauses(Map<?, ? extends Map<?, ?>> exports) throws IOException {
+	public static String printClauses(Map< ? , ? extends Map< ? , ? >> exports) throws IOException {
 		return printClauses(exports, false);
 	}
 
-	public static String printClauses(Map<?, ? extends Map<?, ?>> exports,
-			boolean checkMultipleVersions) throws IOException {
+	public static String printClauses(Map< ? , ? extends Map< ? , ? >> exports, boolean checkMultipleVersions)
+			throws IOException {
 		StringBuilder sb = new StringBuilder();
 		String del = "";
-		for (Entry<?, ? extends Map<?, ?>> entry : exports.entrySet()) {
+		for (Entry< ? , ? extends Map< ? , ? >> entry : exports.entrySet()) {
 			String name = entry.getKey().toString();
-			Map<?, ?> clause = entry.getValue();
+			Map< ? , ? > clause = entry.getValue();
 
 			// We allow names to be duplicated in the input
 			// by ending them with '~'. This is necessary to use
@@ -876,13 +881,13 @@
 		return sb.toString();
 	}
 
-	public static void printClause(Map<?, ?> map, StringBuilder sb) throws IOException {
+	public static void printClause(Map< ? , ? > map, StringBuilder sb) throws IOException {
 
-		for (Entry<?, ?> entry : map.entrySet()) {
+		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))
+			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();
@@ -901,8 +906,8 @@
 	 * @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();
+		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);
@@ -1021,7 +1026,8 @@
 				sb.append(chars, 0, size);
 				size = ir.read(chars);
 			}
-		} finally {
+		}
+		finally {
 			ir.close();
 		}
 		return sb.toString();
@@ -1033,15 +1039,15 @@
 	 * @param args
 	 * @return
 	 */
-	public static String join(Collection<?> list, String delimeter) {
+	public static String join(Collection< ? > list, String delimeter) {
 		return join(delimeter, list);
 	}
 
-	public static String join(String delimeter, Collection<?>... list) {
+	public static String join(String delimeter, Collection< ? >... list) {
 		StringBuilder sb = new StringBuilder();
 		String del = "";
 		if (list != null) {
-			for (Collection<?> l : list) {
+			for (Collection< ? > l : list) {
 				for (Object item : l) {
 					sb.append(del);
 					sb.append(item);
@@ -1065,7 +1071,7 @@
 		return sb.toString();
 	}
 
-	public static String join(Collection<?>... list) {
+	public static String join(Collection< ? >... list) {
 		return join(",", list);
 	}
 
@@ -1160,11 +1166,12 @@
 			super.addURL(url);
 		}
 
-		public Class<?> loadClass(String name) throws NoClassDefFoundError {
+		public Class< ? > loadClass(String name) throws NoClassDefFoundError {
 			try {
-				Class<?> c = super.loadClass(name);
+				Class< ? > c = super.loadClass(name);
 				return c;
-			} catch (Throwable t) {
+			}
+			catch (Throwable t) {
 				StringBuilder sb = new StringBuilder();
 				sb.append(name);
 				sb.append(" not found, parent:  ");
@@ -1189,8 +1196,7 @@
 	 * Check if this is a valid project.
 	 */
 	public boolean exists() {
-		return base != null && base.isDirectory() && propertiesFile != null
-				&& propertiesFile.isFile();
+		return base != null && base.isDirectory() && propertiesFile != null && propertiesFile.isFile();
 	}
 
 	public boolean isOk() {
@@ -1225,8 +1231,7 @@
 			return true;
 
 		if (!missed.isEmpty())
-			System.err
-					.println("Missed the following patterns in the warnings or errors: " + missed);
+			System.err.println("Missed the following patterns in the warnings or errors: " + missed);
 
 		report(System.err);
 		return false;
@@ -1259,9 +1264,8 @@
 	 * 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.
+	 * plugin to fail to load when it is not needed. We first get the plugins to
+	 * ensure it is properly initialized.
 	 * 
 	 * @param name
 	 * @return
@@ -1282,7 +1286,6 @@
 	 * &#064;param prefix
 	 * &#064;param suffix
 	 * &#064;return
-	 * 
 	 */
 	public static String appendPath(String... parts) {
 		StringBuilder sb = new StringBuilder();
@@ -1331,8 +1334,7 @@
 				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));
+						"Invalid attribute on package-info.java in %s , %s. Must be <key>=<name> ", clazz, attr));
 		}
 		return map;
 	}
@@ -1385,7 +1387,7 @@
 		return join(result);
 	}
 
-	public synchronized Class<?> getClass(String type, File jar) throws Exception {
+	public synchronized Class< ? > getClass(String type, File jar) throws Exception {
 		CL cl = getLoader();
 		cl.add(jar.toURI().toURL());
 		return cl.loadClass(type);
@@ -1402,9 +1404,8 @@
 		tm = tm.toUpperCase();
 		TimeUnit unit = TimeUnit.MILLISECONDS;
 		Matcher m = Pattern
-				.compile(
-						"\\s*(\\d+)\\s*(NANOSECONDS|MICROSECONDS|MILLISECONDS|SECONDS|MINUTES|HOURS|DAYS)?")
-				.matcher(tm);
+				.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);
@@ -1427,9 +1428,9 @@
 		if (args.length > 1) {
 			try {
 				numchars = Integer.parseInt(args[1]);
-			} catch (NumberFormatException e) {
-				throw new IllegalArgumentException(
-						"Invalid character count parameter in ${random} macro.");
+			}
+			catch (NumberFormatException e) {
+				throw new IllegalArgumentException("Invalid character count parameter in ${random} macro.");
 			}
 		}
 
@@ -1439,8 +1440,7 @@
 		}
 
 		char[] letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
-		char[] alphanums = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
-				.toCharArray();
+		char[] alphanums = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
 
 		char[] array = new char[numchars];
 		for (int i = 0; i < numchars; i++) {
@@ -1458,9 +1458,8 @@
 	/**
 	 * 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.
+	 * owner or null. The command owner will receive all warnings and error
+	 * reports.
 	 */
 
 	protected Processor beginHandleErrors(String message) {
@@ -1510,19 +1509,23 @@
 	/**
 	 * Overrides for the Domain class
 	 */
-	@Override public String get(String key) {
+	@Override
+	public String get(String key) {
 		return getProperty(key);
 	}
 
-	@Override public String get(String key, String deflt) {
+	@Override
+	public String get(String key, String deflt) {
 		return getProperty(key, deflt);
 	}
 
-	@Override public void set(String key, String value) {
+	@Override
+	public void set(String key, String value) {
 		getProperties().setProperty(key, value);
 	}
 
-	@Override public Iterator<String> iterator() {
+	@Override
+	public Iterator<String> iterator() {
 		Set<String> keys = keySet();
 		final Iterator<String> it = keys.iterator();
 
@@ -1565,7 +1568,8 @@
 			StringBuilder sb = new StringBuilder();
 			report(sb);
 			return sb.toString();
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			throw new RuntimeException(e);
 		}
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Resource.java b/bundleplugin/src/main/java/aQute/lib/osgi/Resource.java
index f7df287..6605eef 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Resource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Resource.java
@@ -3,10 +3,15 @@
 import java.io.*;
 
 public interface Resource {
-	InputStream openInputStream() throws Exception ;
+	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
index 0318427..e138175 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/TagResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/TagResource.java
@@ -11,14 +11,14 @@
 		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 {
+		}
+		finally {
 			pw.flush();
 		}
 	}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/URLResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/URLResource.java
index 6e96f23..7c4772f 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/URLResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/URLResource.java
@@ -45,7 +45,7 @@
 		try {
 			if (url.getProtocol().equals("file:")) {
 				File file = new File(url.getPath());
-				if ( file.isFile())
+				if (file.isFile())
 					return size = file.length();
 			} else {
 				URLConnection con = url.openConnection();
@@ -59,7 +59,8 @@
 					}
 				}
 			}
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			// Forget this exception, we do it the hard way
 		}
 		InputStream in = openInputStream();
@@ -67,11 +68,12 @@
 		try {
 			din = new DataInputStream(in);
 			long result = din.skipBytes(Integer.MAX_VALUE);
-			while( in.read() >= 0) {
+			while (in.read() >= 0) {
 				result += din.skipBytes(Integer.MAX_VALUE);
 			}
 			size = result;
-		} finally {
+		}
+		finally {
 			if (din != null) {
 				din.close();
 			}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/Verifier.java b/bundleplugin/src/main/java/aQute/lib/osgi/Verifier.java
index 89bd7f0..27026ae 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/Verifier.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/Verifier.java
@@ -23,14 +23,11 @@
 	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"
+	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");
+											+ "|CDC-1\\.0/PersonalBasis-1\\.0" + "|CDC-1\\.0/PersonalJava-1\\.0");
 
 	final static int		V1_1	= 45;
 	final static int		V1_2	= 46;
@@ -69,37 +66,30 @@
 			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)		};
+			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		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 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 + "," + 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	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+");
@@ -110,18 +100,18 @@
 	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 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	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
+	public final static String	OSNAMES[]						= {
+			"AIX", // IBM
 			"DigitalUnix", // Compaq
 			"Embos", // Segger Embedded Software Solutions
 			"Epoc32", // SymbianOS Symbian OS
@@ -140,10 +130,11 @@
 			"VxWorks", // WindRiver Systems
 			"Windows95", "Win32", "Windows98", "WindowsNT", "WindowsCE", "Windows2000", // Win2000
 			"Windows2003", // Win2003
-			"WindowsXP", "WindowsVista",						};
+			"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.
@@ -164,7 +155,8 @@
 			"V850E", // NEC V850E
 			"x86", // pentium i386
 			"i486", // i586 i686 Intel& AMD 32 bit
-			"x86-64",											};
+			"x86-64",
+																};
 
 	final Analyzer				analyzer;
 	private Instructions		dynamicImports;
@@ -265,7 +257,8 @@
 		try {
 			verifyFilter(value, 0);
 			return null;
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			return "Not a valid filter: " + value + e.getMessage();
 		}
 	}
@@ -281,8 +274,7 @@
 			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);
+				error("Bundle-Activator not found on the bundle class path nor in imports: " + bactivator);
 			}
 		}
 	}
@@ -308,8 +300,7 @@
 	 * referred packages.
 	 */
 	private void verifyUnresolvedReferences() {
-		Set<PackageRef> unresolvedReferences = new TreeSet<PackageRef>(analyzer.getReferred()
-				.keySet());
+		Set<PackageRef> unresolvedReferences = new TreeSet<PackageRef>(analyzer.getReferred().keySet());
 		unresolvedReferences.removeAll(analyzer.getImports().keySet());
 		unresolvedReferences.removeAll(analyzer.getContained().keySet());
 
@@ -334,8 +325,8 @@
 					culprits.add(clazz.getAbsolutePath());
 			}
 
-			error("Unresolved references to %s by class(es) %s on the Bundle-Classpath: %s",
-					unresolvedReferences, culprits, analyzer.getBundleClasspath().keySet());
+			error("Unresolved references to %s by class(es) %s on the Bundle-Classpath: %s", unresolvedReferences,
+					culprits, analyzer.getBundleClasspath().keySet());
 		}
 	}
 
@@ -350,8 +341,8 @@
 		return dynamicImports.matches(pack.getFQN());
 	}
 
-	private boolean hasOverlap(Set<?> a, Set<?> b) {
-		for (Iterator<?> i = a.iterator(); i.hasNext();) {
+	private boolean hasOverlap(Set< ? > a, Set< ? > b) {
+		for (Iterator< ? > i = a.iterator(); i.hasNext();) {
 			if (b.contains(i.next()))
 				return true;
 		}
@@ -360,15 +351,14 @@
 
 	public void verify() throws Exception {
 		verifyHeaders();
-		verifyDirectives("Export-Package",
-				"uses:|mandatory:|include:|exclude:|" + IMPORT_DIRECTIVE, PACKAGEPATTERN, "package");
+		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");
+		verifyDirectives("Require-Capability", "effective:|resolution:|filter:", null, null);
+		verifyDirectives("Bundle-SymbolicName", "singleton:|fragment-attachment:|mandatory:", SYMBOLICNAME, "bsn");
 
 		verifyManifestFirst();
 		verifyActivator();
@@ -397,15 +387,12 @@
 	}
 
 	private void verifyRequirements() {
-		Parameters map = parseHeader(manifest.getMainAttributes().getValue(
-				Constants.REQUIRE_CAPABILITY));
+		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);
+			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
@@ -451,20 +438,16 @@
 	}
 
 	private void verifyCapabilities() {
-		Parameters map = parseHeader(manifest.getMainAttributes().getValue(
-				Constants.PROVIDE_CAPABILITY));
+		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);
+			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);
+				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");
@@ -493,8 +476,7 @@
 		}
 	}
 
-	private void verify(Attrs attrs, String ad, Pattern pattern, boolean mandatory, String msg,
-			String... args) {
+	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)
@@ -519,7 +501,7 @@
 	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()) {
+		for (Entry<String,Attrs> entry : map.entrySet()) {
 			String pname = removeDuplicateMarker(entry.getKey());
 
 			if (namePattern != null) {
@@ -529,7 +511,7 @@
 					else
 						warning("Invalid %s name: '%s'", type, pname);
 			}
-			
+
 			for (String key : entry.getValue().keySet()) {
 				if (key.endsWith(":")) {
 					if (!key.startsWith("x-")) {
@@ -537,8 +519,8 @@
 						if (m.matches())
 							continue;
 
-						warning("Unknown directive %s in %s, allowed directives are %s, and 'x-*'.",
-								key, header, directives.replace('|', ','));
+						warning("Unknown directive %s in %s, allowed directives are %s, and 'x-*'.", key, header,
+								directives.replace('|', ','));
 					}
 				}
 			}
@@ -578,7 +560,7 @@
 		else if (map.size() > 1)
 			warning("Bundle-ActivationPolicy has too many arguments %s", policy);
 		else {
-			Map<String, String> s = map.get("lazy");
+			Map<String,String> s = map.get("lazy");
 			if (s == null)
 				warning("Bundle-ActivationPolicy set but is not set to lazy: %s", policy);
 			else
@@ -635,10 +617,9 @@
 			if (!verify(name, WILDCARDPACKAGE))
 				error("DynamicImport-Package header contains an invalid package name: " + name);
 
-			Map<String, String> sub = map.get(name);
+			Map<String,String> sub = map.get(name);
 			if (r3 && sub.size() != 0) {
-				error("DynamicPackage-Import has attributes on import: "
-						+ name
+				error("DynamicPackage-Import has attributes on import: " + name
 						+ ". This is however, an <=R3 bundle and attributes on this header were introduced in R4. ");
 			}
 		}
@@ -706,8 +687,7 @@
 				index++;
 
 			if (expr.charAt(index) != '(')
-				throw new IllegalArgumentException("Filter mismatch: expected ( at position "
-						+ index + " : " + expr);
+				throw new IllegalArgumentException("Filter mismatch: expected ( at position " + index + " : " + expr);
 
 			index++; // skip (
 
@@ -715,50 +695,50 @@
 				index++;
 
 			switch (expr.charAt(index)) {
-			case '!':
-				index++; // skip !
-				while (Character.isWhitespace(expr.charAt(index)))
-					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++;
+					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;
 
-				if (expr.charAt(index) != ')')
-					throw new IllegalArgumentException("Filter mismatch: expected ) at position "
-							+ index + " : " + expr);
-				return index + 1; // skip )
+				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++;
+					}
 
-			default:
-				index = verifyFilterOperation(expr, index);
-				if (expr.charAt(index) != ')')
-					throw new IllegalArgumentException("Filter mismatch: expected ) at position "
-							+ index + " : " + expr);
-				return index + 1;
+					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) {
+		}
+		catch (IndexOutOfBoundsException e) {
 			throw new IllegalArgumentException("Filter mismatch: early EOF from " + index);
 		}
 	}
@@ -777,19 +757,17 @@
 		}
 		String operator = sb.toString();
 		if (!verify(operator, FILTEROP))
-			throw new IllegalArgumentException("Filter error, illegal operator " + operator
-					+ " at index " + index);
+			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 \\");
+				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++));
 		}
@@ -804,8 +782,7 @@
 		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();
+				String msg = "Invalid value for " + name + ", " + value + " does not match " + regex.pattern();
 				if (error)
 					error(msg);
 				else
@@ -827,8 +804,7 @@
 		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();
+				String msg = "Invalid value for " + name + ", " + value + " does not match " + regex.pattern();
 				if (error)
 					error(msg);
 				else
@@ -926,8 +902,7 @@
 				IO.copy(in, digester);
 				digester.digest();
 				if (!expected.equals(digester.digest())) {
-					error("Checksum mismatch %s, expected %s, got %s", path, expected,
-							digester.digest());
+					error("Checksum mismatch %s, expected %s, got %s", path, expected, digester.digest());
 				}
 			}
 		}
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/WriteResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/WriteResource.java
index 2acbe95..5cc5229 100644
--- a/bundleplugin/src/main/java/aQute/lib/osgi/WriteResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/WriteResource.java
@@ -3,34 +3,37 @@
 import java.io.*;
 
 public abstract class WriteResource implements Resource {
-	String	extra;
-	volatile long size = -1;
-	
+	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;
+		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() {
@@ -40,25 +43,28 @@
 	public void setExtra(String extra) {
 		this.extra = extra;
 	}
-	
-	static class CountingOutputStream extends OutputStream {
-		long size;
 
-		@Override public void write(int var0) throws IOException {
+	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) throws IOException {
+			size += buffer.length;
 		}
-		
-		@Override public void write(byte [] buffer, int start, int length) throws IOException {
-			size+=length;
+
+		@Override
+		public void write(byte[] buffer, int start, int length) throws IOException {
+			size += length;
 		}
 	}
-	
+
 	public long size() throws IOException, Exception {
-		if ( size == -1 ) {
+		if (size == -1) {
 			CountingOutputStream cout = new CountingOutputStream();
 			write(cout);
 			size = cout.size;
diff --git a/bundleplugin/src/main/java/aQute/lib/osgi/ZipResource.java b/bundleplugin/src/main/java/aQute/lib/osgi/ZipResource.java
index 126faba..f5e2095 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/ZipResource.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/ZipResource.java
@@ -6,83 +6,78 @@
 import java.util.zip.*;
 
 public class ZipResource implements Resource {
-    ZipFile  zip;
-    ZipEntry entry;
-    long     lastModified;
-    String   extra;
+	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");
-    }
+	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 InputStream openInputStream() throws IOException {
+		return zip.getInputStream(entry);
+	}
 
-    public String toString() {
-        return ":" + zip.getName() + "(" + entry.getName() + "):";
-    }
+	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) throws ZipException, IOException {
+		return build(jar, file, null);
+	}
 
-    public static ZipFile build(Jar jar, File file, Pattern pattern)
-            throws ZipException, IOException {
+	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());
-        }
-    }
+		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 void write(OutputStream out) throws Exception {
+		FileResource.copy(this, out);
+	}
 
-    public long lastModified() {
-        return lastModified;
-    }
+	public long lastModified() {
+		return lastModified;
+	}
 
-    public String getExtra() {
-        return extra;
-    }
+	public String getExtra() {
+		return extra;
+	}
 
-    public void setExtra(String extra) {
-        this.extra = extra;
-    }
+	public void setExtra(String extra) {
+		this.extra = extra;
+	}
 
-    
-    public long size() {
-    	return entry.getSize();
-    }
+	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
index 6e01ddc..2244fd2 100755
--- a/bundleplugin/src/main/java/aQute/lib/osgi/eclipse/EclipseClasspath.java
+++ b/bundleplugin/src/main/java/aQute/lib/osgi/eclipse/EclipseClasspath.java
@@ -19,230 +19,220 @@
  * @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>();
+	static DocumentBuilderFactory	documentBuilderFactory	= DocumentBuilderFactory.newInstance();
+	DocumentBuilder					db;
+	File							project;
+	File							workspace;
+	Set<File>						sources					= new LinkedHashSet<File>();
+	Set<File>						allSources				= new LinkedHashSet<File>();
 
-    public final static int       DO_VARIABLES           = 1;
+	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>();
 
-    /**
-     * 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 final static int			DO_VARIABLES			= 1;
 
-    public EclipseClasspath(Reporter reporter, File workspace, File project,
-            int options) throws Exception {
-        this.project = project.getCanonicalFile();
-        this.workspace = workspace.getCanonicalFile();
-        this.reporter = reporter;
-        db = documentBuilderFactory.newDocumentBuilder();
-        parse(this.project, true);
-        db = null;
-    }
+	/**
+	 * 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)
-            throws Exception {
-        this(reporter, workspace, project, 0);
-    }
+	public EclipseClasspath(Reporter reporter, File workspace, File project, int options) throws Exception {
+		this.project = project.getCanonicalFile();
+		this.workspace = workspace.getCanonicalFile();
+		this.reporter = reporter;
+		db = documentBuilderFactory.newDocumentBuilder();
+		parse(this.project, true);
+		db = null;
+	}
 
-    /**
-     * 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());
+	public EclipseClasspath(Reporter reporter, File workspace, File project) throws Exception {
+		this(reporter, workspace, project, 0);
+	}
 
-        Document doc = db.parse(file);
-        NodeList nodelist = doc.getDocumentElement().getElementsByTagName(
-                "classpathentry");
+	/**
+	 * 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());
 
-        if (nodelist == null)
-            throw new IllegalArgumentException(
-                    "Can not find classpathentry in classpath file");
+		Document doc = db.parse(file);
+		NodeList nodelist = doc.getDocumentElement().getElementsByTagName("classpathentry");
 
-        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 ...
-            }
-        }
-    }
+		if (nodelist == null)
+			throw new IllegalArgumentException("Can not find classpathentry in classpath file");
 
-    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;
+		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 ...
+			}
+		}
+	}
 
-        StringTokenizer st = new StringTokenizer(path, File.separator);
-        while (st.hasMoreTokens()) {
-            String token = st.nextToken();
-            result = new File(result, token);
-        }
+	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;
 
-        if (!result.exists())
-            System.err.println("File not found: project=" + project
-                    + " workspace=" + workspace + " path=" + opath + " file="
-                    + result);
-        return result;
-    }
+		StringTokenizer st = new StringTokenizer(path, File.separator);
+		while (st.hasMoreTokens()) {
+			String token = st.nextToken();
+			result = new File(result, token);
+		}
 
-    static Pattern PATH = Pattern.compile("([A-Z_]+)/(.*)");
+		if (!result.exists())
+			System.err.println("File not found: project=" + project + " workspace=" + workspace + " path=" + opath
+					+ " file=" + result);
+		return result;
+	}
 
-    private File replaceVar(String path) {
-        if ((options & DO_VARIABLES) == 0)
-            return null;
+	static Pattern	PATH	= Pattern.compile("([A-Z_]+)/(.*)");
 
-        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;
-            } else
-                reporter.error("Can't find replacement variable for: " + path);
-        } else
-            reporter.error("Cant split variable path: " + path);
-        return null;
-    }
+	private File replaceVar(String path) {
+		if ((options & DO_VARIABLES) == 0)
+			return null;
 
-    private String get(NamedNodeMap map, String name) {
-        Node node = map.getNamedItem(name);
-        if (node == null)
-            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;
+			} else
+				reporter.error("Can't find replacement variable for: " + path);
+		} else
+			reporter.error("Cant split variable path: " + path);
+		return null;
+	}
 
-        return node.getNodeValue();
-    }
+	private String get(NamedNodeMap map, String name) {
+		Node node = map.getNamedItem(name);
+		if (node == null)
+			return null;
 
-    public Set<File> getClasspath() {
-        return classpath;
-    }
+		return node.getNodeValue();
+	}
 
-    public Set<File> getSourcepath() {
-        return sources;
-    }
+	public Set<File> getClasspath() {
+		return classpath;
+	}
 
-    public File getOutput() {
-        return output;
-    }
+	public Set<File> getSourcepath() {
+		return sources;
+	}
 
-    public List<File> getDependents() {
-        return dependents;
-    }
+	public File getOutput() {
+		return output;
+	}
 
-    public void setRecurse(boolean recurse) {
-        this.recurse = recurse;
-    }
+	public List<File> getDependents() {
+		return dependents;
+	}
 
-    public Set<File> getExports() {
-        return exports;
-    }
+	public void setRecurse(boolean recurse) {
+		this.recurse = recurse;
+	}
 
-    public void setProperties(Map<String, String> map) {
-        this.properties = map;
-    }
+	public Set<File> getExports() {
+		return exports;
+	}
 
-    public Set<File> getBootclasspath() {
-        return bootclasspath;
-    }
+	public void setProperties(Map<String,String> map) {
+		this.properties = map;
+	}
 
-    public Set<File> getAllSources() {
-        return allSources;
-    }
+	public Set<File> getBootclasspath() {
+		return bootclasspath;
+	}
+
+	public Set<File> getAllSources() {
+		return allSources;
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/putjar/DirectoryInputStream.java b/bundleplugin/src/main/java/aQute/lib/putjar/DirectoryInputStream.java
index 5bd8178..8731037 100644
--- a/bundleplugin/src/main/java/aQute/lib/putjar/DirectoryInputStream.java
+++ b/bundleplugin/src/main/java/aQute/lib/putjar/DirectoryInputStream.java
@@ -6,276 +6,278 @@
 import aQute.libg.fileiterator.*;
 
 public class DirectoryInputStream extends InputStream {
-    final File               root;
-    final FileIterator       fi;
-    File                     element;
-    int                      entries   = 0;
-    int                      state     = START;
-    long                     where     = 0;
+	final File					root;
+	final FileIterator			fi;
+	File						element;
+	int							entries		= 0;
+	int							state		= START;
+	long						where		= 0;
 
-    final static int         START     = 0;
-    final static int         HEADER    = 1;
-    final static int         DATA      = 2;
-    final static int         DIRECTORY = 4;
-    final static int         EOF       = 5;
+	final static int			START		= 0;
+	final static int			HEADER		= 1;
+	final static int			DATA		= 2;
+	final static int			DIRECTORY	= 4;
+	final static int			EOF			= 5;
 
-    final static InputStream eof       = new ByteArrayInputStream(new byte[0]);
-    ByteArrayOutputStream    directory = new ByteArrayOutputStream();
-    InputStream              current   = eof;
+	final static InputStream	eof			= new ByteArrayInputStream(new byte[0]);
+	ByteArrayOutputStream		directory	= new ByteArrayOutputStream();
+	InputStream					current		= eof;
 
-    public DirectoryInputStream(File dir) {
-        root = dir;
-        fi = new FileIterator(dir);
-    }
+	public DirectoryInputStream(File dir) {
+		root = dir;
+		fi = new FileIterator(dir);
+	}
 
-    @Override
-    public int read() throws IOException {
-        if (fi == null)
-            return -1;
+	@Override
+	public int read() throws IOException {
+		if (fi == null)
+			return -1;
 
-        int c = current.read();
-        if (c < 0) {
-            next();
-            c = current.read();
-        }
-        if (c >= 0)
-            where++;
+		int c = current.read();
+		if (c < 0) {
+			next();
+			c = current.read();
+		}
+		if (c >= 0)
+			where++;
 
-        return c;
-    }
+		return c;
+	}
 
-    void next() throws IOException {
-        switch (state) {
-        case START:
-        case DATA:
-            nextHeader();
-            break;
+	void next() throws IOException {
+		switch (state) {
+			case START :
+			case DATA :
+				nextHeader();
+				break;
 
-        case HEADER:
-            if (element.isFile() && element.length() > 0) {
-                current = new FileInputStream(element);
-                state = DATA;
-            } else
-                nextHeader();
-            break;
+			case HEADER :
+				if (element.isFile() && element.length() > 0) {
+					current = new FileInputStream(element);
+					state = DATA;
+				} else
+					nextHeader();
+				break;
 
-        case DIRECTORY:
-            state = EOF;
-            current = eof;
-            break;
+			case DIRECTORY :
+				state = EOF;
+				current = eof;
+				break;
 
-        case EOF:
-            break;
-        }
-    }
+			case EOF :
+				break;
+		}
+	}
 
-    private void nextHeader() throws IOException {
-        if (fi.hasNext()) {
-            element = fi.next();
-            state = HEADER;
-            current = getHeader(root, element);
-            entries++;
-        } else {
-            current = getDirectory();
-            state = DIRECTORY;
-        }
-    }
+	private void nextHeader() throws IOException {
+		if (fi.hasNext()) {
+			element = fi.next();
+			state = HEADER;
+			current = getHeader(root, element);
+			entries++;
+		} else {
+			current = getDirectory();
+			state = DIRECTORY;
+		}
+	}
 
-    /**
-     * <pre>
-     *     end of central dir signature    4 bytes  (0x06054b50)
-     *         number of this disk             2 bytes
-     *         number of the disk with the
-     *         start of the central directory  2 bytes
-     *         total number of entries in the
-     *         central directory on this disk  2 bytes
-     *         total number of entries in
-     *         the central directory           2 bytes
-     *         size of the central directory   4 bytes
-     *         offset of start of central
-     *         directory with respect to
-     *         the starting disk number        4 bytes
-     *         .ZIP file comment length        2 bytes
-     *         .ZIP file comment       (variable size)
-     * </pre>
-     * 
-     * @return
-     */
-    InputStream getDirectory() throws IOException {
-        long where = this.where;
-        int sizeDirectory = directory.size();
+	/**
+	 * <pre>
+	 *     end of central dir signature    4 bytes  (0x06054b50)
+	 *         number of this disk             2 bytes
+	 *         number of the disk with the
+	 *         start of the central directory  2 bytes
+	 *         total number of entries in the
+	 *         central directory on this disk  2 bytes
+	 *         total number of entries in
+	 *         the central directory           2 bytes
+	 *         size of the central directory   4 bytes
+	 *         offset of start of central
+	 *         directory with respect to
+	 *         the starting disk number        4 bytes
+	 *         .ZIP file comment length        2 bytes
+	 *         .ZIP file comment       (variable size)
+	 * </pre>
+	 * 
+	 * @return
+	 */
+	InputStream getDirectory() throws IOException {
+		long where = this.where;
+		int sizeDirectory = directory.size();
 
-        writeInt(directory, 0x504b0506); // Signature
-        writeShort(directory, 0); // # of disk
-        writeShort(directory, 0); // # of the disk with start of the central
-        // dir
-        writeShort(directory, entries); // # of entries
-        writeInt(directory, sizeDirectory); // Size of central dir
-        writeInt(directory, (int) where);
-        writeShort(directory, 0);
+		writeInt(directory, 0x504b0506); // Signature
+		writeShort(directory, 0); // # of disk
+		writeShort(directory, 0); // # of the disk with start of the central
+		// dir
+		writeShort(directory, entries); // # of entries
+		writeInt(directory, sizeDirectory); // Size of central dir
+		writeInt(directory, (int) where);
+		writeShort(directory, 0);
 
-        directory.close();
+		directory.close();
 
-        byte[] data = directory.toByteArray();
-        return new ByteArrayInputStream(data);
-    }
+		byte[] data = directory.toByteArray();
+		return new ByteArrayInputStream(data);
+	}
 
-    private void writeShort(OutputStream out, int v) throws IOException {
-        for (int i = 0; i < 2; i++) {
-            out.write((byte) (v & 0xFF));
-            v = v >> 8;
-        }
-    }
+	private void writeShort(OutputStream out, int v) throws IOException {
+		for (int i = 0; i < 2; i++) {
+			out.write((byte) (v & 0xFF));
+			v = v >> 8;
+		}
+	}
 
-    private void writeInt(OutputStream out, int v) throws IOException {
-        for (int i = 0; i < 4; i++) {
-            out.write((byte) (v & 0xFF));
-            v = v >> 8;
-        }
-    }
+	private void writeInt(OutputStream out, int v) throws IOException {
+		for (int i = 0; i < 4; i++) {
+			out.write((byte) (v & 0xFF));
+			v = v >> 8;
+		}
+	}
 
-    /**
-     * Local file header:
-     * 
-     * <pre>
-     * 
-     *         local file header signature     4 bytes  (0x04034b50)
-     *         version needed to extract       2 bytes
-     *         general purpose bit flag        2 bytes
-     *         compression method              2 bytes
-     *         last mod file time              2 bytes
-     *         last mod file date              2 bytes
-     *         crc-32                          4 bytes
-     *         compressed size                 4 bytes
-     *         uncompressed size               4 bytes
-     *         file name length                2 bytes
-     *         extra field length              2 bytes
-     * 
-     *         file name (variable size)
-     *         extra field (variable size)
-     * 
-     *     central file header signature   4 bytes  (0x02014b50)
-     *         version made by                 2 bytes
-     *         version needed to extract       2 bytes
-     *         general purpose bit flag        2 bytes
-     *         compression method              2 bytes
-     *         last mod file time              2 bytes
-     *         last mod file date              2 bytes
-     *         crc-32                          4 bytes
-     *         compressed size                 4 bytes
-     *         uncompressed size               4 bytes
-     *         file name length                2 bytes
-     *         extra field length              2 bytes
-     *         file comment length             2 bytes
-     *         disk number start               2 bytes
-     *         internal file attributes        2 bytes
-     *         external file attributes        4 bytes
-     *         relative offset of local header 4 bytes
-     * 
-     *         file name (variable size)
-     *         extra field (variable size)
-     *         file comment (variable size)
-     * </pre>
-     * </pre>
-     * 
-     * @param file
-     * @return
-     */
-    private InputStream getHeader(File root, File file) throws IOException {
-        long where = this.where;
-        ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        // Signature
-        writeInt(bout, 0x04034b50);
-        writeInt(directory, 0x504b0102);
+	/**
+	 * Local file header:
+	 * 
+	 * <pre>
+	 * 
+	 *         local file header signature     4 bytes  (0x04034b50)
+	 *         version needed to extract       2 bytes
+	 *         general purpose bit flag        2 bytes
+	 *         compression method              2 bytes
+	 *         last mod file time              2 bytes
+	 *         last mod file date              2 bytes
+	 *         crc-32                          4 bytes
+	 *         compressed size                 4 bytes
+	 *         uncompressed size               4 bytes
+	 *         file name length                2 bytes
+	 *         extra field length              2 bytes
+	 * 
+	 *         file name (variable size)
+	 *         extra field (variable size)
+	 * 
+	 *     central file header signature   4 bytes  (0x02014b50)
+	 *         version made by                 2 bytes
+	 *         version needed to extract       2 bytes
+	 *         general purpose bit flag        2 bytes
+	 *         compression method              2 bytes
+	 *         last mod file time              2 bytes
+	 *         last mod file date              2 bytes
+	 *         crc-32                          4 bytes
+	 *         compressed size                 4 bytes
+	 *         uncompressed size               4 bytes
+	 *         file name length                2 bytes
+	 *         extra field length              2 bytes
+	 *         file comment length             2 bytes
+	 *         disk number start               2 bytes
+	 *         internal file attributes        2 bytes
+	 *         external file attributes        4 bytes
+	 *         relative offset of local header 4 bytes
+	 * 
+	 *         file name (variable size)
+	 *         extra field (variable size)
+	 *         file comment (variable size)
+	 * </pre>
+	 * 
+	 * </pre>
+	 * 
+	 * @param file
+	 * @return
+	 */
+	private InputStream getHeader(File root, File file) throws IOException {
+		long where = this.where;
+		ByteArrayOutputStream bout = new ByteArrayOutputStream();
+		// Signature
+		writeInt(bout, 0x04034b50);
+		writeInt(directory, 0x504b0102);
 
-        // Version needed to extract
-        writeShort(directory, 0);
+		// Version needed to extract
+		writeShort(directory, 0);
 
-        // Version needed to extract
-        writeShort(bout, 10);
-        writeShort(directory, 10);
+		// Version needed to extract
+		writeShort(bout, 10);
+		writeShort(directory, 10);
 
-        // General purpose bit flag (use descriptor)
-        writeShort(bout, 0); // descriptor follows data
-        writeShort(directory, 0); // descriptor follows data
+		// General purpose bit flag (use descriptor)
+		writeShort(bout, 0); // descriptor follows data
+		writeShort(directory, 0); // descriptor follows data
 
-        // Compresson method (stored)
-        writeShort(bout, 0);
-        writeShort(directory, 0);
+		// Compresson method (stored)
+		writeShort(bout, 0);
+		writeShort(directory, 0);
 
-        // Mod time
-        writeInt(bout, 0);
-        writeInt(directory, 0);
+		// Mod time
+		writeInt(bout, 0);
+		writeInt(directory, 0);
 
-        if (file.isDirectory()) {
-            writeInt(bout, 0); // CRC
-            writeInt(bout, 0); // Compressed size
-            writeInt(bout, 0); // Uncompressed Size
-            writeInt(directory, 0);
-            writeInt(directory, 0);
-            writeInt(directory, 0);
-        } else {
-            CRC32 crc = getCRC(file);
-            writeInt(bout, (int) crc.getValue());
-            writeInt(bout, (int) file.length());
-            writeInt(bout, (int) file.length());
-            writeInt(directory, (int) crc.getValue());
-            writeInt(directory, (int) file.length());
-            writeInt(directory, (int) file.length());
-        }
+		if (file.isDirectory()) {
+			writeInt(bout, 0); // CRC
+			writeInt(bout, 0); // Compressed size
+			writeInt(bout, 0); // Uncompressed Size
+			writeInt(directory, 0);
+			writeInt(directory, 0);
+			writeInt(directory, 0);
+		} else {
+			CRC32 crc = getCRC(file);
+			writeInt(bout, (int) crc.getValue());
+			writeInt(bout, (int) file.length());
+			writeInt(bout, (int) file.length());
+			writeInt(directory, (int) crc.getValue());
+			writeInt(directory, (int) file.length());
+			writeInt(directory, (int) file.length());
+		}
 
-        String p = getPath(root, file);
-        if (file.isDirectory())
-            p = p + "/";
-        byte[] path = p.getBytes("UTF-8");
-        writeShort(bout, path.length);
-        writeShort(directory, path.length);
+		String p = getPath(root, file);
+		if (file.isDirectory())
+			p = p + "/";
+		byte[] path = p.getBytes("UTF-8");
+		writeShort(bout, path.length);
+		writeShort(directory, path.length);
 
-        writeShort(bout, 0); // extra length
-        writeShort(directory, 0);
+		writeShort(bout, 0); // extra length
+		writeShort(directory, 0);
 
-        bout.write(path);
+		bout.write(path);
 
-        writeShort(directory, 0); // File comment length
-        writeShort(directory, 0); // disk number start 2 bytes
-        writeShort(directory, 0); // internal file attributes 2 bytes
-        writeInt(directory, 0); // external file attributes 4 bytes
-        writeInt(directory, (int) where); // relative offset of local header 4
-        // bytes
+		writeShort(directory, 0); // File comment length
+		writeShort(directory, 0); // disk number start 2 bytes
+		writeShort(directory, 0); // internal file attributes 2 bytes
+		writeInt(directory, 0); // external file attributes 4 bytes
+		writeInt(directory, (int) where); // relative offset of local header 4
+		// bytes
 
-        directory.write(path);
+		directory.write(path);
 
-        byte[] bytes = bout.toByteArray();
-        return new ByteArrayInputStream(bytes);
-    }
+		byte[] bytes = bout.toByteArray();
+		return new ByteArrayInputStream(bytes);
+	}
 
-    private String getPath(File root, File file) {
-        if (file.equals(root))
-            return "";
+	private String getPath(File root, File file) {
+		if (file.equals(root))
+			return "";
 
-        String p = getPath(root, file.getParentFile());
-        if (p.length() == 0)
-            p = file.getName();
-        else {
-            p = p + "/" + file.getName();
-        }
-        return p;
-    }
+		String p = getPath(root, file.getParentFile());
+		if (p.length() == 0)
+			p = file.getName();
+		else {
+			p = p + "/" + file.getName();
+		}
+		return p;
+	}
 
-    private CRC32 getCRC(File file) throws IOException {
-        CRC32 crc = new CRC32();
-        FileInputStream in = new FileInputStream(file);
-        try {
-            byte data[] = new byte[10000];
-            int size = in.read(data);
-            while (size > 0) {
-                crc.update(data, 0, size);
-                size = in.read(data);
-            }
-        } finally {
-            in.close();
-        }
-        return crc;
-    }
+	private CRC32 getCRC(File file) throws IOException {
+		CRC32 crc = new CRC32();
+		FileInputStream in = new FileInputStream(file);
+		try {
+			byte data[] = new byte[10000];
+			int size = in.read(data);
+			while (size > 0) {
+				crc.update(data, 0, size);
+				size = in.read(data);
+			}
+		}
+		finally {
+			in.close();
+		}
+		return crc;
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java b/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java
index d9c60cd..4fcbc34 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/JPAComponent.java
@@ -6,19 +6,17 @@
 
 /**
  * This component is called when we find a resource in the META-INF/*.xml
- * pattern. We parse the resource and and the imports to the builder.
- * 
- * Parsing is done with XSLT (first time I see the use of having XML for the
- * Spring configuration files!).
+ * pattern. We parse the resource and and the imports to the builder. Parsing is
+ * done with XSLT (first time I see the use of having XML for the Spring
+ * configuration files!).
  * 
  * @author aqute
- * 
  */
 public class JPAComponent extends XMLTypeProcessor {
-    
-    protected List<XMLType> getTypes(Analyzer analyzer) throws Exception {
-        List<XMLType> types = new ArrayList<XMLType>();        
-        process(types,"jpa.xsl", "META-INF", "persistence.xml");
-        return types;
-    }
+
+	protected List<XMLType> getTypes(Analyzer analyzer) throws Exception {
+		List<XMLType> types = new ArrayList<XMLType>();
+		process(types, "jpa.xsl", "META-INF", "persistence.xml");
+		return types;
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java b/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java
index 0109ad4..c8678a8 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/SpringComponent.java
@@ -15,24 +15,21 @@
 
 /**
  * This component is called when we find a resource in the META-INF/*.xml
- * pattern. We parse the resource and and the imports to the builder.
- * 
- * Parsing is done with XSLT (first time I see the use of having XML for the
- * Spring configuration files!).
+ * pattern. We parse the resource and and the imports to the builder. Parsing is
+ * done with XSLT (first time I see the use of having XML for the Spring
+ * configuration files!).
  * 
  * @author aqute
- * 
  */
 public class SpringComponent implements AnalyzerPlugin {
-	static Transformer transformer;
-	static Pattern SPRING_SOURCE = Pattern.compile("META-INF/spring/.*\\.xml");
-	static Pattern QN = Pattern.compile("[_A-Za-z$][_A-Za-z0-9$]*(\\.[_A-Za-z$][_A-Za-z0-9$]*)*");
+	static Transformer	transformer;
+	static Pattern		SPRING_SOURCE	= Pattern.compile("META-INF/spring/.*\\.xml");
+	static Pattern		QN				= Pattern.compile("[_A-Za-z$][_A-Za-z0-9$]*(\\.[_A-Za-z$][_A-Za-z0-9$]*)*");
 
 	public static Set<CharSequence> analyze(InputStream in) throws Exception {
 		if (transformer == null) {
 			TransformerFactory tf = TransformerFactory.newInstance();
-			Source source = new StreamSource(SpringComponent.class
-					.getResourceAsStream("extract.xsl"));
+			Source source = new StreamSource(SpringComponent.class.getResourceAsStream("extract.xsl"));
 			transformer = tf.newTransformer(source);
 		}
 
@@ -66,30 +63,32 @@
 		return refers;
 	}
 
-    public boolean analyzeJar(Analyzer analyzer) throws Exception {
-	    Jar jar = analyzer.getJar();
-	    Map<String, Resource> dir = jar.getDirectories().get("META-INF/spring");
-		if ( dir == null || dir.isEmpty())
+	public boolean analyzeJar(Analyzer analyzer) throws Exception {
+		Jar jar = analyzer.getJar();
+		Map<String,Resource> dir = jar.getDirectories().get("META-INF/spring");
+		if (dir == null || dir.isEmpty())
 			return false;
-		
-		for (Iterator<Entry<String, Resource>> i = dir.entrySet().iterator(); i.hasNext();) {
-			Entry<String, Resource> entry = i.next();
+
+		for (Iterator<Entry<String,Resource>> i = dir.entrySet().iterator(); i.hasNext();) {
+			Entry<String,Resource> entry = i.next();
 			String path = entry.getKey();
 			Resource resource = entry.getValue();
 			if (SPRING_SOURCE.matcher(path).matches()) {
 				try {
-				InputStream in = resource.openInputStream();
-				Set<CharSequence> set = analyze(in);
-				in.close();
-				for (Iterator<CharSequence> r = set.iterator(); r.hasNext();) {
-					PackageRef pack = analyzer.getPackageRef((String) r.next());
-					if ( !QN.matcher(pack.getFQN()).matches())
-					    analyzer.warning("Package does not seem a package in spring resource ("+path+"): " + pack );
-					if (!analyzer.getReferred().containsKey(pack))
-						analyzer.getReferred().put(pack, new Attrs());
+					InputStream in = resource.openInputStream();
+					Set<CharSequence> set = analyze(in);
+					in.close();
+					for (Iterator<CharSequence> r = set.iterator(); r.hasNext();) {
+						PackageRef pack = analyzer.getPackageRef((String) r.next());
+						if (!QN.matcher(pack.getFQN()).matches())
+							analyzer.warning("Package does not seem a package in spring resource (" + path + "): "
+									+ pack);
+						if (!analyzer.getReferred().containsKey(pack))
+							analyzer.getReferred().put(pack, new Attrs());
+					}
 				}
-				} catch( Exception e ) {
-					analyzer.error("Unexpected exception in processing spring resources("+path+"): " + e );
+				catch (Exception e) {
+					analyzer.error("Unexpected exception in processing spring resources(" + path + "): " + e);
 				}
 			}
 		}
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java b/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java
index 60eb922..b4840d0 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/SpringXMLType.java
@@ -6,28 +6,23 @@
 
 /**
  * This component is called when we find a resource in the META-INF/*.xml
- * pattern. We parse the resource and and the imports to the builder.
- * 
- * Parsing is done with XSLT (first time I see the use of having XML for the
- * Spring configuration files!).
+ * pattern. We parse the resource and and the imports to the builder. Parsing is
+ * done with XSLT (first time I see the use of having XML for the Spring
+ * configuration files!).
  * 
  * @author aqute
- * 
  */
 public class SpringXMLType extends XMLTypeProcessor {
 
-    protected List<XMLType> getTypes(Analyzer analyzer) throws Exception {
-        List<XMLType> types = new ArrayList<XMLType>();
-        
-        String header = analyzer.getProperty("Bundle-Blueprint", "OSGI-INF/blueprint");
-        process(types,"extract.xsl", header, ".*\\.xml");
-        header = analyzer.getProperty("Spring-Context", "META-INF/spring");
-        process(types,"extract.xsl", header, ".*\\.xml"); 
-        
-        return types;
-    }
+	protected List<XMLType> getTypes(Analyzer analyzer) throws Exception {
+		List<XMLType> types = new ArrayList<XMLType>();
 
- 
+		String header = analyzer.getProperty("Bundle-Blueprint", "OSGI-INF/blueprint");
+		process(types, "extract.xsl", header, ".*\\.xml");
+		header = analyzer.getProperty("Spring-Context", "META-INF/spring");
+		process(types, "extract.xsl", header, ".*\\.xml");
 
+		return types;
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java b/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java
index f7c6b33..7d65d1c 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/XMLType.java
@@ -12,97 +12,92 @@
 import aQute.lib.osgi.Descriptors.PackageRef;
 
 public class XMLType {
-    
-    Transformer    transformer;
-    Pattern        paths;
-    String          root;
-    
-    
-    static Pattern QN = Pattern
-                              .compile("[_A-Za-z$][_A-Za-z0-9$]*(\\.[_A-Za-z$][_A-Za-z0-9$]*)*");
 
-    public XMLType(URL source, String root, String paths ) throws Exception {
-        transformer = getTransformer(source);
-        this.paths = Pattern.compile(paths);
-        this.root = root;
-    }
-    
-    public Set<String> analyze(InputStream in) throws Exception {
-        Set<String> refers = new HashSet<String>();
+	Transformer		transformer;
+	Pattern			paths;
+	String			root;
 
-        ByteArrayOutputStream bout = new ByteArrayOutputStream();
-        Result r = new StreamResult(bout);
-        Source s = new StreamSource(in);
-        transformer.transform(s, r);
+	static Pattern	QN	= Pattern.compile("[_A-Za-z$][_A-Za-z0-9$]*(\\.[_A-Za-z$][_A-Za-z0-9$]*)*");
 
-        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
-        bout.close();
+	public XMLType(URL source, String root, String paths) throws Exception {
+		transformer = getTransformer(source);
+		this.paths = Pattern.compile(paths);
+		this.root = root;
+	}
 
-        BufferedReader br = new BufferedReader(new InputStreamReader(bin, "UTF8"));
+	public Set<String> analyze(InputStream in) throws Exception {
+		Set<String> refers = new HashSet<String>();
 
-        String line = br.readLine();
-        while (line != null) {
-            line = line.trim();
-            if (line.length() > 0) {
-                String parts[] = line.split("\\s*,\\s*");
-                for (int i = 0; i < parts.length; i++) {
-                    int n = parts[i].lastIndexOf('.');
-                    if (n > 0) {
-                        refers.add(parts[i].subSequence(0, n).toString());
-                    }
-                }
-            }
-            line = br.readLine();
-        }
-        br.close();
-        return refers;
-    }
+		ByteArrayOutputStream bout = new ByteArrayOutputStream();
+		Result r = new StreamResult(bout);
+		Source s = new StreamSource(in);
+		transformer.transform(s, r);
 
-    public boolean analyzeJar(Analyzer analyzer) throws Exception {
-        Jar jar = analyzer.getJar();
-        Map<String,Resource> dir = jar.getDirectories().get(root);
-        if (dir == null || dir.isEmpty()) {
-            Resource resource  = jar.getResource(root);
-            if ( resource != null )
-                process(analyzer, root, resource);
-            return false;
-        }
+		ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
+		bout.close();
 
-        for (Iterator<Map.Entry<String,Resource>> i = dir.entrySet().iterator(); i.hasNext();) {
-            Map.Entry<String,Resource> entry = i.next();
-            String path = entry.getKey();
-            Resource resource = entry.getValue();
-            if (paths.matcher(path).matches()) {
-                process(analyzer, path, resource);
-            }
-        }
-        return false;
-    }
+		BufferedReader br = new BufferedReader(new InputStreamReader(bin, "UTF8"));
 
-    private void process(Analyzer analyzer, String path, Resource resource) {
-        try {
-            InputStream in = resource.openInputStream();
-            Set<String> set = analyze(in);
-            in.close();
-            for (Iterator<String> r = set.iterator(); r.hasNext();) {
-                PackageRef pack = analyzer.getPackageRef(r.next());
-                if (!QN.matcher(pack.getFQN()).matches())
-                    analyzer
-                            .warning("Package does not seem a package in spring resource ("
-                                    + path + "): " + pack);
-                if (!analyzer.getReferred().containsKey(pack))
-                    analyzer.getReferred().put(pack);
-            }
-        } catch (Exception e) {
-            analyzer
-                    .error("Unexpected exception in processing spring resources("
-                            + path + "): " + e);
-        }
-    }
+		String line = br.readLine();
+		while (line != null) {
+			line = line.trim();
+			if (line.length() > 0) {
+				String parts[] = line.split("\\s*,\\s*");
+				for (int i = 0; i < parts.length; i++) {
+					int n = parts[i].lastIndexOf('.');
+					if (n > 0) {
+						refers.add(parts[i].subSequence(0, n).toString());
+					}
+				}
+			}
+			line = br.readLine();
+		}
+		br.close();
+		return refers;
+	}
 
-    protected Transformer getTransformer(java.net.URL url) throws Exception {
-        TransformerFactory tf = TransformerFactory.newInstance();
-        Source source = new StreamSource(url.openStream());
-        return tf.newTransformer(source);
-    }
+	public boolean analyzeJar(Analyzer analyzer) throws Exception {
+		Jar jar = analyzer.getJar();
+		Map<String,Resource> dir = jar.getDirectories().get(root);
+		if (dir == null || dir.isEmpty()) {
+			Resource resource = jar.getResource(root);
+			if (resource != null)
+				process(analyzer, root, resource);
+			return false;
+		}
+
+		for (Iterator<Map.Entry<String,Resource>> i = dir.entrySet().iterator(); i.hasNext();) {
+			Map.Entry<String,Resource> entry = i.next();
+			String path = entry.getKey();
+			Resource resource = entry.getValue();
+			if (paths.matcher(path).matches()) {
+				process(analyzer, path, resource);
+			}
+		}
+		return false;
+	}
+
+	private void process(Analyzer analyzer, String path, Resource resource) {
+		try {
+			InputStream in = resource.openInputStream();
+			Set<String> set = analyze(in);
+			in.close();
+			for (Iterator<String> r = set.iterator(); r.hasNext();) {
+				PackageRef pack = analyzer.getPackageRef(r.next());
+				if (!QN.matcher(pack.getFQN()).matches())
+					analyzer.warning("Package does not seem a package in spring resource (" + path + "): " + pack);
+				if (!analyzer.getReferred().containsKey(pack))
+					analyzer.getReferred().put(pack);
+			}
+		}
+		catch (Exception e) {
+			analyzer.error("Unexpected exception in processing spring resources(" + path + "): " + e);
+		}
+	}
+
+	protected Transformer getTransformer(java.net.URL url) throws Exception {
+		TransformerFactory tf = TransformerFactory.newInstance();
+		Source source = new StreamSource(url.openStream());
+		return tf.newTransformer(source);
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java b/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java
index 6ae0e7e..64abf3c 100644
--- a/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java
+++ b/bundleplugin/src/main/java/aQute/lib/spring/XMLTypeProcessor.java
@@ -7,28 +7,25 @@
 import aQute.libg.header.*;
 
 public class XMLTypeProcessor implements AnalyzerPlugin {
-    
-    public boolean analyzeJar(Analyzer analyzer) throws Exception {
-        List<XMLType> types = getTypes(analyzer);
-        for ( XMLType type : types ) {
-            type.analyzeJar(analyzer);
-        }
-        return false;
-    }
-    
-    protected List<XMLType> getTypes(Analyzer analyzer) throws Exception {
-        return new ArrayList<XMLType>();
-    }
 
+	public boolean analyzeJar(Analyzer analyzer) throws Exception {
+		List<XMLType> types = getTypes(analyzer);
+		for (XMLType type : types) {
+			type.analyzeJar(analyzer);
+		}
+		return false;
+	}
 
-    protected void process(List<XMLType> types, String resource, String paths,
-            String pattern) throws Exception {
-        
-        Parameters map = Processor.parseHeader(paths,null);
-        for ( String path : map.keySet() ) {
-            types.add( new XMLType( getClass().getResource(resource), path, pattern ));
-        }
-    }
+	protected List<XMLType> getTypes(Analyzer analyzer) throws Exception {
+		return new ArrayList<XMLType>();
+	}
 
+	protected void process(List<XMLType> types, String resource, String paths, String pattern) throws Exception {
+
+		Parameters map = Processor.parseHeader(paths, null);
+		for (String path : map.keySet()) {
+			types.add(new XMLType(getClass().getResource(resource), path, pattern));
+		}
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/lib/tag/Tag.java b/bundleplugin/src/main/java/aQute/lib/tag/Tag.java
index 5ec25a0..03ae971 100755
--- a/bundleplugin/src/main/java/aQute/lib/tag/Tag.java
+++ b/bundleplugin/src/main/java/aQute/lib/tag/Tag.java
@@ -13,7 +13,7 @@
 public class Tag {
 	Tag							parent;													// Parent
 	String						name;														// Name
-	final Map<String, String>	attributes	= new LinkedHashMap<String, String>();
+	final Map<String,String>	attributes	= new LinkedHashMap<String,String>();
 	final List<Object>			content		= new ArrayList<Object>();						// Content
 	SimpleDateFormat			format		= new SimpleDateFormat("yyyyMMddHHmmss.SSS");
 	boolean						cdata;
@@ -35,13 +35,13 @@
 	/**
 	 * Construct a new Tag with a name.
 	 */
-	public Tag(String name, Map<String, String> attributes, Object... contents) {
+	public Tag(String name, Map<String,String> attributes, Object... contents) {
 		this(name, contents);
 		this.attributes.putAll(attributes);
 
 	}
 
-	public Tag(String name, Map<String, String> attributes) {
+	public Tag(String name, Map<String,String> attributes) {
 		this(name, attributes, new Object[0]);
 	}
 
@@ -139,7 +139,7 @@
 	/**
 	 * Answer the attributes as a Dictionary object.
 	 */
-	public Map<String, String> getAttributes() {
+	public Map<String,String> getAttributes() {
 		return attributes;
 	}
 
@@ -256,22 +256,22 @@
 				pos = 0;
 			}
 			switch (c) {
-			case '<':
-				pw.print("&lt;");
-				pos += 4;
-				break;
-			case '>':
-				pw.print("&gt;");
-				pos += 4;
-				break;
-			case '&':
-				pw.print("&amp;");
-				pos += 5;
-				break;
-			default:
-				pw.print(c);
-				pos++;
-				break;
+				case '<' :
+					pw.print("&lt;");
+					pos += 4;
+					break;
+				case '>' :
+					pw.print("&gt;");
+					pos += 4;
+					break;
+				case '&' :
+					pw.print("&amp;");
+					pos += 5;
+					break;
+				default :
+					pw.print(c);
+					pos++;
+					break;
 			}
 
 		}
@@ -285,21 +285,21 @@
 		for (int i = 0; i < s.length(); i++) {
 			char c = s.charAt(i);
 			switch (c) {
-			case '<':
-				sb.append("&lt;");
-				break;
-			case '>':
-				sb.append("&gt;");
-				break;
-			case '\"':
-				sb.append("&quot;");
-				break;
-			case '&':
-				sb.append("&amp;");
-				break;
-			default:
-				sb.append(c);
-				break;
+				case '<' :
+					sb.append("&lt;");
+					break;
+				case '>' :
+					sb.append("&gt;");
+					break;
+				case '\"' :
+					sb.append("&quot;");
+					break;
+				case '&' :
+					sb.append("&amp;");
+					break;
+				default :
+					sb.append(c);
+					break;
 			}
 		}
 		return sb.toString();
@@ -390,10 +390,8 @@
 		if (mapping == null) {
 			return tn == sn || (sn != null && sn.equals(tn));
 		}
-		String suri = sn == null ? mapping.getAttribute("xmlns") : mapping
-				.getAttribute("xmlns:" + sn);
-		String turi = tn == null ? child.findRecursiveAttribute("xmlns") : child
-				.findRecursiveAttribute("xmlns:" + tn);
+		String suri = sn == null ? mapping.getAttribute("xmlns") : mapping.getAttribute("xmlns:" + sn);
+		String turi = tn == null ? child.findRecursiveAttribute("xmlns") : child.findRecursiveAttribute("xmlns:" + tn);
 		return turi == suri || (turi != null && suri != null && turi.equals(suri));
 	}