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/bnd/annotation/ConsumerType.java b/bundleplugin/src/main/java/aQute/bnd/annotation/ConsumerType.java
index cbbc17b..14d6822 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/ConsumerType.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/ConsumerType.java
@@ -7,8 +7,9 @@
  * that package will not change this interface in a minor update. Any backward
  * compatible change to this interface requires a major update of the version of
  * this package.
- * 
  */
-@Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface ConsumerType {
+@Retention(RetentionPolicy.CLASS)
+@Target(ElementType.TYPE)
+public @interface ConsumerType {
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/Export.java b/bundleplugin/src/main/java/aQute/bnd/annotation/Export.java
index 27ea389..72526af 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/Export.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/Export.java
@@ -5,26 +5,26 @@
 @Retention(RetentionPolicy.CLASS)
 @Target(ElementType.PACKAGE)
 public @interface Export {
-    String MANDATORY = "mandatory";
-    String OPTIONAL  = "optional";
-    String USES      = "uses";
-    String EXCLUDE   = "exclude";
-    String INCLUDE   = "include";
+	String	MANDATORY	= "mandatory";
+	String	OPTIONAL	= "optional";
+	String	USES		= "uses";
+	String	EXCLUDE		= "exclude";
+	String	INCLUDE		= "include";
 
-    String[] mandatory() default "";
+	String[] mandatory() default "";
 
-    String[] optional() default "";
+	String[] optional() default "";
 
-    Class<?>[] exclude() default Object.class;
+	Class< ? >[] exclude() default Object.class;
 
-    Class<?>[] include() default Object.class;
-    
-    /**
-     * Use {@link @Version} annotation instead
-     * @return
-     */
-    @Deprecated()
-    String version() default "";
-    
-    
+	Class< ? >[] include() default Object.class;
+
+	/**
+	 * Use {@link @Version} annotation instead
+	 * 
+	 * @return
+	 */
+	@Deprecated()
+	String version() default "";
+
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/ProviderType.java b/bundleplugin/src/main/java/aQute/bnd/annotation/ProviderType.java
index 15ee17e..183ef7b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/ProviderType.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/ProviderType.java
@@ -3,14 +3,10 @@
 import java.lang.annotation.*;
 
 /**
- * This type is provided for convenience because it is the default. A change 
- * in a provider type (that is all except Consumer types) can be changed with
- * only a minor update to the package API version number.
- * 
- * This interface is similar to the Eclipse @noextend and @noimplement annotations.
- * 
- * 
- * 
+ * This type is provided for convenience because it is the default. A change in
+ * a provider type (that is all except Consumer types) can be changed with only
+ * a minor update to the package API version number. This interface is similar
+ * to the Eclipse @noextend and @noimplement annotations.
  */
 @Retention(RetentionPolicy.CLASS)
 @Target(ElementType.TYPE)
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/UsePolicy.java b/bundleplugin/src/main/java/aQute/bnd/annotation/UsePolicy.java
index 36f0eaf..d4db6d9 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/UsePolicy.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/UsePolicy.java
@@ -7,14 +7,14 @@
  * treated as a use policy, not an implementation policy. Many package have
  * interfaces that are very stable and can be maintained backward compatible for
  * implementers during minor changes. For example, in Event Admin, the
- * EventAdmin implementers should follow the minor version, e.g. [1.1,1.2), however,
- * an implementer of EventHandler should not require such a small range. Therefore
- * an interface like EventHandler should use this anotation.
+ * EventAdmin implementers should follow the minor version, e.g. [1.1,1.2),
+ * however, an implementer of EventHandler should not require such a small
+ * range. Therefore an interface like EventHandler should use this anotation.
  */
 @Retention(RetentionPolicy.CLASS)
 @Target(ElementType.TYPE)
 @Deprecated
 public @interface UsePolicy {
-    String RNAME = "LaQute/bnd/annotation/UsePolicy;";
+	String	RNAME	= "LaQute/bnd/annotation/UsePolicy;";
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/Version.java b/bundleplugin/src/main/java/aQute/bnd/annotation/Version.java
index fae42b1..4fe1c56 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/Version.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/Version.java
@@ -3,7 +3,9 @@
 import java.lang.annotation.*;
 
 @Retention(RetentionPolicy.CLASS)
-@Target({ElementType.PACKAGE})
+@Target({
+	ElementType.PACKAGE
+})
 public @interface Version {
 	String value();
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Activate.java b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Activate.java
index 52284a0..e731669 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Activate.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Activate.java
@@ -5,6 +5,6 @@
 @Retention(RetentionPolicy.CLASS)
 @Target(ElementType.METHOD)
 public @interface Activate {
-    String RNAME = "LaQute/bnd/annotation/component/Activate;";
-    
+	String	RNAME	= "LaQute/bnd/annotation/component/Activate;";
+
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Component.java b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Component.java
index 1fb39d6..1d733ac 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Component.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Component.java
@@ -2,7 +2,9 @@
 
 import java.lang.annotation.*;
 
-@Retention(RetentionPolicy.CLASS) @Target(ElementType.TYPE) public @interface Component {
+@Retention(RetentionPolicy.CLASS)
+@Target(ElementType.TYPE)
+public @interface Component {
 	String	RNAME					= "LaQute/bnd/annotation/component/Component;";
 	String	PROVIDE					= "provide";
 	String	NAME					= "name";
@@ -18,7 +20,7 @@
 
 	String name() default "";
 
-	Class<?>[] provide() default Object.class;
+	Class< ? >[] provide() default Object.class;
 
 	String factory() default "";
 
@@ -32,7 +34,7 @@
 
 	String[] properties() default {};
 
-	Class<?> designate() default Object.class;
+	Class< ? > designate() default Object.class;
 
-	Class<?> designateFactory() default Object.class;
+	Class< ? > designateFactory() default Object.class;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/component/ConfigurationPolicy.java b/bundleplugin/src/main/java/aQute/bnd/annotation/component/ConfigurationPolicy.java
index 7651557..9e10951 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/component/ConfigurationPolicy.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/component/ConfigurationPolicy.java
@@ -1,5 +1,5 @@
 package aQute.bnd.annotation.component;
 
 public enum ConfigurationPolicy {
-    optional, require, ignore;
+	optional, require, ignore;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Deactivate.java b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Deactivate.java
index 5858ea0..60c7be4 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Deactivate.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Deactivate.java
@@ -5,6 +5,6 @@
 @Retention(RetentionPolicy.CLASS)
 @Target(ElementType.METHOD)
 public @interface Deactivate {
-    String RNAME = "LaQute/bnd/annotation/component/Deactivate;";
+	String	RNAME	= "LaQute/bnd/annotation/component/Deactivate;";
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Modified.java b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Modified.java
index 655a535..ae36b7f 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Modified.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Modified.java
@@ -5,6 +5,6 @@
 @Retention(RetentionPolicy.CLASS)
 @Target(ElementType.METHOD)
 public @interface Modified {
-    String RNAME = "LaQute/bnd/annotation/component/Modified;";
+	String	RNAME	= "LaQute/bnd/annotation/component/Modified;";
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Reference.java b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Reference.java
index 58894dd..2a71bac 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/component/Reference.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/component/Reference.java
@@ -5,29 +5,29 @@
 @Retention(RetentionPolicy.CLASS)
 @Target(ElementType.METHOD)
 public @interface Reference {
-    String RNAME    = "LaQute/bnd/annotation/component/Reference;";
-    String NAME     = "name";
-    String SERVICE  = "service";
-    String OPTIONAL = "optional";
-    String MULTIPLE = "multiple";
-    String DYNAMIC  = "dynamic";
-    String TARGET   = "target";
-    String TYPE     = "type";
-    String UNBIND   = "unbind";
+	String	RNAME		= "LaQute/bnd/annotation/component/Reference;";
+	String	NAME		= "name";
+	String	SERVICE		= "service";
+	String	OPTIONAL	= "optional";
+	String	MULTIPLE	= "multiple";
+	String	DYNAMIC		= "dynamic";
+	String	TARGET		= "target";
+	String	TYPE		= "type";
+	String	UNBIND		= "unbind";
 
-    String name() default "";
+	String name() default "";
 
-    Class<?> service() default Object.class;
+	Class< ? > service() default Object.class;
 
-    boolean optional() default false;
+	boolean optional() default false;
 
-    boolean multiple() default false;
+	boolean multiple() default false;
 
-    boolean dynamic() default false;
+	boolean dynamic() default false;
 
-    String target() default "";
-    
-    String unbind() default "";
+	String target() default "";
 
-    char type() default 0;
+	String unbind() default "";
+
+	char type() default 0;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Configurable.java b/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Configurable.java
index ecaaa7b..3dcaae5 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Configurable.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Configurable.java
@@ -4,17 +4,21 @@
 import java.util.*;
 import java.util.regex.*;
 
-@SuppressWarnings( { "unchecked", "rawtypes" }) public class Configurable<T> {
-	
-	public static <T> T createConfigurable(Class<T> c, Map<?, ?> properties) {
-		Object o = Proxy.newProxyInstance(c.getClassLoader(), new Class<?>[] { c },
-				new ConfigurableHandler(properties, c.getClassLoader()));
+@SuppressWarnings({
+		"unchecked", "rawtypes"
+})
+public class Configurable<T> {
+
+	public static <T> T createConfigurable(Class<T> c, Map< ? , ? > properties) {
+		Object o = Proxy.newProxyInstance(c.getClassLoader(), new Class< ? >[] {
+			c
+		}, new ConfigurableHandler(properties, c.getClassLoader()));
 		return c.cast(o);
 	}
 
-	public static <T> T createConfigurable(Class<T> c, Dictionary<?, ?> properties) {
+	public static <T> T createConfigurable(Class<T> c, Dictionary< ? , ? > properties) {
 		Map<Object,Object> alt = new HashMap<Object,Object>();
-		for( Enumeration<?> e = properties.keys(); e.hasMoreElements(); ) {
+		for (Enumeration< ? > e = properties.keys(); e.hasMoreElements();) {
 			Object key = e.nextElement();
 			alt.put(key, properties.get(key));
 		}
@@ -22,10 +26,10 @@
 	}
 
 	static class ConfigurableHandler implements InvocationHandler {
-		final Map<?, ?>	properties;
-		final ClassLoader			loader;
+		final Map< ? , ? >	properties;
+		final ClassLoader	loader;
 
-		ConfigurableHandler(Map<?, ?> properties, ClassLoader loader) {
+		ConfigurableHandler(Map< ? , ? > properties, ClassLoader loader) {
 			this.properties = properties;
 			this.loader = loader;
 		}
@@ -42,8 +46,7 @@
 			if (o == null) {
 				if (ad != null) {
 					if (ad.required())
-						throw new IllegalStateException("Attribute is required but not set "
-								+ method.getName());
+						throw new IllegalStateException("Attribute is required but not set " + method.getName());
 
 					o = ad.deflt();
 					if (o.equals(Meta.NULL))
@@ -51,10 +54,10 @@
 				}
 			}
 			if (o == null) {
-				Class<?> rt = method.getReturnType();
-				if ( rt == boolean.class || rt==Boolean.class)
+				Class< ? > rt = method.getReturnType();
+				if (rt == boolean.class || rt == Boolean.class)
 					return false;
-				
+
 				if (method.getReturnType().isPrimitive()) {
 
 					o = "0";
@@ -65,8 +68,7 @@
 			return convert(method.getGenericReturnType(), o);
 		}
 
-		public Object convert(Type type, Object o)
-				throws Exception {
+		public Object convert(Type type, Object o) throws Exception {
 			if (type instanceof ParameterizedType) {
 				ParameterizedType pType = (ParameterizedType) type;
 				return convert(pType, o);
@@ -77,20 +79,20 @@
 				return convertArray(gType.getGenericComponentType(), o);
 			}
 
-			Class<?> resultType = (Class<?>) type;
+			Class< ? > resultType = (Class< ? >) type;
 
 			if (resultType.isArray()) {
 				return convertArray(resultType.getComponentType(), o);
 			}
 
-			Class<?> actualType = o.getClass();
+			Class< ? > actualType = o.getClass();
 			if (actualType.isAssignableFrom(resultType))
 				return o;
 
 			if (resultType == boolean.class || resultType == Boolean.class) {
-				if ( actualType == boolean.class || actualType == Boolean.class)
+				if (actualType == boolean.class || actualType == Boolean.class)
 					return o;
-				
+
 				if (Number.class.isAssignableFrom(actualType)) {
 					double b = ((Number) o).doubleValue();
 					if (b == 0)
@@ -99,7 +101,7 @@
 						return true;
 				}
 				return true;
-				
+
 			} else if (resultType == byte.class || resultType == Byte.class) {
 				if (Number.class.isAssignableFrom(actualType))
 					return ((Number) o).byteValue();
@@ -148,37 +150,41 @@
 			}
 
 			try {
-				Constructor<?> c = resultType.getConstructor(String.class);
+				Constructor< ? > c = resultType.getConstructor(String.class);
 				return c.newInstance(o.toString());
-			} catch (Throwable t) {
+			}
+			catch (Throwable t) {
 				// handled on next line
 			}
-			throw new IllegalArgumentException("No conversion to " + resultType + " from "
-					+ actualType + " value " + o);
+			throw new IllegalArgumentException("No conversion to " + resultType + " from " + actualType + " value " + o);
 		}
 
 		private Object convert(ParameterizedType pType, Object o) throws InstantiationException,
 				IllegalAccessException, Exception {
-			Class<?> resultType = (Class<?>) pType.getRawType();
+			Class< ? > resultType = (Class< ? >) pType.getRawType();
 			if (Collection.class.isAssignableFrom(resultType)) {
-				Collection<?> input = toCollection(o);
+				Collection< ? > input = toCollection(o);
 				if (resultType.isInterface()) {
 					if (resultType == Collection.class || resultType == List.class)
 						resultType = ArrayList.class;
 					else if (resultType == Set.class || resultType == SortedSet.class)
 						resultType = TreeSet.class;
-					else if (resultType == Queue.class /*|| resultType == Deque.class*/)
+					else if (resultType == Queue.class /*
+														 * || resultType ==
+														 * Deque.class
+														 */)
 						resultType = LinkedList.class;
-					else if (resultType == Queue.class /*|| resultType == Deque.class*/)
+					else if (resultType == Queue.class /*
+														 * || resultType ==
+														 * Deque.class
+														 */)
 						resultType = LinkedList.class;
 					else
 						throw new IllegalArgumentException(
-								"Unknown interface for a collection, no concrete class found: "
-										+ resultType);
+								"Unknown interface for a collection, no concrete class found: " + resultType);
 				}
-				
-				Collection<Object> result = (Collection<Object>) resultType
-						.newInstance();
+
+				Collection<Object> result = (Collection<Object>) resultType.newInstance();
 				Type componentType = pType.getActualTypeArguments()[0];
 
 				for (Object i : input) {
@@ -188,8 +194,8 @@
 			} else if (pType.getRawType() == Class.class) {
 				return loader.loadClass(o.toString());
 			}
-			if (Map.class.isAssignableFrom(resultType)){
-				Map<?,?> input = toMap(o);
+			if (Map.class.isAssignableFrom(resultType)) {
+				Map< ? , ? > input = toMap(o);
 				if (resultType.isInterface()) {
 					if (resultType == SortedMap.class)
 						resultType = TreeMap.class;
@@ -197,16 +203,14 @@
 						resultType = LinkedHashMap.class;
 					else
 						throw new IllegalArgumentException(
-								"Unknown interface for a collection, no concrete class found: "
-										+ resultType);
+								"Unknown interface for a collection, no concrete class found: " + resultType);
 				}
-				Map<Object,Object> result = (Map<Object,Object>) resultType
-						.newInstance();
+				Map<Object,Object> result = (Map<Object,Object>) resultType.newInstance();
 				Type keyType = pType.getActualTypeArguments()[0];
 				Type valueType = pType.getActualTypeArguments()[1];
 
-				for ( Map.Entry<?, ?> entry : input.entrySet()) {
-					result.put(convert(keyType,entry.getKey()), convert(valueType,entry.getValue()));
+				for (Map.Entry< ? , ? > entry : input.entrySet()) {
+					result.put(convert(keyType, entry.getKey()), convert(valueType, entry.getValue()));
 				}
 				return result;
 			}
@@ -214,10 +218,9 @@
 					+ " because it uses generics and is not a Collection or a map");
 		}
 
-
 		Object convertArray(Type componentType, Object o) throws Exception {
-			Collection<?> input = toCollection(o);
-			Class<?> componentClass = getRawClass(componentType);
+			Collection< ? > input = toCollection(o);
+			Class< ? > componentClass = getRawClass(componentType);
 			Object array = Array.newInstance(componentClass, input.size());
 
 			int i = 0;
@@ -227,67 +230,63 @@
 			return array;
 		}
 
-		private Class<?> getRawClass(Type type) {
+		private Class< ? > getRawClass(Type type) {
 			if (type instanceof Class)
-				return (Class<?>) type;
+				return (Class< ? >) type;
 
 			if (type instanceof ParameterizedType)
-				return (Class<?>) ((ParameterizedType) type).getRawType();
+				return (Class< ? >) ((ParameterizedType) type).getRawType();
 
-			throw new IllegalArgumentException(
-					"For the raw type, type must be ParamaterizedType or Class but is " + type);
+			throw new IllegalArgumentException("For the raw type, type must be ParamaterizedType or Class but is "
+					+ type);
 		}
 
-		private Collection<?> toCollection(Object o) {
+		private Collection< ? > toCollection(Object o) {
 			if (o instanceof Collection)
-				return (Collection<?>) o;
+				return (Collection< ? >) o;
 
 			if (o.getClass().isArray()) {
-				if ( o.getClass().getComponentType().isPrimitive()) {
+				if (o.getClass().getComponentType().isPrimitive()) {
 					int length = Array.getLength(o);
 					List<Object> result = new ArrayList<Object>(length);
-					for ( int i=0; i<length; i++) {
-						result.add( Array.get(o, i));
+					for (int i = 0; i < length; i++) {
+						result.add(Array.get(o, i));
 					}
 					return result;
 				} else
 					return Arrays.asList((Object[]) o);
 			}
 
-			if ( o instanceof String) {
-				String s = (String)o;
-				if (s.indexOf('|')>0)
-					return Arrays.asList(s.split("\\|"));					
+			if (o instanceof String) {
+				String s = (String) o;
+				if (s.indexOf('|') > 0)
+					return Arrays.asList(s.split("\\|"));
 			}
 			return Arrays.asList(o);
 		}
-		
-		private Map<?, ?> toMap(Object o) {
-			if ( o instanceof Map) 
-				return (Map<?, ?>) o;
-			
-			throw new IllegalArgumentException(
-					"Cannot convert " + o + " to a map as requested");
+
+		private Map< ? , ? > toMap(Object o) {
+			if (o instanceof Map)
+				return (Map< ? , ? >) o;
+
+			throw new IllegalArgumentException("Cannot convert " + o + " to a map as requested");
 		}
 
-
 	}
-	
-	
+
 	public static String mangleMethodName(String id) {
 		StringBuilder sb = new StringBuilder(id);
-		for ( int i =0; i<sb.length(); i++) {
-			char c  = sb.charAt(i);
-			boolean twice = i < sb.length()-1 && sb.charAt(i+1) ==c;
-			if ( c == '$' || c == '_') {
-				if ( twice )
-					sb.deleteCharAt(i+1);
-				else 
-					if ( c == '$')
-						sb.deleteCharAt(i--); // Remove dollars
-					else
-						sb.setCharAt(i, '.'); // Make _ into .
-			}				
+		for (int i = 0; i < sb.length(); i++) {
+			char c = sb.charAt(i);
+			boolean twice = i < sb.length() - 1 && sb.charAt(i + 1) == c;
+			if (c == '$' || c == '_') {
+				if (twice)
+					sb.deleteCharAt(i + 1);
+				else if (c == '$')
+					sb.deleteCharAt(i--); // Remove dollars
+				else
+					sb.setCharAt(i, '.'); // Make _ into .
+			}
 		}
 		return sb.toString();
 	}
diff --git a/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Meta.java b/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Meta.java
index a2686e5..d7b6745 100644
--- a/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Meta.java
+++ b/bundleplugin/src/main/java/aQute/bnd/annotation/metatype/Meta.java
@@ -13,16 +13,7 @@
 
 public interface Meta {
 	enum Type {
-		Boolean,
-		Byte,
-		Character,
-		Short,
-		Integer,
-		Long,
-		Float,
-		Double,
-		String,
-		Password
+		Boolean, Byte, Character, Short, Integer, Long, Float, Double, String, Password
 	}
 
 	/**
@@ -34,9 +25,10 @@
 	 * The OCD Annotation maps to the OCD element in the Metatype specification.
 	 * The only difference is that it is possible to create a Designate element
 	 * as well.
-	 * 
 	 */
-	@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface OCD {
+	@Target(ElementType.TYPE)
+	@Retention(RetentionPolicy.RUNTIME)
+	@interface OCD {
 		/**
 		 * The name for this component. The default name is a the short class
 		 * name that us un-camel cased to make it more readable.
@@ -48,7 +40,6 @@
 		/**
 		 * The id of the component. Default the name of the class in FQN
 		 * notation but with nested classes using the $ as separator (not .).
-		 * 
 		 * The Felix webconsole always uses this id as the PID and not the pid
 		 * in the Designate element. Reported as an error.
 		 * 
@@ -79,9 +70,10 @@
 
 	/**
 	 * The AD element in the Metatype specification.
-	 * 
 	 */
-	@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @interface AD {
+	@Target(ElementType.METHOD)
+	@Retention(RetentionPolicy.RUNTIME)
+	@interface AD {
 		/**
 		 * A description of the attribute. Default is empty.
 		 * 
@@ -119,10 +111,9 @@
 		/**
 		 * The cardinality of the attribute. If not explicitly set it will be
 		 * derived from the attributes return type. Collections return
-		 * Integer.MIN_VALUE and arrays use Integer.MAX_VALUE.
-		 * 
-		 * If a single string needs to be converted to a Collection or array
-		 * then the | will be used as a separator to split the line.
+		 * Integer.MIN_VALUE and arrays use Integer.MAX_VALUE. If a single
+		 * string needs to be converted to a Collection or array then the | will
+		 * be used as a separator to split the line.
 		 * 
 		 * @return the cardinality of the attribute
 		 */
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/CircularDependencyException.java b/bundleplugin/src/main/java/aQute/bnd/build/CircularDependencyException.java
index f08255b..c56a8eb 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/CircularDependencyException.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/CircularDependencyException.java
@@ -1,10 +1,10 @@
 package aQute.bnd.build;
 
 public class CircularDependencyException extends Exception {
-    public CircularDependencyException(String string) {
-        super(string);
-    }
+	public CircularDependencyException(String string) {
+		super(string);
+	}
 
-    private static final long serialVersionUID = 1L;
+	private static final long	serialVersionUID	= 1L;
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/Container.java b/bundleplugin/src/main/java/aQute/bnd/build/Container.java
index 2fb38d9..e0aac8a 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/Container.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/Container.java
@@ -18,12 +18,12 @@
 	final String				version;
 	final String				error;
 	final Project				project;
-	volatile Map<String, String>	attributes;
+	volatile Map<String,String>	attributes;
 	private long				manifestTime;
 	private Manifest			manifest;
 
 	Container(Project project, String bsn, String version, TYPE type, File source, String error,
-			Map<String, String> attributes) {
+			Map<String,String> attributes) {
 		this.bsn = bsn;
 		this.version = version;
 		this.type = type;
@@ -57,32 +57,32 @@
 	 */
 	public boolean contributeFiles(List<File> files, Processor reporter) throws Exception {
 		switch (type) {
-		case EXTERNAL:
-		case REPO:
-			files.add(file);
-			return true;
+			case EXTERNAL :
+			case REPO :
+				files.add(file);
+				return true;
 
-		case PROJECT:
-			File[] fs = project.build();
-			reporter.getInfo(project);
-			if (fs == null)
-				return false;
-
-			for (File f : fs)
-				files.add(f);
-			return true;
-
-		case LIBRARY:
-			List<Container> containers = getMembers();
-			for (Container container : containers) {
-				if (!container.contributeFiles(files, reporter))
+			case PROJECT :
+				File[] fs = project.build();
+				reporter.getInfo(project);
+				if (fs == null)
 					return false;
-			}
-			return true;
 
-		case ERROR:
-			reporter.error(error);
-			return false;
+				for (File f : fs)
+					files.add(f);
+				return true;
+
+			case LIBRARY :
+				List<Container> containers = getMembers();
+				for (Container container : containers) {
+					if (!container.contributeFiles(files, reporter))
+						return false;
+				}
+				return true;
+
+			case ERROR :
+				reporter.error(error);
+				return false;
 		}
 		return false;
 	}
@@ -130,13 +130,13 @@
 			return getFile().getAbsolutePath();
 	}
 
-	public Map<String, String> getAttributes() {
+	public Map<String,String> getAttributes() {
 		return attributes;
 	}
-	
+
 	public void putAttribute(String name, String value) {
-		if (attributes == Collections.<String,String>emptyMap())
-			attributes = new HashMap<String, String>(1);
+		if (attributes == Collections.<String, String> emptyMap())
+			attributes = new HashMap<String,String>(1);
 		attributes.put(name, value);
 	}
 
@@ -162,8 +162,7 @@
 			String line;
 			try {
 				in = new FileInputStream(file);
-				rd = new BufferedReader(new InputStreamReader(in,
-						Constants.DEFAULT_CHARSET));
+				rd = new BufferedReader(new InputStreamReader(in, Constants.DEFAULT_CHARSET));
 				while ((line = rd.readLine()) != null) {
 					line = line.trim();
 					if (!line.startsWith("#") && line.length() > 0) {
@@ -171,7 +170,8 @@
 						result.addAll(list);
 					}
 				}
-			} finally {
+			}
+			finally {
 				if (rd != null) {
 					rd.close();
 				}
@@ -201,7 +201,8 @@
 				manifest = jin.getManifest();
 				jin.close();
 				manifestTime = getFile().lastModified();
-			} finally {
+			}
+			finally {
 				in.close();
 			}
 		}
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/Project.java b/bundleplugin/src/main/java/aQute/bnd/build/Project.java
index 034a364..192be5d 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/Project.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/Project.java
@@ -5,7 +5,6 @@
 import java.net.*;
 import java.util.*;
 import java.util.Map.Entry;
-import java.util.concurrent.*;
 import java.util.concurrent.locks.*;
 import java.util.jar.*;
 
@@ -19,14 +18,12 @@
 import aQute.lib.osgi.eclipse.*;
 import aQute.libg.generics.*;
 import aQute.libg.header.*;
+import aQute.libg.reporter.*;
 import aQute.libg.sed.*;
 import aQute.libg.version.*;
 
 /**
  * This class is NOT threadsafe
- * 
- * @author aqute
- * 
  */
 
 public class Project extends Processor {
@@ -56,6 +53,7 @@
 	File						files[];
 	static List<Project>		trail					= new ArrayList<Project>();
 	boolean						delayRunDependencies	= false;
+	final ProjectMessages		msgs					= ReporterMessages.base(this, ProjectMessages.class);
 
 	public Project(Workspace workspace, File projectDir, File buildFile) throws Exception {
 		super(workspace);
@@ -76,7 +74,7 @@
 			File f = getFile("build.properties");
 			if (f.isFile()) {
 				Properties p = loadProperties(f);
-				for (Enumeration<?> e = p.propertyNames(); e.hasMoreElements();) {
+				for (Enumeration< ? > e = p.propertyNames(); e.hasMoreElements();) {
 					String key = (String) e.nextElement();
 					String newkey = key;
 					if (key.indexOf('$') >= 0) {
@@ -85,7 +83,8 @@
 					setProperty(newkey, p.getProperty(key));
 				}
 			}
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
@@ -206,7 +205,7 @@
 						getWorkspace().changedFile(output);
 					}
 					if (!output.isDirectory())
-						error("Can not find output directory: " + output);
+						msgs.NoOutputDirectory_(output);
 					else {
 						Container c = new Container(this, output);
 						if (!buildpath.contains(c))
@@ -240,7 +239,7 @@
 					for (String p : requiredProjectNames) {
 						Project required = getWorkspace().getProject(p);
 						if (required == null)
-							error("No such project " + p + " on " + Constants.DEPENDSON);
+							msgs.MissingDependson_(p);
 						else {
 							dependencies.add(required);
 						}
@@ -279,11 +278,13 @@
 					}
 					if (isOk())
 						preparedPaths = true;
-				} finally {
+				}
+				finally {
 					inPrepare = false;
 				}
 			}
-		} finally {
+		}
+		finally {
 			trail.remove(this);
 		}
 	}
@@ -315,8 +316,8 @@
 	 * @param entries
 	 *            The input list of classpath entries
 	 */
-	private void doPath(Collection<Container> resultpath, Collection<Project> projects,
-			Collection<Container> entries, Collection<Container> bootclasspath) {
+	private void doPath(Collection<Container> resultpath, Collection<Project> projects, Collection<Container> entries,
+			Collection<Container> bootclasspath) {
 		for (Container cpe : entries) {
 			if (cpe.getError() != null)
 				error(cpe.getError());
@@ -324,8 +325,8 @@
 				if (cpe.getType() == Container.TYPE.PROJECT) {
 					projects.add(cpe.getProject());
 				}
-				if (bootclasspath != null && cpe.getBundleSymbolicName().startsWith("ee.")
-						|| cpe.getAttributes().containsKey("boot"))
+				if (bootclasspath != null
+						&& (cpe.getBundleSymbolicName().startsWith("ee.") || cpe.getAttributes().containsKey("boot")))
 					bootclasspath.add(cpe);
 				else
 					resultpath.add(cpe);
@@ -335,7 +336,6 @@
 
 	/**
 	 * Parse the list of bundles that are a prerequisite to this project.
-	 * 
 	 * Bundles are listed in repo specific names. So we just let our repo
 	 * plugins iterate over the list of bundles and we get the highest version
 	 * from them.
@@ -344,10 +344,8 @@
 	 */
 
 	private List<Container> parseBuildpath() throws Exception {
-		List<Container> bundles = getBundles(Strategy.LOWEST, getProperty(Constants.BUILDPATH),
-				Constants.BUILDPATH);
-		appendPackages(Strategy.LOWEST, getProperty(Constants.BUILDPACKAGES), bundles,
-				ResolverMode.build);
+		List<Container> bundles = getBundles(Strategy.LOWEST, getProperty(Constants.BUILDPATH), Constants.BUILDPATH);
+		appendPackages(Strategy.LOWEST, getProperty(Constants.BUILDPACKAGES), bundles, ResolverMode.build);
 		return bundles;
 	}
 
@@ -378,16 +376,15 @@
 	 * @return
 	 */
 
-	public List<Container> getBundles(Strategy strategyx, String spec, String source)
-			throws Exception {
+	public List<Container> getBundles(Strategy strategyx, String spec, String source) throws Exception {
 		List<Container> result = new ArrayList<Container>();
 		Parameters bundles = new Parameters(spec);
 
 		try {
-			for (Iterator<Entry<String, Attrs>> i = bundles.entrySet().iterator(); i.hasNext();) {
-				Entry<String, Attrs> entry = i.next();
-				String bsn = entry.getKey();
-				Map<String, String> attrs = entry.getValue();
+			for (Iterator<Entry<String,Attrs>> i = bundles.entrySet().iterator(); i.hasNext();) {
+				Entry<String,Attrs> entry = i.next();
+				String bsn = removeDuplicateMarker(entry.getKey());
+				Map<String,String> attrs = entry.getValue();
 
 				Container found = null;
 
@@ -399,16 +396,13 @@
 					}
 				}
 				if (found == null) {
-					if (versionRange != null
-							&& (versionRange.equals("project") || versionRange.equals("latest"))) {
+					if (versionRange != null && (versionRange.equals("project") || versionRange.equals("latest"))) {
 						Project project = getWorkspace().getProject(bsn);
 						if (project != null && project.exists()) {
 							File f = project.getOutput();
-							found = new Container(project, bsn, versionRange,
-									Container.TYPE.PROJECT, f, null, attrs);
+							found = new Container(project, bsn, versionRange, Container.TYPE.PROJECT, f, null, attrs);
 						} else {
-							error("Reference to project that does not exist in workspace\n"
-									+ "  Project       %s\n" + "  Specification %s", bsn, spec);
+							msgs.NoSuchProject(bsn, spec);
 							continue;
 						}
 					} else if (versionRange != null && versionRange.equals("file")) {
@@ -417,11 +411,9 @@
 						if (!f.exists())
 							error = "File does not exist: " + f.getAbsolutePath();
 						if (f.getName().endsWith(".lib")) {
-							found = new Container(this, bsn, "file", Container.TYPE.LIBRARY, f,
-									error, attrs);
+							found = new Container(this, bsn, "file", Container.TYPE.LIBRARY, f, error, attrs);
 						} else {
-							found = new Container(this, bsn, "file", Container.TYPE.EXTERNAL, f,
-									error, attrs);
+							found = new Container(this, bsn, "file", Container.TYPE.EXTERNAL, f, error, attrs);
 						}
 					} else {
 						found = getBundle(bsn, versionRange, strategyx, attrs);
@@ -432,26 +424,27 @@
 					List<Container> libs = found.getMembers();
 					for (Container cc : libs) {
 						if (result.contains(cc))
-							warning("Multiple bundles with the same final URL: " + cc);
-
-						result.add(cc);
+							warning("Multiple bundles with the same final URL: %s, dropped duplicate", cc);
+						else
+							result.add(cc);
 					}
 				} else {
 					// Oops, not a bundle in sight :-(
-					Container x = new Container(this, bsn, versionRange, Container.TYPE.ERROR,
-							null, bsn + ";version=" + versionRange + " not found", attrs);
+					Container x = new Container(this, bsn, versionRange, Container.TYPE.ERROR, null, bsn + ";version="
+							+ versionRange + " not found", attrs);
 					result.add(x);
 					warning("Can not find URL for bsn " + bsn);
 				}
 			}
-		} catch (CircularDependencyException e) {
+		}
+		catch (CircularDependencyException e) {
 			String message = e.getMessage();
 			if (source != null)
 				message = String.format("%s (from property: %s)", message, source);
-			error("Circular dependency detected from project %s: %s", e, getName(), message);
-		} catch (Exception e) {
-			error("Unexpected error while trying to get the bundles from " + spec, e);
-			e.printStackTrace();
+			msgs.CircularDependencyContext_Message_(getName(), message);
+		}
+		catch (Exception e) {
+			msgs.Unexpected_Error_(spec, e);
 		}
 		return result;
 	}
@@ -460,7 +453,6 @@
 	 * Just calls a new method with a default parm.
 	 * 
 	 * @throws Exception
-	 * 
 	 */
 	Collection<Container> getBundles(Strategy strategy, String spec) throws Exception {
 		return getBundles(strategy, spec, null);
@@ -476,18 +468,18 @@
 	 *            The value of the @{code -buildpackages} instruction.
 	 * @throws Exception
 	 */
-	public void appendPackages(Strategy strategyx, String spec, List<Container> resolvedBundles,
-			ResolverMode mode) throws Exception {
-		Map<File, Container> pkgResolvedBundles = new HashMap<File, Container>();
+	public void appendPackages(Strategy strategyx, String spec, List<Container> resolvedBundles, ResolverMode mode)
+			throws Exception {
+		Map<File,Container> pkgResolvedBundles = new HashMap<File,Container>();
 
-		List<Entry<String, Attrs>> queue = new LinkedList<Map.Entry<String, Attrs>>();
+		List<Entry<String,Attrs>> queue = new LinkedList<Map.Entry<String,Attrs>>();
 		queue.addAll(new Parameters(spec).entrySet());
 
 		while (!queue.isEmpty()) {
-			Entry<String, Attrs> entry = queue.remove(0);
+			Entry<String,Attrs> entry = queue.remove(0);
 
 			String pkgName = entry.getKey();
-			Map<String, String> attrs = entry.getValue();
+			Map<String,String> attrs = entry.getValue();
 
 			Container found = null;
 
@@ -520,8 +512,8 @@
 				}
 			} else {
 				// Unable to resolve
-				Container x = new Container(this, "X", versionRange, Container.TYPE.ERROR, null,
-						"package " + pkgName + ";version=" + versionRange + " not found", attrs);
+				Container x = new Container(this, "X", versionRange, Container.TYPE.ERROR, null, "package " + pkgName
+						+ ";version=" + versionRange + " not found", attrs);
 				resolvedBundles.add(x);
 				warning("Can not find URL for package " + pkgName);
 			}
@@ -576,14 +568,14 @@
 	 * @return
 	 * @throws Exception
 	 */
-	public Container getPackage(String packageName, String range, Strategy strategyx,
-			Map<String, String> attrs, ResolverMode mode) throws Exception {
+	public Container getPackage(String packageName, String range, Strategy strategyx, Map<String,String> attrs,
+			ResolverMode mode) throws Exception {
 		if ("snapshot".equals(range))
 			return new Container(this, "", range, Container.TYPE.ERROR, null,
 					"snapshot not supported for package lookups", null);
 
 		if (attrs == null)
-			attrs = new HashMap<String, String>(2);
+			attrs = new HashMap<String,String>(2);
 		attrs.put("package", packageName);
 		attrs.put("mode", mode.name());
 
@@ -595,23 +587,20 @@
 				File result = plugin.get(null, range, useStrategy, attrs);
 				if (result != null) {
 					if (result.getName().endsWith("lib"))
-						return new Container(this, result.getName(), range, Container.TYPE.LIBRARY,
-								result, null, attrs);
-					else
-						return new Container(this, result.getName(), range, Container.TYPE.REPO,
-								result, null, attrs);
+						return new Container(this, result.getName(), range, Container.TYPE.LIBRARY, result, null, attrs);
+					return new Container(this, result.getName(), range, Container.TYPE.REPO, result, null, attrs);
 				}
-			} catch (Exception e) {
+			}
+			catch (Exception e) {
 				// Ignore... lots of repos will fail here
 			}
 		}
 
-		return new Container(this, "X", range, Container.TYPE.ERROR, null, "package " + packageName
-				+ ";version=" + range + " Not found in " + plugins, null);
+		return new Container(this, "X", range, Container.TYPE.ERROR, null, "package " + packageName + ";version="
+				+ range + " Not found in " + plugins, null);
 	}
 
-	private Strategy findStrategy(Map<String, String> attrs, Strategy defaultStrategy,
-			String versionRange) {
+	private Strategy findStrategy(Map<String,String> attrs, Strategy defaultStrategy, String versionRange) {
 		Strategy useStrategy = defaultStrategy;
 		String overrideStrategy = attrs.get("strategy");
 		if (overrideStrategy != null) {
@@ -640,11 +629,10 @@
 	 * @throws Exception
 	 *             anything goes wrong
 	 */
-	public void doMavenPom(Strategy strategyx, List<Container> result, String action)
-			throws Exception {
+	public void doMavenPom(Strategy strategyx, List<Container> result, String action) throws Exception {
 		File pomFile = getFile("pom.xml");
 		if (!pomFile.isFile())
-			error("Specified to use pom.xml but the project directory does not contain a pom.xml file");
+			msgs.MissingPom();
 		else {
 			ProjectPom pom = getWorkspace().getMaven().createProjectModel(pomFile);
 			if (action == null)
@@ -706,8 +694,7 @@
 		boolean result;
 		String runBuildsStr = getProperty(Constants.RUNBUILDS);
 		if (runBuildsStr == null)
-			result = !getPropertiesFile().getName().toLowerCase()
-					.endsWith(Constants.DEFAULT_BNDRUN_EXTENSION);
+			result = !getPropertiesFile().getName().toLowerCase().endsWith(Constants.DEFAULT_BNDRUN_EXTENSION);
 		else
 			result = Boolean.parseBoolean(runBuildsStr);
 		return result;
@@ -758,7 +745,7 @@
 		return list(args, toFiles(getDependson()));
 	}
 
-	private Collection<?> toFiles(Collection<Project> projects) {
+	private Collection< ? > toFiles(Collection<Project> projects) {
 		List<File> files = new ArrayList<File>();
 		for (Project p : projects) {
 			files.add(p.getBase());
@@ -792,11 +779,10 @@
 		return getOutput().getAbsolutePath();
 	}
 
-	private String list(String[] args, Collection<?> list) {
+	private String list(String[] args, Collection< ? > list) {
 		if (args.length > 3)
 			throw new IllegalArgumentException("${" + args[0]
-					+ "[;<separator>]} can only take a separator as argument, has "
-					+ Arrays.toString(args));
+					+ "[;<separator>]} can only take a separator as argument, has " + Arrays.toString(args));
 
 		String separator = ",";
 
@@ -808,7 +794,9 @@
 	}
 
 	protected Object[] getMacroDomains() {
-		return new Object[] { workspace };
+		return new Object[] {
+			workspace
+		};
 	}
 
 	public File release(Jar jar) throws Exception {
@@ -846,16 +834,17 @@
 			try {
 				File file = rp.put(jar);
 				trace("Released %s to file %s in repository %s", jar.getName(), file, rp);
-			} catch (Exception e) {
-				error("Deploying " + jar.getName() + " on " + rp.getName(), e);
-			} finally {
+			}
+			catch (Exception e) {
+				msgs.Release_Into_Exception_(jar, rp, e);
+			}
+			finally {
 				jar.close();
 			}
 		} else if (name == null)
-			error("There is no writable repository (no repo name specified)");
+			msgs.NoNameForReleaseRepository();
 		else
-			error("Cannot find a writeable repository with the name %s from the repositiories %s",
-					name, plugins);
+			msgs.ReleaseRepository_NotFoundIn_(name, plugins);
 
 		return null;
 
@@ -888,7 +877,8 @@
 			Jar j = new Jar(jar);
 			try {
 				release(name, j);
-			} finally {
+			}
+			finally {
 				j.close();
 			}
 		}
@@ -911,8 +901,7 @@
 	 *             when something goes wrong
 	 */
 
-	public Container getBundle(String bsn, String range, Strategy strategy,
-			Map<String, String> attrs) throws Exception {
+	public Container getBundle(String bsn, String range, Strategy strategy, Map<String,String> attrs) throws Exception {
 
 		if (range == null)
 			range = "0";
@@ -946,15 +935,14 @@
 					return toContainer(bsn, range, attrs, result);
 			}
 		} else {
-			VersionRange versionRange = "latest".equals(range) ? new VersionRange("0")
-					: new VersionRange(range);
+			VersionRange versionRange = "latest".equals(range) ? new VersionRange("0") : new VersionRange(range);
 
 			// We have a range search. Gather all the versions in all the repos
 			// and make a decision on that choice. If the same version is found
 			// in
 			// multiple repos we take the first
 
-			SortedMap<Version, RepositoryPlugin> versions = new TreeMap<Version, RepositoryPlugin>();
+			SortedMap<Version,RepositoryPlugin> versions = new TreeMap<Version,RepositoryPlugin>();
 			for (RepositoryPlugin plugin : plugins) {
 				try {
 					List<Version> vs = plugin.versions(bsn);
@@ -964,7 +952,8 @@
 								versions.put(v, plugin);
 						}
 					}
-				} catch (UnsupportedOperationException ose) {
+				}
+				catch (UnsupportedOperationException ose) {
 					// We have a plugin that cannot list versions, try
 					// if it has this specific version
 					// The main reaosn for this code was the Maven Remote
@@ -987,13 +976,13 @@
 				Version provider = null;
 
 				switch (useStrategy) {
-				case HIGHEST:
-					provider = versions.lastKey();
-					break;
+					case HIGHEST :
+						provider = versions.lastKey();
+						break;
 
-				case LOWEST:
-					provider = versions.firstKey();
-					break;
+					case LOWEST :
+						provider = versions.firstKey();
+						break;
 				}
 				if (provider != null) {
 					RepositoryPlugin repo = versions.get(provider);
@@ -1002,16 +991,15 @@
 					if (result != null)
 						return toContainer(bsn, version, attrs, result);
 				} else
-					error("Unexpected, found versions %s but then not provider for startegy %s?",
-							versions, useStrategy);
+					msgs.FoundVersions_ForStrategy_ButNoProvider(versions, useStrategy);
 			}
 		}
 
 		//
 		// If we get this far we ran into an error somewhere
 
-		return new Container(this, bsn, range, Container.TYPE.ERROR, null, bsn + ";version="
-				+ range + " Not found in " + plugins, null);
+		return new Container(this, bsn, range, Container.TYPE.ERROR, null, bsn + ";version=" + range + " Not found in "
+				+ plugins, null);
 
 	}
 
@@ -1020,7 +1008,7 @@
 	 * @param useStrategy
 	 * @return
 	 */
-	protected Strategy overrideStrategy(Map<String, String> attrs, Strategy useStrategy) {
+	protected Strategy overrideStrategy(Map<String,String> attrs, Strategy useStrategy) {
 		if (attrs != null) {
 			String overrideStrategy = attrs.get("strategy");
 
@@ -1043,10 +1031,10 @@
 	 * @param result
 	 * @return
 	 */
-	protected Container toContainer(String bsn, String range, Map<String, String> attrs, File result) {
+	protected Container toContainer(String bsn, String range, Map<String,String> attrs, File result) {
 		File f = result;
 		if (f == null) {
-			error("Result file for toContainer is unexpectedly null, not sure what to do");
+			msgs.ConfusedNoContainerFile();
 			f = new File("was null");
 		}
 		if (f.getName().endsWith("lib"))
@@ -1066,7 +1054,7 @@
 	 * @return
 	 * @throws Exception
 	 */
-	private Container getBundleFromProject(String bsn, Map<String, String> attrs) throws Exception {
+	private Container getBundleFromProject(String bsn, Map<String,String> attrs) throws Exception {
 		String pname = bsn;
 		while (true) {
 			Project p = getWorkspace().getProject(pname);
@@ -1112,9 +1100,11 @@
 			try {
 				rp.put(jar);
 				return;
-			} catch (Exception e) {
-				error("Deploying " + file + " on " + rp.getName(), e);
-			} finally {
+			}
+			catch (Exception e) {
+				msgs.DeployingFile_On_Exception_(file, rp.getName(), e);
+			}
+			finally {
 				jar.close();
 			}
 			return;
@@ -1154,27 +1144,29 @@
 					try {
 						if (d.deploy(this, jar))
 							trace("deployed %s successfully to %s", output, d);
-					} catch (Exception e) {
-						error("Error while deploying %s, %s", this, e);
-						e.printStackTrace();
+					}
+					catch (Exception e) {
+						msgs.Deploying(e);
 					}
 				}
-			} finally {
+			}
+			finally {
 				jar.close();
 			}
 		}
 	}
 
 	/**
-	 * Macro access to the repository
-	 * 
-	 * ${repo;<bsn>[;<version>[;<low|high>]]}
+	 * Macro access to the repository ${repo;<bsn>[;<version>[;<low|high>]]}
 	 */
 
+	static String	_repoHelp	= "${repo ';'<bsn> [ ; <version> [; ('HIGHEST'|'LOWEST')]}";
+
 	public String _repo(String args[]) throws Exception {
-		if (args.length < 2)
-			throw new IllegalArgumentException(
-					"Too few arguments for repo, syntax=: ${repo ';'<bsn> [ ; <version> [; ('HIGHEST'|'LOWEST')]}");
+		if (args.length < 2) {
+			msgs.RepoTooFewArguments(_repoHelp, args);
+			return null;
+		}
 
 		String bsns = args[1];
 		String version = null;
@@ -1190,8 +1182,7 @@
 				else if (args[3].equalsIgnoreCase("EXACT"))
 					strategy = Strategy.EXACT;
 				else
-					error("${repo;<bsn>;<version>;<'highest'|'lowest'|'exact'>} macro requires a strategy of 'highest' or 'lowest', and is "
-							+ args[3]);
+					msgs.InvalidStrategy(_repoHelp, args);
 			}
 		}
 
@@ -1215,8 +1206,8 @@
 			if (container.getError() == null)
 				paths.add(container.getFile().getAbsolutePath());
 			else {
-				paths.add("<<${repo} = " + container.getBundleSymbolicName() + "-"
-						+ container.getVersion() + " : " + container.getError() + ">>");
+				paths.add("<<${repo} = " + container.getBundleSymbolicName() + "-" + container.getVersion() + " : "
+						+ container.getError() + ">>");
 
 				if (isPedantic()) {
 					warning("Could not expand repo path request: %s ", container);
@@ -1266,13 +1257,24 @@
 
 	/**
 	 * Check if this project needs building. This is defined as:
-	 * 
 	 */
 	public boolean isStale() throws Exception {
+		Set<Project> visited = new HashSet<Project>();
+		return isStale(visited);
+	}
+
+	boolean isStale(Set<Project> visited) throws Exception {
 		// When we do not generate anything ...
 		if (isNoBundles())
 			return false;
 
+		if (visited.contains(this)) {
+			msgs.CircularDependencyContext_Message_(this.getName(), visited.toString());
+			return false;
+		}
+
+		visited.add(this);
+
 		long buildTime = 0;
 
 		files = getBuildFiles(false);
@@ -1288,6 +1290,9 @@
 		}
 
 		for (Project dependency : getDependson()) {
+			if (dependency == this)
+				continue;
+
 			if (dependency.isStale())
 				return true;
 
@@ -1305,11 +1310,8 @@
 
 	/**
 	 * This method must only be called when it is sure that the project has been
-	 * build before in the same session.
-	 * 
-	 * It is a bit yucky, but ant creates different class spaces which makes it
-	 * hard to detect we already build it.
-	 * 
+	 * build before in the same session. It is a bit yucky, but ant creates
+	 * different class spaces which makes it hard to detect we already build it.
 	 * This method remembers the files in the appropriate instance vars.
 	 * 
 	 * @return
@@ -1334,7 +1336,7 @@
 					if (!ff.isFile()) {
 						// Originally we warned the user
 						// but lets just rebuild. That way
-						// the error is not noticed but 
+						// the error is not noticed but
 						// it seems better to correct,
 						// See #154
 						rdr.close();
@@ -1344,7 +1346,8 @@
 						files.add(ff);
 				}
 				return this.files = files.toArray(new File[files.size()]);
-			} finally {
+			}
+			finally {
 				rdr.close();
 			}
 		}
@@ -1371,35 +1374,42 @@
 
 		files = null;
 		ProjectBuilder builder = getBuilder(null);
-		if (underTest)
-			builder.setProperty(Constants.UNDERTEST, "true");
-		Jar jars[] = builder.builds();
-		File[] files = new File[jars.length];
+		try {
+			if (underTest)
+				builder.setProperty(Constants.UNDERTEST, "true");
+			Jar jars[] = builder.builds();
+			File[] files = new File[jars.length];
 
-		for (int i = 0; i < jars.length; i++) {
-			Jar jar = jars[i];
-			files[i] = saveBuild(jar);
-		}
-		getInfo(builder);
-		builder.close();
-		if (isOk()) {
-			this.files = files;
+			getInfo(builder);
 
-			// Write out the filenames in the buildfiles file
-			// so we can get them later evenin another process
-			Writer fw = IO.writer(bfs);
-			try {
-				for (File f : files) {
-					fw.append(f.getAbsolutePath());
-					fw.append("\n");
+			if (isOk()) {
+				this.files = files;
+
+				for (int i = 0; i < jars.length; i++) {
+					Jar jar = jars[i];
+					files[i] = saveBuild(jar);
 				}
-			} finally {
-				fw.close();
-			}
-			getWorkspace().changedFile(bfs);
-			return files;
-		} else
-			return null;
+
+				// Write out the filenames in the buildfiles file
+				// so we can get them later evenin another process
+				Writer fw = IO.writer(bfs);
+				try {
+					for (File f : files) {
+						fw.append(f.getAbsolutePath());
+						fw.append("\n");
+					}
+				}
+				finally {
+					fw.close();
+				}
+				getWorkspace().changedFile(bfs);
+				return files;
+			} else
+				return null;
+		}
+		finally {
+			builder.close();
+		}
 	}
 
 	/**
@@ -1429,7 +1439,8 @@
 			}
 			trace(jar.getName() + " (" + f.getName() + ") " + jar.getResources().size() + " " + msg);
 			return f;
-		} finally {
+		}
+		finally {
 			jar.close();
 		}
 	}
@@ -1442,7 +1453,7 @@
 		if (isTrue(getProperty(Constants.REPORTNEWER))) {
 			StringBuilder sb = new StringBuilder();
 			String del = "Newer than " + new Date(lastModified);
-			for (Map.Entry<String, Resource> entry : jar.getResources().entrySet()) {
+			for (Map.Entry<String,Resource> entry : jar.getResources().entrySet()) {
 				if (entry.getValue().lastModified() > lastModified) {
 					sb.append(del);
 					del = ", \n     ";
@@ -1480,13 +1491,13 @@
 		return getBase().getName();
 	}
 
-	public Map<String, Action> getActions() {
-		Map<String, Action> all = newMap();
-		Map<String, Action> actions = newMap();
+	public Map<String,Action> getActions() {
+		Map<String,Action> all = newMap();
+		Map<String,Action> actions = newMap();
 		fillActions(all);
 		getWorkspace().fillActions(all);
 
-		for (Map.Entry<String, Action> action : all.entrySet()) {
+		for (Map.Entry<String,Action> action : all.entrySet()) {
 			String key = getReplacer().process(action.getKey());
 			if (key != null && key.trim().length() != 0)
 				actions.put(key, action.getValue());
@@ -1494,20 +1505,19 @@
 		return actions;
 	}
 
-	public void fillActions(Map<String, Action> all) {
+	public void fillActions(Map<String,Action> all) {
 		List<NamedAction> plugins = getPlugins(NamedAction.class);
 		for (NamedAction a : plugins)
 			all.put(a.getName(), a);
 
 		Parameters actions = new Parameters(getProperty("-actions", DEFAULT_ACTIONS));
-		for (Entry<String, Attrs> entry : actions.entrySet()) {
+		for (Entry<String,Attrs> entry : actions.entrySet()) {
 			String key = Processor.removeDuplicateMarker(entry.getKey());
 			Action action;
 
 			if (entry.getValue().get("script") != null) {
 				// TODO check for the type
-				action = new ScriptAction(entry.getValue().get("type"), entry.getValue().get(
-						"script"));
+				action = new ScriptAction(entry.getValue().get("type"), entry.getValue().get("script"));
 			} else {
 				action = new ReflectAction(key);
 			}
@@ -1593,7 +1603,8 @@
 		try {
 			Jar jar = new Jar(url.getFile().replace('/', '.'), in, System.currentTimeMillis());
 			return getValidJar(jar, url.toString());
-		} finally {
+		}
+		finally {
 			in.close();
 		}
 	}
@@ -1681,7 +1692,8 @@
 				bndfile += "\n# Added by by bump\nBundle-Version: 0.0.0\n";
 				IO.store(bndfile, getPropertiesFile());
 			}
-		} finally {
+		}
+		finally {
 			forceRefresh();
 		}
 	}
@@ -1697,7 +1709,7 @@
 	}
 
 	public void action(String command) throws Throwable {
-		Map<String, Action> actions = getActions();
+		Map<String,Action> actions = getActions();
 
 		Action a = actions.get(command);
 		if (a == null)
@@ -1706,7 +1718,8 @@
 		before(this, command);
 		try {
 			a.execute(this, command);
-		} catch (Throwable t) {
+		}
+		catch (Throwable t) {
 			after(this, command, t);
 			throw t;
 		}
@@ -1714,7 +1727,6 @@
 
 	/**
 	 * Run all before command plugins
-	 * 
 	 */
 	void before(Project p, String a) {
 		List<CommandPlugin> testPlugins = getPlugins(CommandPlugin.class);
@@ -1762,15 +1774,17 @@
 		refresh();
 	}
 
-	@SuppressWarnings("unchecked") public void script(String type, String script) throws Exception {
+	@SuppressWarnings("unchecked")
+	public void script(String type, String script) throws Exception {
 		// TODO check tyiping
 		List<Scripter> scripters = getPlugins(Scripter.class);
 		if (scripters.isEmpty()) {
-			error("Can not execute script because there are no scripters registered: %s", script);
+			msgs.NoScripters_(script);
 			return;
 		}
-		@SuppressWarnings("rawtypes") Map x = (Map) getProperties();
-		scripters.get(0).eval((Map<String, Object>) x, new StringReader(script));
+		@SuppressWarnings("rawtypes")
+		Map x = (Map) getProperties();
+		scripters.get(0).eval((Map<String,Object>) x, new StringReader(script));
 	}
 
 	public String _repos(String args[]) throws Exception {
@@ -1811,16 +1825,15 @@
 	 * Otherwise it contains all the sub bnd files.
 	 * 
 	 * @return A collection of containers
-	 * 
 	 * @throws Exception
 	 */
 	public Collection<Container> getDeliverables() throws Exception {
 		List<Container> result = new ArrayList<Container>();
-		Collection<? extends Builder> builders = getSubBuilders();
+		Collection< ? extends Builder> builders = getSubBuilders();
 
 		for (Builder builder : builders) {
-			Container c = new Container(this, builder.getBsn(), builder.getVersion(),
-					Container.TYPE.PROJECT, getOutputFile(builder.getBsn()), null, null);
+			Container c = new Container(this, builder.getBsn(), builder.getVersion(), Container.TYPE.PROJECT,
+					getOutputFile(builder.getBsn()), null, null);
 			result.add(c);
 		}
 		return result;
@@ -1847,7 +1860,7 @@
 		if (!bndFile.getAbsolutePath().startsWith(base.getAbsolutePath()))
 			return null;
 
-		Collection<? extends Builder> builders = getSubBuilders();
+		Collection< ? extends Builder> builders = getSubBuilders();
 		for (Builder sub : builders) {
 			File propertiesFile = sub.getPropertiesFile();
 			if (propertiesFile != null) {
@@ -1868,8 +1881,8 @@
 	 * @return null or the builder for a sub file.
 	 * @throws Exception
 	 */
-	public Container getDeliverable(String bsn, Map<String, String> attrs) throws Exception {
-		Collection<? extends Builder> builders = getSubBuilders();
+	public Container getDeliverable(String bsn, Map<String,String> attrs) throws Exception {
+		Collection< ? extends Builder> builders = getSubBuilders();
 		for (Builder sub : builders) {
 			if (sub.getBsn().equals(bsn))
 				return new Container(this, getOutputFile(bsn));
@@ -1886,7 +1899,7 @@
 	 * @return A list of builders.
 	 * @throws Exception
 	 */
-	public Collection<? extends Builder> getSubBuilders() throws Exception {
+	public Collection< ? extends Builder> getSubBuilders() throws Exception {
 		return getBuilder(null).getSubBuilders();
 	}
 
@@ -1910,7 +1923,7 @@
 		return hdr.keySet();
 	}
 
-	public Map<String, String> getRunProperties() {
+	public Map<String,String> getRunProperties() {
 		return OSGiHeader.parseProperties(getProperty(RUNPROPERTIES));
 	}
 
@@ -1921,17 +1934,16 @@
 	 * @throws Exception
 	 */
 	public ProjectLauncher getProjectLauncher() throws Exception {
-		return getHandler(ProjectLauncher.class, getRunpath(), LAUNCHER_PLUGIN,
-				"biz.aQute.launcher");
+		return getHandler(ProjectLauncher.class, getRunpath(), LAUNCHER_PLUGIN, "biz.aQute.launcher");
 	}
 
 	public ProjectTester getProjectTester() throws Exception {
 		return getHandler(ProjectTester.class, getTestpath(), TESTER_PLUGIN, "biz.aQute.junit");
 	}
 
-	private <T> T getHandler(Class<T> target, Collection<Container> containers, String header,
-			String defaultHandler) throws Exception {
-		Class<? extends T> handlerClass = target;
+	private <T> T getHandler(Class<T> target, Collection<Container> containers, String header, String defaultHandler)
+			throws Exception {
+		Class< ? extends T> handlerClass = target;
 
 		// Make sure we find at least one handler, but hope to find an earlier
 		// one
@@ -1946,15 +1958,13 @@
 			if (manifest != null) {
 				String launcher = manifest.getMainAttributes().getValue(header);
 				if (launcher != null) {
-					Class<?> clz = getClass(launcher, c.getFile());
+					Class< ? > clz = getClass(launcher, c.getFile());
 					if (clz != null) {
 						if (!target.isAssignableFrom(clz)) {
-							error("Found a %s class in %s but it is not compatible with: %s", clz,
-									c, target);
+							msgs.IncompatibleHandler_For_(launcher, defaultHandler);
 						} else {
 							handlerClass = clz.asSubclass(target);
-							Constructor<? extends T> constructor = handlerClass
-									.getConstructor(Project.class);
+							Constructor< ? extends T> constructor = handlerClass.getConstructor(Project.class);
 							return constructor.newInstance(this);
 						}
 					}
@@ -1962,34 +1972,13 @@
 			}
 		}
 
-		throw new IllegalArgumentException("Default handler for " + header + " not found in "
-				+ defaultHandler);
-	}
-
-	public synchronized boolean lock(String reason) throws InterruptedException {
-		if (!lock.tryLock(5, TimeUnit.SECONDS)) {
-			error("Could not acquire lock for %s, was locked by %s for %s", reason, lockingThread,
-					lockingReason);
-			System.err.printf("Could not acquire lock for %s, was locked by %s for %s%n", reason,
-					lockingThread, lockingReason);
-			System.err.flush();
-			return false;
-		}
-		this.lockingReason = reason;
-		this.lockingThread = Thread.currentThread();
-		return true;
-	}
-
-	public void unlock() {
-		lockingReason = null;
-		lock.unlock();
+		throw new IllegalArgumentException("Default handler for " + header + " not found in " + defaultHandler);
 	}
 
 	/**
-	 * Make this project delay the calculation of the run dependencies.
-	 * 
-	 * The run dependencies calculation can be done in prepare or until the
-	 * dependencies are actually needed.
+	 * Make this project delay the calculation of the run dependencies. The run
+	 * dependencies calculation can be done in prepare or until the dependencies
+	 * are actually needed.
 	 */
 	public void setDelayRunDependencies(boolean x) {
 		delayRunDependencies = x;
@@ -2006,8 +1995,9 @@
 	public void setPackageInfo(String packageName, Version version) {
 		try {
 			updatePackageInfoFile(packageName, version);
-		} catch (Exception e) {
-			error(e.getMessage(), e);
+		}
+		catch (Exception e) {
+			msgs.SettingPackageInfoException_(e);
 		}
 	}
 
@@ -2061,7 +2051,8 @@
 					return Version.parseVersion(line.substring(8));
 				}
 			}
-		} finally {
+		}
+		finally {
 			if (reader != null) {
 				IO.close(reader);
 			}
@@ -2073,19 +2064,19 @@
 	 * bnd maintains a class path that is set by the environment, i.e. bnd is
 	 * not in charge of it.
 	 */
-	
-	public void addClasspath( File f) {
-		if ( !f.isFile()) {
-			error("Adding non existent file to the classpath %s", f);
+
+	public void addClasspath(File f) {
+		if (!f.isFile() && !f.isDirectory()) {
+			msgs.AddingNonExistentFileToClassPath_(f);
 		}
 		Container container = new Container(f);
 		classpath.add(container);
 	}
-	
+
 	public void clearClasspath() {
 		classpath.clear();
 	}
-	
+
 	public Collection<Container> getClasspath() {
 		return classpath;
 	}
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java b/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java
index d00b71b..4abb350 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/ProjectBuilder.java
@@ -6,72 +6,75 @@
 import aQute.lib.osgi.*;
 
 public class ProjectBuilder extends Builder {
-    Project project;
-    boolean initialized;
+	Project	project;
+	boolean	initialized;
 
-    public ProjectBuilder(Project project) {
-        super(project);
-        this.project = project;
-    }
+	public ProjectBuilder(Project project) {
+		super(project);
+		this.project = project;
+	}
 
-    public ProjectBuilder(ProjectBuilder builder) {
-        super(builder);
-        this.project = builder.project;
-    }
+	public ProjectBuilder(ProjectBuilder builder) {
+		super(builder);
+		this.project = builder.project;
+	}
 
-    @Override
-    public long lastModified() {
-        return Math.max(project.lastModified(), super.lastModified());
-    }
+	@Override
+	public long lastModified() {
+		return Math.max(project.lastModified(), super.lastModified());
+	}
 
-    /**
-     * We put our project and our workspace on the macro path.
-     */
-    protected Object[] getMacroDomains() {
-        return new Object[] { project, project.getWorkspace() };
-    }
+	/**
+	 * We put our project and our workspace on the macro path.
+	 */
+	protected Object[] getMacroDomains() {
+		return new Object[] {
+				project, project.getWorkspace()
+		};
+	}
 
-    public Builder getSubBuilder() throws Exception {
-        return project.getBuilder(this);
-    }
+	public Builder getSubBuilder() throws Exception {
+		return project.getBuilder(this);
+	}
 
-    public Project getProject() {
-        return project;
-    }
+	public Project getProject() {
+		return project;
+	}
 
-    public void init() {
-        try {
-            if (!initialized) {
-                initialized = true;
-                for (Container file : project.getClasspath()) {
-                    addClasspath(file.getFile());
-                }
-                
-                for (Container file : project.getBuildpath()) {
-                    addClasspath(file.getFile());
-                }
+	public void init() {
+		try {
+			if (!initialized) {
+				initialized = true;
+				for (Container file : project.getClasspath()) {
+					addClasspath(file.getFile());
+				}
 
-                for (Container file : project.getBootclasspath()) {
-                    addClasspath(file.getFile());
-                }
+				for (Container file : project.getBuildpath()) {
+					addClasspath(file.getFile());
+				}
 
-                for (File file : project.getAllsourcepath()) {
-                    addSourcepath(file);
-                }
+				for (Container file : project.getBootclasspath()) {
+					addClasspath(file.getFile());
+				}
 
-            }
-        } catch (Exception e) {
-            error("init project builder fails", e);
-        }
-    }
+				for (File file : project.getAllsourcepath()) {
+					addSourcepath(file);
+				}
 
-    public List<Jar> getClasspath() {
-        init();
-        return super.getClasspath();
-    }
+			}
+		}
+		catch (Exception e) {
+			msgs.Unexpected_Error_("ProjectBuilder init", e);
+		}
+	}
 
-    @Override
-    protected void changedFile(File f) {
-        project.getWorkspace().changedFile(f);
-    }
+	public List<Jar> getClasspath() {
+		init();
+		return super.getClasspath();
+	}
+
+	@Override
+	protected void changedFile(File f) {
+		project.getWorkspace().changedFile(f);
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/ProjectLauncher.java b/bundleplugin/src/main/java/aQute/bnd/build/ProjectLauncher.java
index 1b7bac0..6a97311 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/ProjectLauncher.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/ProjectLauncher.java
@@ -19,42 +19,41 @@
  * class is instantiated and cast to a LauncherPlugin. This plug in is then
  * asked to provide a ProjectLauncher. This project launcher is then used by the
  * project to run the code. Launchers must extend this class.
- * 
  */
 public abstract class ProjectLauncher {
-	private final Project				project;
-	private long						timeout				= 0;
+	private final Project		project;
+	private long				timeout				= 0;
 	private final List<String>	classpath			= new ArrayList<String>();
-	private List<String>				runbundles			= Create.list();
-	private final List<String>			runvm				= new ArrayList<String>();
-	private Map<String, String>			runproperties;
-	private Command						java;
-	private Parameters					runsystempackages;
-	private final List<String>			activators			= Create.list();
-	private File						storageDir;
-	private final List<String>			warnings			= Create.list();
-	private final List<String>			errors				= Create.list();
+	private List<String>		runbundles			= Create.list();
+	private final List<String>	runvm				= new ArrayList<String>();
+	private Map<String,String>	runproperties;
+	private Command				java;
+	private Parameters			runsystempackages;
+	private final List<String>	activators			= Create.list();
+	private File				storageDir;
+	private final List<String>	warnings			= Create.list();
+	private final List<String>	errors				= Create.list();
 
-	private boolean						trace;
-	private boolean						keep;
-	private int							framework;
+	private boolean				trace;
+	private boolean				keep;
+	private int					framework;
 
-	public final static int				SERVICES			= 10111;
-	public final static int				NONE				= 20123;
+	public final static int		SERVICES			= 10111;
+	public final static int		NONE				= 20123;
 
 	// MUST BE ALIGNED WITH LAUNCHER
-	public final static int				OK					= 0;
-	public final static int				WARNING				= -1;
-	public final static int				ERROR				= -2;
-	public final static int				TIMEDOUT			= -3;
-	public final static int				UPDATE_NEEDED		= -4;
-	public final static int				CANCELED			= -5;
-	public final static int				DUPLICATE_BUNDLE	= -6;
-	public final static int				RESOLVE_ERROR		= -7;
-	public final static int				ACTIVATOR_ERROR		= -8;
-	public final static int				CUSTOM_LAUNCHER		= -128;
+	public final static int		OK					= 0;
+	public final static int		WARNING				= -1;
+	public final static int		ERROR				= -2;
+	public final static int		TIMEDOUT			= -3;
+	public final static int		UPDATE_NEEDED		= -4;
+	public final static int		CANCELED			= -5;
+	public final static int		DUPLICATE_BUNDLE	= -6;
+	public final static int		RESOLVE_ERROR		= -7;
+	public final static int		ACTIVATOR_ERROR		= -8;
+	public final static int		CUSTOM_LAUNCHER		= -128;
 
-	public final static String			EMBEDDED_ACTIVATOR	= "Embedded-Activator";
+	public final static String	EMBEDDED_ACTIVATOR	= "Embedded-Activator";
 
 	public ProjectLauncher(Project project) throws Exception {
 		this.project = project;
@@ -99,8 +98,7 @@
 		trace = Processor.isTrue(project.getProperty(Constants.RUNTRACE));
 
 		// For backward compatibility with bndtools launcher
-		List<Container> fws = project.getBundles(Strategy.HIGHEST, project.getProperty("-runfw"),
-				"-runfw");
+		List<Container> fws = project.getBundles(Strategy.HIGHEST, project.getProperty("-runfw"), "-runfw");
 		runpath.addAll(fws);
 
 		for (Container c : runpath) {
@@ -127,8 +125,7 @@
 
 	public void addClasspath(Container container) throws Exception {
 		if (container.getError() != null) {
-			project.error("Cannot launch because %s has reported %s", container.getProject(),
-					container.getError());
+			project.error("Cannot launch because %s has reported %s", container.getProject(), container.getError());
 		} else {
 			Collection<Container> members = container.getMembers();
 			for (Container m : members) {
@@ -139,9 +136,9 @@
 					Manifest manifest = m.getManifest();
 
 					if (manifest != null) {
-						Parameters exports = project.parseHeader(manifest.getMainAttributes()
-								.getValue(Constants.EXPORT_PACKAGE));
-						for (Entry<String, Attrs> e : exports.entrySet()) {
+						Parameters exports = project.parseHeader(manifest.getMainAttributes().getValue(
+								Constants.EXPORT_PACKAGE));
+						for (Entry<String,Attrs> e : exports.entrySet()) {
 							if (!runsystempackages.containsKey(e.getKey()))
 								runsystempackages.put(e.getKey(), e.getValue());
 						}
@@ -151,8 +148,7 @@
 						// the framework is completely initialized wit the
 						// system
 						// context.
-						String activator = manifest.getMainAttributes()
-								.getValue(EMBEDDED_ACTIVATOR);
+						String activator = manifest.getMainAttributes().getValue(EMBEDDED_ACTIVATOR);
 						if (activator != null)
 							activators.add(activator);
 					}
@@ -189,7 +185,7 @@
 		return Collections.emptySet();
 	}
 
-	public Map<String, String> getRunProperties() {
+	public Map<String,String> getRunProperties() {
 		return runproperties;
 	}
 
@@ -214,44 +210,45 @@
 			java.setTimeout(timeout + 1000, TimeUnit.MILLISECONDS);
 
 		try {
-			int result = java.execute((InputStream)null, System.err, System.err);
+			int result = java.execute((InputStream) null, System.err, System.err);
 			if (result == Integer.MIN_VALUE)
 				return TIMEDOUT;
 			reportResult(result);
 			return result;
-		} finally {
+		}
+		finally {
 			cleanup();
 		}
 	}
 
 	/**
-	 * Is called after the process exists. Can you be used to cleanup
-	 * the properties file.
+	 * Is called after the process exists. Can you be used to cleanup the
+	 * properties file.
 	 */
-	
+
 	public void cleanup() {
 		// do nothing by default
 	}
 
 	protected void reportResult(int result) {
 		switch (result) {
-		case OK:
-			project.trace("Command terminated normal %s", java);
-			break;
-		case TIMEDOUT:
-			project.error("Launch timedout: %s", java);
-			break;
+			case OK :
+				project.trace("Command terminated normal %s", java);
+				break;
+			case TIMEDOUT :
+				project.error("Launch timedout: %s", java);
+				break;
 
-		case ERROR:
-			project.error("Launch errored: %s", java);
-			break;
+			case ERROR :
+				project.error("Launch errored: %s", java);
+				break;
 
-		case WARNING:
-			project.warning("Launch had a warning %s", java);
-			break;
-		default:
-			project.error("Exit code remote process %d: %s", result, java);
-			break;
+			case WARNING :
+				project.warning("Launch had a warning %s", java);
+				break;
+			default :
+				project.error("Exit code remote process %d: %s", result, java);
+				break;
 		}
 	}
 
@@ -267,7 +264,7 @@
 		java.cancel();
 	}
 
-	public Map<String, ? extends Map<String, String>> getSystemPackages() {
+	public Map<String, ? extends Map<String,String>> getSystemPackages() {
 		return runsystempackages.asMapMap();
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/ProjectMessages.java b/bundleplugin/src/main/java/aQute/bnd/build/ProjectMessages.java
new file mode 100644
index 0000000..ac8d7fb
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/bnd/build/ProjectMessages.java
@@ -0,0 +1,50 @@
+package aQute.bnd.build;
+
+import java.io.*;
+import java.util.*;
+
+import aQute.bnd.service.*;
+import aQute.bnd.service.RepositoryPlugin.Strategy;
+import aQute.lib.osgi.*;
+import aQute.libg.reporter.*;
+import aQute.libg.version.*;
+
+public interface ProjectMessages extends Messages {
+
+	ERROR InvalidStrategy(String help, String[] args);
+
+	ERROR RepoTooFewArguments(String help, String[] args);
+
+	ERROR AddingNonExistentFileToClassPath_(File f);
+
+	ERROR Deploying(Exception e);
+
+	ERROR DeployingFile_On_Exception_(File file, String name, Exception e);
+
+	ERROR MissingPom();
+
+	ERROR FoundVersions_ForStrategy_ButNoProvider(SortedMap<Version,RepositoryPlugin> versions, Strategy useStrategy);
+
+	ERROR NoSuchProject(String bsn, String spec);
+
+	ERROR CircularDependencyContext_Message_(String name, String message);
+
+	ERROR IncompatibleHandler_For_(String launcher, String defaultHandler);
+
+	ERROR NoOutputDirectory_(File output);
+
+	ERROR MissingDependson_(String p);
+
+	ERROR NoNameForReleaseRepository();
+
+	ERROR ReleaseRepository_NotFoundIn_(String name, List<RepositoryPlugin> plugins);
+
+	ERROR Release_Into_Exception_(Jar jar, RepositoryPlugin rp, Exception e);
+
+	ERROR NoScripters_(String script);
+
+	ERROR SettingPackageInfoException_(Exception e);
+
+	ERROR ConfusedNoContainerFile();
+
+}
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/ProjectTester.java b/bundleplugin/src/main/java/aQute/bnd/build/ProjectTester.java
index 5060d2f..86ce2e3 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/ProjectTester.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/ProjectTester.java
@@ -10,7 +10,7 @@
 	final List<String>			tests		= new ArrayList<String>();
 	File						reportDir;
 	boolean						continuous	= true;
-	
+
 	public ProjectTester(Project project) throws Exception {
 		this.project = project;
 		launcher = project.getProjectLauncher();
@@ -18,8 +18,7 @@
 		for (Container c : testbundles) {
 			launcher.addClasspath(c);
 		}
-		reportDir = new File(project.getTarget(), project.getProperty("test-reports",
-				"test-reports"));
+		reportDir = new File(project.getTarget(), project.getProperty("test-reports", "test-reports"));
 	}
 
 	public ProjectLauncher getProjectLauncher() {
@@ -37,7 +36,7 @@
 	public Collection<File> getReports() {
 		List<File> reports = new ArrayList<File>();
 		for (File report : reportDir.listFiles()) {
-			if (report.isFile() )
+			if (report.isFile())
 				reports.add(report);
 		}
 		return reports;
@@ -65,7 +64,7 @@
 
 	public boolean prepare() throws Exception {
 		reportDir.mkdirs();
-		for ( File file : reportDir.listFiles() ) {
+		for (File file : reportDir.listFiles()) {
 			file.delete();
 		}
 		return true;
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/ReflectAction.java b/bundleplugin/src/main/java/aQute/bnd/build/ReflectAction.java
index 55c2861..3c3ee16 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/ReflectAction.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/ReflectAction.java
@@ -5,18 +5,18 @@
 import aQute.bnd.service.action.*;
 
 public class ReflectAction implements Action {
-    String  what;
-    
-    public ReflectAction(String what) {
-        this.what = what;
-    }
-    
-    public void execute(Project project, String action) throws Exception {
-        Method m = project.getClass().getMethod(what);
-        m.invoke(project);
-    }
+	String	what;
 
-    public String toString() {
-        return "ra:" + what;
-    }
+	public ReflectAction(String what) {
+		this.what = what;
+	}
+
+	public void execute(Project project, String action) throws Exception {
+		Method m = project.getClass().getMethod(what);
+		m.invoke(project);
+	}
+
+	public String toString() {
+		return "ra:" + what;
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/ScriptAction.java b/bundleplugin/src/main/java/aQute/bnd/build/ScriptAction.java
index 8ca55fd..cba37e6 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/ScriptAction.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/ScriptAction.java
@@ -3,16 +3,16 @@
 import aQute.bnd.service.action.*;
 
 public class ScriptAction implements Action {
-    final String script;
-    final String type;
-    
-    public ScriptAction(String type, String script) {
-        this.script = script;
-        this.type = type;
-    }
+	final String	script;
+	final String	type;
 
-    public void execute(Project project, String action) throws Exception {
-        project.script(type, script);
-    }
+	public ScriptAction(String type, String script) {
+		this.script = script;
+		this.type = type;
+	}
+
+	public void execute(Project project, String action) throws Exception {
+		project.script(type, script);
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/build/Workspace.java b/bundleplugin/src/main/java/aQute/bnd/build/Workspace.java
index 44a24de..daee3d3 100644
--- a/bundleplugin/src/main/java/aQute/bnd/build/Workspace.java
+++ b/bundleplugin/src/main/java/aQute/bnd/build/Workspace.java
@@ -23,9 +23,9 @@
 	public static final String					BNDDIR		= "bnd";
 	public static final String					CACHEDIR	= "cache";
 
-	static Map<File, WeakReference<Workspace>>	cache		= newHashMap();
-	final Map<String, Project>					models		= newHashMap();
-	final Map<String, Action>					commands	= newMap();
+	static Map<File,WeakReference<Workspace>>	cache		= newHashMap();
+	final Map<String,Project>					models		= newHashMap();
+	final Map<String,Action>					commands	= newMap();
 	final File									buildDir;
 	final Maven									maven		= new Maven(Processor.getExecutor());
 
@@ -132,7 +132,8 @@
 		return false;
 	}
 
-	@Override public void propertiesChanged() {
+	@Override
+	public void propertiesChanged() {
 		super.propertiesChanged();
 		File extDir = new File(this.buildDir, "ext");
 		File[] extensions = extDir.listFiles();
@@ -143,7 +144,8 @@
 					extensionName = extensionName.substring(0, extensionName.length() - ".bnd".length());
 					try {
 						doIncludeFile(extension, false, getProperties(), "ext." + extensionName);
-					} catch (Exception e) {
+					}
+					catch (Exception e) {
 						error("PropertiesChanged: " + e.getMessage());
 					}
 				}
@@ -163,7 +165,7 @@
 		commands.remove(menu);
 	}
 
-	public void fillActions(Map<String, Action> all) {
+	public void fillActions(Map<String,Action> all) {
 		all.putAll(commands);
 	}
 
@@ -187,7 +189,8 @@
 		for (BndListener l : listeners)
 			try {
 				l.changed(f);
-			} catch (Exception e) {
+			}
+			catch (Exception e) {
 				e.printStackTrace();
 			}
 	}
@@ -200,38 +203,42 @@
 					l.begin();
 				else
 					l.end();
-			} catch (Exception e) {
+			}
+			catch (Exception e) {
 				// who cares?
 			}
 	}
 
-	
 	/**
-	 * Signal a BndListener plugin.
-	 * We ran an infinite bug loop :-( 
+	 * Signal a BndListener plugin. We ran an infinite bug loop :-(
 	 */
-	final ThreadLocal<Reporter> signalBusy = new ThreadLocal<Reporter>();
+	final ThreadLocal<Reporter>	signalBusy	= new ThreadLocal<Reporter>();
+
 	public void signal(Reporter reporter) {
-		if ( signalBusy.get() != null)
+		if (signalBusy.get() != null)
 			return;
-		
+
 		signalBusy.set(reporter);
 		try {
 			List<BndListener> listeners = getPlugins(BndListener.class);
 			for (BndListener l : listeners)
 				try {
 					l.signal(this);
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					// who cares?
 				}
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			// Ignore
-		} finally {
+		}
+		finally {
 			signalBusy.set(null);
 		}
 	}
 
-	@Override public void signal() {
+	@Override
+	public void signal() {
 		signal(this);
 	}
 
@@ -251,15 +258,14 @@
 		CachedFileRepo() {
 			super("cache", getFile(buildDir, CACHEDIR), false);
 		}
-		
+
 		public String toString() {
 			return "bnd-cache";
 		}
 
 		protected void init() throws Exception {
 			if (lock.tryLock(50, TimeUnit.SECONDS) == false)
-				throw new TimeLimitExceededException(
-						"Cached File Repo is locked and can't acquire it");
+				throw new TimeLimitExceededException("Cached File Repo is locked and can't acquire it");
 			try {
 				if (!inited) {
 					inited = true;
@@ -275,7 +281,8 @@
 						error("Couldn't find embedded-repo.jar in bundle ");
 					}
 				}
-			} finally {
+			}
+			finally {
 				lock.unlock();
 			}
 		}
@@ -287,20 +294,21 @@
 				while (jentry != null) {
 					if (!jentry.isDirectory()) {
 						File dest = Processor.getFile(dir, jentry.getName());
-						if (!dest.isFile() || dest.lastModified() < jentry.getTime()
-								|| jentry.getTime() == 0) {
+						if (!dest.isFile() || dest.lastModified() < jentry.getTime() || jentry.getTime() == 0) {
 							dest.getParentFile().mkdirs();
 							FileOutputStream out = new FileOutputStream(dest);
 							try {
 								copy(jin, out);
-							} finally {
+							}
+							finally {
 								out.close();
 							}
 						}
 					}
 					jentry = jin.getNextJarEntry();
 				}
-			} finally {
+			}
+			finally {
 				in.close();
 			}
 		}
@@ -345,7 +353,8 @@
 		return maven;
 	}
 
-	@Override protected void setTypeSpecificPlugins(Set<Object> list) {
+	@Override
+	protected void setTypeSpecificPlugins(Set<Object> list) {
 		super.setTypeSpecificPlugins(list);
 		list.add(maven);
 		list.add(new CachedFileRepo());
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericParameter.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericParameter.java
index e187f3c..5118bf3 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericParameter.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericParameter.java
@@ -1,22 +1,24 @@
 package aQute.bnd.compatibility;
 
 public class GenericParameter {
-	String name;
-	GenericType bounds[];
-	
+	String		name;
+	GenericType	bounds[];
+
 	public GenericParameter(String name, GenericType[] bounds) {
 		this.name = name;
 		this.bounds = bounds;
 		if (bounds == null || bounds.length == 0)
-			this.bounds = new GenericType[] { new GenericType( Object.class) };
+			this.bounds = new GenericType[] {
+				new GenericType(Object.class)
+			};
 	}
 
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
 		sb.append(name);
-		if ( bounds != null && bounds.length > 0) {
-			for ( GenericType gtype : bounds ) {
-				sb.append( ":");
+		if (bounds != null && bounds.length > 0) {
+			for (GenericType gtype : bounds) {
+				sb.append(":");
 				sb.append(gtype);
 			}
 		}
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericType.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericType.java
index 847a358..d16affe 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericType.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/GenericType.java
@@ -1,6 +1,5 @@
 package aQute.bnd.compatibility;
 
-
 public class GenericType {
 	public GenericType(Class<Object> class1) {
 		// TODO Auto-generated constructor stub
@@ -11,27 +10,25 @@
 	GenericType[]				a;
 	GenericType[]				b;
 	int							array;
-	
-	Scope	scope;
-	
-		static public class GenericWildcard extends GenericType{
+
+	Scope						scope;
+
+	static public class GenericWildcard extends GenericType {
 
 		public GenericWildcard(Class<Object> class1) {
 			super(class1);
 			// TODO Auto-generated constructor stub
 		}
-		
+
 	}
-	
+
 	static public class GenericArray extends GenericType {
 
 		public GenericArray(Class<Object> class1) {
 			super(class1);
 			// TODO Auto-generated constructor stub
 		}
-		
+
 	}
-	
-	
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/Kind.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/Kind.java
index 1e84030..42626f1 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/Kind.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/Kind.java
@@ -2,7 +2,6 @@
 
 /**
  * The kind of thing we scope
- * 
  */
 public enum Kind {
 	ROOT, CLASS, FIELD, CONSTRUCTOR, METHOD, UNKNOWN;
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/ParseSignatureBuilder.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/ParseSignatureBuilder.java
index f1f91d1..133abb1 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/ParseSignatureBuilder.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/ParseSignatureBuilder.java
@@ -6,30 +6,32 @@
 import aQute.lib.osgi.Descriptors.TypeRef;
 
 public class ParseSignatureBuilder {
-	final Scope			root;
-	
+	final Scope	root;
+
 	public ParseSignatureBuilder(Scope root) {
 		this.root = root;
 	}
-	
-	public void add( Jar jar ) throws Exception {
-		for ( Resource r : jar.getResources().values()) {
+
+	public void add(Jar jar) throws Exception {
+		for (Resource r : jar.getResources().values()) {
 			InputStream in = r.openInputStream();
 			try {
 				parse(in);
-			} finally {
+			}
+			finally {
 				in.close();
 			}
 		}
 	}
-	
-	public Scope getRoot() { return root; }
-	
-	
+
+	public Scope getRoot() {
+		return root;
+	}
+
 	public void parse(InputStream in) throws Exception {
 		Analyzer analyzer = new Analyzer();
 		Clazz clazz = new Clazz(analyzer, "", null);
-		
+
 		clazz.parseClassFile(in, new ClassDataCollector() {
 			Scope	s;
 			Scope	enclosing;
@@ -44,7 +46,7 @@
 
 			@Override
 			public void extendsClass(TypeRef name) {
-//				s.setBase(new GenericType(name));
+				// s.setBase(new GenericType(name));
 			}
 
 			@Override
@@ -55,7 +57,7 @@
 			GenericType[] convert(TypeRef names[]) {
 				GenericType tss[] = new GenericType[names.length];
 				for (int i = 0; i < names.length; i++) {
-//					tss[i] = new GenericType(names[i]);
+					// tss[i] = new GenericType(names[i]);
 				}
 				return tss;
 			}
@@ -92,9 +94,9 @@
 			@Override
 			public void classEnd() {
 				if (enclosing != null)
-					s.setEnclosing( enclosing );
+					s.setEnclosing(enclosing);
 				if (declaring != null)
-					s.setDeclaring( declaring );				
+					s.setDeclaring(declaring);
 			}
 
 			@Override
@@ -106,14 +108,11 @@
 			}
 
 			@Override
-			public void innerClass(TypeRef innerClass, TypeRef outerClass, String innerName,
-					int innerClassAccessFlags) {
+			public void innerClass(TypeRef innerClass, TypeRef outerClass, String innerName, int innerClassAccessFlags) {
 				if (outerClass != null && innerClass != null && innerClass.getBinary().equals(s.name))
 					declaring = root.getScope(outerClass.getBinary());
 			}
 		});
-		
-		
+
 	}
 }
-
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/RuntimeSignatureBuilder.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/RuntimeSignatureBuilder.java
index 32ae94f..9e6b090 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/RuntimeSignatureBuilder.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/RuntimeSignatureBuilder.java
@@ -9,16 +9,15 @@
 		this.root = root;
 	}
 
-	static public String identity(Class<?> c) {
+	static public String identity(Class< ? > c) {
 		return Scope.classIdentity(c.getName());
 	}
 
 	static public String identity(Method m) {
-		return Scope.methodIdentity(m.getName(), getDescriptor(m.getReturnType(), m
-				.getParameterTypes()));
+		return Scope.methodIdentity(m.getName(), getDescriptor(m.getReturnType(), m.getParameterTypes()));
 	}
 
-	static public String identity(Constructor<?> m) {
+	static public String identity(Constructor< ? > m) {
 		return Scope.constructorIdentity(getDescriptor(void.class, m.getParameterTypes()));
 	}
 
@@ -26,11 +25,11 @@
 		return Scope.fieldIdentity(m.getName(), getDescriptor(m.getType(), null));
 	}
 
-	static public String getDescriptor(Class<?> base, Class<?>[] parameters) {
+	static public String getDescriptor(Class< ? > base, Class< ? >[] parameters) {
 		StringBuilder sb = new StringBuilder();
 		if (parameters != null) {
 			sb.append("(");
-			for (Class<?> parameter : parameters) {
+			for (Class< ? > parameter : parameters) {
 				sb.append(getDescriptor(parameter));
 			}
 			sb.append(")");
@@ -39,9 +38,9 @@
 		return sb.toString();
 	}
 
-	public Scope add(Class<?> c) {
-		Scope local = add(root, getEnclosingScope(c), c.getModifiers(), c.getTypeParameters(),
-				Kind.CLASS, identity(c), c.getGenericSuperclass(), c.getGenericInterfaces(), null);
+	public Scope add(Class< ? > c) {
+		Scope local = add(root, getEnclosingScope(c), c.getModifiers(), c.getTypeParameters(), Kind.CLASS, identity(c),
+				c.getGenericSuperclass(), c.getGenericInterfaces(), null);
 
 		for (Field f : c.getDeclaredFields()) {
 			add(local, // declaring scope
@@ -56,7 +55,7 @@
 			);
 		}
 
-		for (Constructor<?> constr : c.getConstructors()) {
+		for (Constructor< ? > constr : c.getConstructors()) {
 			add(local, // class scope
 					local, // enclosing
 					constr.getModifiers(), // access modifiers
@@ -86,20 +85,20 @@
 		return local;
 	}
 
-	private Scope getEnclosingScope(Class<?> c) {
+	private Scope getEnclosingScope(Class< ? > c) {
 		Method m = c.getEnclosingMethod();
 		if (m != null) {
 			Scope s = getGlobalScope(m.getDeclaringClass());
 			return s.getScope(identity(m));
 		}
-// TODO
-//		Constructor cnstr = c.getEnclosingConstructor();
-//		if (m != null) {
-//			Scope s = getGlobalScope(cnstr.getDeclaringClass());
-//			return s.getScope(identity(cnstr));
-//
-//		}
-		Class<?> enclosingClass = c.getEnclosingClass();
+		// TODO
+		// Constructor cnstr = c.getEnclosingConstructor();
+		// if (m != null) {
+		// Scope s = getGlobalScope(cnstr.getDeclaringClass());
+		// return s.getScope(identity(cnstr));
+		//
+		// }
+		Class< ? > enclosingClass = c.getEnclosingClass();
 		if (enclosingClass != null) {
 			return getGlobalScope(enclosingClass);
 		}
@@ -107,23 +106,22 @@
 		return null;
 	}
 
-	private Scope getGlobalScope(Class<?> c) {
+	private Scope getGlobalScope(Class< ? > c) {
 		if (c == null)
 			return null;
 		String id = identity(c);
 		return root.getScope(id);
 	}
 
-	private Scope add(Scope declaring, Scope enclosing, int modifiers,
-			TypeVariable<?>[] typeVariables, Kind kind, String id, Type mainType,
-			Type[] parameterTypes, Type exceptionTypes[]) {
+	private Scope add(Scope declaring, Scope enclosing, int modifiers, TypeVariable< ? >[] typeVariables, Kind kind,
+			String id, Type mainType, Type[] parameterTypes, Type exceptionTypes[]) {
 
 		Scope scope = declaring.getScope(id);
 		assert scope.access == Access.UNKNOWN;
 		scope.setAccess(Access.modifier(modifiers));
 		scope.setKind(kind);
 		scope.setGenericParameter(convert(typeVariables));
-		scope.setBase(convert(scope,mainType));
+		scope.setBase(convert(scope, mainType));
 		scope.setParameterTypes(convert(parameterTypes));
 		scope.setExceptionTypes(convert(exceptionTypes));
 		scope.setDeclaring(declaring);
@@ -135,32 +133,32 @@
 		if (t instanceof ParameterizedType) {
 			// C<P..>
 			ParameterizedType pt = (ParameterizedType) t;
-			/*Scope reference =*/ root.getScope(identity((Class<?>)pt.getRawType()));			
+			/* Scope reference = */root.getScope(identity((Class< ? >) pt.getRawType()));
 			Type args[] = pt.getActualTypeArguments();
 			GenericType[] arguments = new GenericType[args.length];
 			int n = 0;
 			for (Type arg : args)
-				arguments[n++] = convert(source,arg);
-//			return new GenericType(reference,null,arguments);
-			
+				arguments[n++] = convert(source, arg);
+			// return new GenericType(reference,null,arguments);
+
 		} else if (t instanceof TypeVariable) {
-//			TypeVariable tv = (TypeVariable) t;
-//			return new GenericType(source,tv.getName(), null);
+			// TypeVariable tv = (TypeVariable) t;
+			// return new GenericType(source,tv.getName(), null);
 		} else if (t instanceof WildcardType) {
-//			WildcardType wc = (WildcardType) t;
-//			wc.
+			// WildcardType wc = (WildcardType) t;
+			// wc.
 		} else if (t instanceof GenericArrayType) {
 
 		}
-		if (t instanceof Class<?>) {
-//			raw = ((Class<?>) t).getName() + ";";
+		if (t instanceof Class< ? >) {
+			// raw = ((Class<?>) t).getName() + ";";
 		} else
 			throw new IllegalArgumentException(t.toString());
 
 		return null;
 	}
 
-	private GenericParameter[] convert(TypeVariable<?> vars[]) {
+	private GenericParameter[] convert(TypeVariable< ? > vars[]) {
 		if (vars == null)
 			return null;
 
@@ -178,12 +176,12 @@
 
 		GenericType tss[] = new GenericType[parameterTypes.length];
 		for (int i = 0; i < parameterTypes.length; i++) {
-			//tss[i] = new GenericType(parameterTypes[i]);
+			// tss[i] = new GenericType(parameterTypes[i]);
 		}
 		return tss;
 	}
 
-	private static String getDescriptor(Class<?> c) {
+	private static String getDescriptor(Class< ? > c) {
 		StringBuilder sb = new StringBuilder();
 		if (c.isPrimitive()) {
 			if (c == boolean.class)
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/Scope.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/Scope.java
index 7f22f35..43dccbd 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/Scope.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/Scope.java
@@ -4,20 +4,20 @@
 import java.util.*;
 
 public class Scope {
-	final Map<String, Scope>	children	= new LinkedHashMap<String, Scope>();
+	final Map<String,Scope>	children	= new LinkedHashMap<String,Scope>();
 
 	// class: slashed name
 	// field: name ":" typed
 	// constructor: ":(" typed* ")" typed
 	// method: name ":(" typed* ")" typed
-	final String				name;
+	final String			name;
 
-	Access						access;
-	Kind						kind;
-	Scope						enclosing;
-	Scope						declaring;
-	GenericParameter						typeVars[];
-	Map<String, String[]>		name2bounds;
+	Access					access;
+	Kind					kind;
+	Scope					enclosing;
+	Scope					declaring;
+	GenericParameter		typeVars[];
+	Map<String,String[]>	name2bounds;
 
 	// class: super
 	// field: type
@@ -28,11 +28,11 @@
 	// class: interfaces
 	// constructor: args
 	// method: args
-	GenericType[]				parameters;
+	GenericType[]			parameters;
 
 	// constructor: exceptions
 	// method: exceptions
-	GenericType[]				exceptions;
+	GenericType[]			exceptions;
 
 	// class: super interfaces*
 	// field: type
@@ -70,10 +70,10 @@
 
 	public String toString() {
 		StringBuilder sb = new StringBuilder();
-		
-		if ( typeVars != null && typeVars.length !=0) {
+
+		if (typeVars != null && typeVars.length != 0) {
 			sb.append("<");
-			for ( GenericParameter v : typeVars) {
+			for (GenericParameter v : typeVars) {
 				sb.append(v);
 			}
 			sb.append(">");
@@ -81,8 +81,8 @@
 		sb.append(access.toString());
 		sb.append(" ");
 		sb.append(kind.toString());
-		sb.append( " ");
-		sb.append( name );
+		sb.append(" ");
+		sb.append(name);
 		return sb.toString();
 	}
 
@@ -124,7 +124,7 @@
 	}
 
 	static public String classIdentity(String name2) {
-		return name2.replace('.','/');
+		return name2.replace('.', '/');
 	}
 
 	static public String methodIdentity(String name, String descriptor) {
@@ -140,18 +140,18 @@
 	}
 
 	public void cleanRoot() {
-		Iterator<Map.Entry<String, Scope>> i = children.entrySet().iterator();
+		Iterator<Map.Entry<String,Scope>> i = children.entrySet().iterator();
 		while (i.hasNext()) {
-			Map.Entry<String, Scope> entry = i.next();
+			Map.Entry<String,Scope> entry = i.next();
 			if (!entry.getValue().isTop())
 				i.remove();
 		}
 	}
 
 	public void prune(EnumSet<Access> level) {
-		Iterator<Map.Entry<String, Scope>> i = children.entrySet().iterator();
+		Iterator<Map.Entry<String,Scope>> i = children.entrySet().iterator();
 		while (i.hasNext()) {
-			Map.Entry<String, Scope> entry = i.next();
+			Map.Entry<String,Scope> entry = i.next();
 			if (!level.contains(entry.getValue().access))
 				i.remove();
 			else
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/SignatureGenerator.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/SignatureGenerator.java
index 9b31f7f..6567ef8 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/SignatureGenerator.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/SignatureGenerator.java
@@ -1,125 +1,126 @@
 package aQute.bnd.compatibility;
 
-
 public class SignatureGenerator {
-//	enum ACCESS {
-////		PUBLIC("+"), PROTECTED("|"), PACKAGE_PRIVATE(""), PRIVATE("-");
-////		final String	repr;
-////
-////		ACCESS(String s) {
-////			repr = s;
-////		}
-////		
-////		public String toString() {
-////			return repr;
-////		}
-//	}
-//
-//	public static void main(String args[]) throws Exception {
-//		final PrintStream out = System.err;
-//
-//		Clazz c = new Clazz("x", new FileResource(new File(
-//				"src/aQute/bnd/compatibility/SignatureGenerator.class")));
-//		c.parseClassFileWithCollector(new ClassDataCollector() {
-//			public void classBegin(int access, String name) {
-//				out.print(name);
-//				out.println(access(access));
-//			}
-//
-//			private ACCESS access(int access) {
-//				if (Modifier.isPublic(access))
-//					return ACCESS.PUBLIC;
-//
-//				throw new IllegalArgumentException();
-//			}
-//
-//			public void extendsClass(String name) {
-//			}
-//
-//			public void implementsInterfaces(String name[]) {
-//			}
-//
-//			public void addReference(String token) {
-//			}
-//
-//			public void annotation(Annotation annotation) {
-//			}
-//
-//			public void parameter(int p) {
-//			}
-//
-//			public void method(Clazz.MethodDef defined) {
-//				if (defined.isConstructor())
-//					constructor(defined.access, defined.descriptor);
-//				else
-//					method(defined.access, defined.name, defined.descriptor);
-//			}
-//
-//			public void field(Clazz.FieldDef defined) {
-//				field(defined.access, defined.name, defined.descriptor);
-//			}
-//
-//			public void reference(Clazz.MethodDef referenced) {
-//			}
-//
-//			public void reference(Clazz.FieldDef referenced) {
-//			}
-//
-//			public void classEnd() {
-//			}
-//
-//			@Deprecated// Will really be removed!
-//			public void field(int access, String name, String descriptor) {
-//			}
-//
-//			@Deprecated// Will really be removed!
-//			public void constructor(int access, String descriptor) {
-//			}
-//
-//			@Deprecated// Will really be removed!
-//			public void method(int access, String name, String descriptor) {
-//			}
-//
-//			/**
-//			 * 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(String 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
-//			 */
-//			public void innerClass(String innerClass, String outerClass, String innerName,
-//					int innerClassAccessFlags) {
-//			}
-//
-//			public void signature(String signature) {
-//			}
-//
-//			public void constant(Object object) {
-//			}
-//
-//		});
-//	}
+	// enum ACCESS {
+	// // PUBLIC("+"), PROTECTED("|"), PACKAGE_PRIVATE(""), PRIVATE("-");
+	// // final String repr;
+	// //
+	// // ACCESS(String s) {
+	// // repr = s;
+	// // }
+	// //
+	// // public String toString() {
+	// // return repr;
+	// // }
+	// }
+	//
+	// public static void main(String args[]) throws Exception {
+	// final PrintStream out = System.err;
+	//
+	// Clazz c = new Clazz("x", new FileResource(new File(
+	// "src/aQute/bnd/compatibility/SignatureGenerator.class")));
+	// c.parseClassFileWithCollector(new ClassDataCollector() {
+	// public void classBegin(int access, String name) {
+	// out.print(name);
+	// out.println(access(access));
+	// }
+	//
+	// private ACCESS access(int access) {
+	// if (Modifier.isPublic(access))
+	// return ACCESS.PUBLIC;
+	//
+	// throw new IllegalArgumentException();
+	// }
+	//
+	// public void extendsClass(String name) {
+	// }
+	//
+	// public void implementsInterfaces(String name[]) {
+	// }
+	//
+	// public void addReference(String token) {
+	// }
+	//
+	// public void annotation(Annotation annotation) {
+	// }
+	//
+	// public void parameter(int p) {
+	// }
+	//
+	// public void method(Clazz.MethodDef defined) {
+	// if (defined.isConstructor())
+	// constructor(defined.access, defined.descriptor);
+	// else
+	// method(defined.access, defined.name, defined.descriptor);
+	// }
+	//
+	// public void field(Clazz.FieldDef defined) {
+	// field(defined.access, defined.name, defined.descriptor);
+	// }
+	//
+	// public void reference(Clazz.MethodDef referenced) {
+	// }
+	//
+	// public void reference(Clazz.FieldDef referenced) {
+	// }
+	//
+	// public void classEnd() {
+	// }
+	//
+	// @Deprecated// Will really be removed!
+	// public void field(int access, String name, String descriptor) {
+	// }
+	//
+	// @Deprecated// Will really be removed!
+	// public void constructor(int access, String descriptor) {
+	// }
+	//
+	// @Deprecated// Will really be removed!
+	// public void method(int access, String name, String descriptor) {
+	// }
+	//
+	// /**
+	// * 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(String 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
+	// */
+	// public void innerClass(String innerClass, String outerClass, String
+	// innerName,
+	// int innerClassAccessFlags) {
+	// }
+	//
+	// public void signature(String signature) {
+	// }
+	//
+	// public void constant(Object object) {
+	// }
+	//
+	// });
+	// }
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/Signatures.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/Signatures.java
index 2b9ce53..18b89a9 100644
--- a/bundleplugin/src/main/java/aQute/bnd/compatibility/Signatures.java
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/Signatures.java
@@ -29,26 +29,23 @@
  * @version $Id$
  */
 public class Signatures {
-	
-	
+
 	/**
-	 * Check if the environment has generics, i.e. later than 
-	 * Java 5 VM.
+	 * Check if the environment has generics, i.e. later than Java 5 VM.
 	 * 
 	 * @return true if generics are supported
 	 * @throws Exception
 	 */
 	public boolean hasGenerics() throws Exception {
 		try {
-			call( Signatures.class, "getGenericSuperClass");
+			call(Signatures.class, "getGenericSuperClass");
 			return true;
-		} catch( NoSuchMethodException mnfe ) {
+		}
+		catch (NoSuchMethodException mnfe) {
 			return false;
 		}
 	}
-	
-	
-	
+
 	/**
 	 * Helper class to track an index in a string.
 	 */
@@ -72,8 +69,7 @@
 		char take(char c) {
 			char x = s.charAt(i++);
 			if (c != x)
-				throw new IllegalStateException("get() expected " + c
-						+ " but got + " + x);
+				throw new IllegalStateException("get() expected " + c + " but got + " + x);
 			return x;
 		}
 
@@ -92,20 +88,21 @@
 
 	/**
 	 * Calculate the generic signature of a Class,Method,Field, or Constructor.
+	 * 
 	 * @param f
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	public String getSignature(Object c) throws Exception {
-		if( c instanceof Class<?>)
-			return getSignature((Class<?>)c);
-		if( c instanceof Constructor<?>)
-			return getSignature((Constructor<?>)c);
-		if( c instanceof Method)
-			return getSignature((Method)c);
-		if( c instanceof Field)
-			return getSignature((Field)c);
-		
+		if (c instanceof Class< ? >)
+			return getSignature((Class< ? >) c);
+		if (c instanceof Constructor< ? >)
+			return getSignature((Constructor< ? >) c);
+		if (c instanceof Method)
+			return getSignature((Method) c);
+		if (c instanceof Field)
+			return getSignature((Field) c);
+
 		throw new IllegalArgumentException(c.toString());
 	}
 
@@ -116,16 +113,15 @@
 	 * 	  class        ::= declaration? reference reference*
 	 * </pre>
 	 * 
-	 * 
 	 * @param f
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	public String getSignature(Class< ? > c) throws Exception {
 		StringBuilder sb = new StringBuilder();
 		declaration(sb, c);
 		reference(sb, call(c, "getGenericSuperclass"));
-		for (Object type : (Object[]) call(c,"getGenericInterfaces")) {
+		for (Object type : (Object[]) call(c, "getGenericInterfaces")) {
 			reference(sb, type);
 		}
 		return sb.toString();
@@ -140,17 +136,17 @@
 	 * 
 	 * @param c
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	public String getSignature(Method m) throws Exception {
 		StringBuilder sb = new StringBuilder();
 		declaration(sb, m);
 		sb.append('(');
-		for (Object type : (Object[]) call(m,"getGenericParameterTypes")) {
+		for (Object type : (Object[]) call(m, "getGenericParameterTypes")) {
 			reference(sb, type);
 		}
 		sb.append(')');
-		reference(sb, call(m,"getGenericReturnType"));
+		reference(sb, call(m, "getGenericReturnType"));
 		return sb.toString();
 	}
 
@@ -164,13 +160,13 @@
 	 * 
 	 * @param c
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	public String getSignature(Constructor< ? > c) throws Exception {
 		StringBuilder sb = new StringBuilder();
 		declaration(sb, c);
 		sb.append('(');
-		for (Object type : (Object[]) call(c,"getGenericParameterTypes")) {
+		for (Object type : (Object[]) call(c, "getGenericParameterTypes")) {
 			reference(sb, type);
 		}
 		sb.append(')');
@@ -187,11 +183,11 @@
 	 * 
 	 * @param c
 	 * @return
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	public String getSignature(Field f) throws Exception {
 		StringBuilder sb = new StringBuilder();
-		Object t = call(f,"getGenericType");
+		Object t = call(f, "getGenericType");
 		reference(sb, t);
 		return sb.toString();
 	}
@@ -215,13 +211,13 @@
  * @throws Exception 
 	 */
 	private void declaration(StringBuilder sb, Object gd) throws Exception {
-		Object[] typeParameters = (Object[]) call(gd,"getTypeParameters");
+		Object[] typeParameters = (Object[]) call(gd, "getTypeParameters");
 		if (typeParameters.length > 0) {
 			sb.append('<');
 			for (Object tv : typeParameters) {
-				sb.append( call(tv,"getName"));
+				sb.append(call(tv, "getName"));
 
-				Object[] bounds = (Object[]) call(tv,"getBounds");
+				Object[] bounds = (Object[]) call(tv, "getBounds");
 				if (bounds.length > 0 && isInterface(bounds[0])) {
 					sb.append(':');
 				}
@@ -237,22 +233,22 @@
 	/**
 	 * Verify that the type is an interface.
 	 * 
-	 * @param type the type to check.
+	 * @param type
+	 *            the type to check.
 	 * @return true if this is a class that is an interface or a Parameterized
 	 *         Type that is an interface
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	private boolean isInterface(Object type) throws Exception {
 		if (type instanceof Class)
 			return (((Class< ? >) type).isInterface());
 
-		if ( isInstance(type.getClass(), "java.lang.reflect.ParameterizedType"))
-			return isInterface(call(type,"getRawType"));
+		if (isInstance(type.getClass(), "java.lang.reflect.ParameterizedType"))
+			return isInterface(call(type, "getRawType"));
 
 		return false;
 	}
 
-
 /**
 	 * This is the heart of the signature builder. A reference is used
 	 * in a lot of places. It referes to another type.
@@ -271,80 +267,65 @@
 	 */
 	private void reference(StringBuilder sb, Object t) throws Exception {
 
-		if ( isInstance(t.getClass(),"java.lang.reflect.ParameterizedType")) {
+		if (isInstance(t.getClass(), "java.lang.reflect.ParameterizedType")) {
 			sb.append('L');
 			parameterizedType(sb, t);
 			sb.append(';');
 			return;
-		}
-		else
-			if ( isInstance(t.getClass(), "java.lang.reflect.GenericArrayType")) {
-				sb.append('[');
-				reference(sb, call(t,"getGenericComponentType"));
-			}
-			else
-				if ( isInstance(t.getClass(), "java.lang.reflect.WildcardType")) {
-					Object[] lowerBounds = (Object[]) call(t, "getLowerBounds");
-					Object[] upperBounds = (Object[]) call(t, "getUpperBounds");
+		} else if (isInstance(t.getClass(), "java.lang.reflect.GenericArrayType")) {
+			sb.append('[');
+			reference(sb, call(t, "getGenericComponentType"));
+		} else if (isInstance(t.getClass(), "java.lang.reflect.WildcardType")) {
+			Object[] lowerBounds = (Object[]) call(t, "getLowerBounds");
+			Object[] upperBounds = (Object[]) call(t, "getUpperBounds");
 
-					if (upperBounds.length == 1
-							&& upperBounds[0] == Object.class)
-						upperBounds = new Object[0];
+			if (upperBounds.length == 1 && upperBounds[0] == Object.class)
+				upperBounds = new Object[0];
 
-					if (upperBounds.length != 0) {
-						// extend
-						for (Object upper : upperBounds) {
-							sb.append('+');
-							reference(sb, upper);
-						}
-					}
-					else
-						if (lowerBounds.length != 0) {
-							// super, can only be one by the language
-							for (Object lower : lowerBounds) {
-								sb.append('-');
-								reference(sb, lower);
-							}
-						}
-						else
-							sb.append('*');
+			if (upperBounds.length != 0) {
+				// extend
+				for (Object upper : upperBounds) {
+					sb.append('+');
+					reference(sb, upper);
 				}
-				else
-					if ( isInstance(t.getClass(),"java.lang.reflect.TypeVariable")) {
-						sb.append('T');
-						sb.append( call(t,"getName"));
-						sb.append(';');
-					}
-					else
-						if (t instanceof Class< ? >) {
-							Class< ? > c = (Class< ? >) t;
-							if (c.isPrimitive()) {
-								sb.append(primitive(c));
-							}
-							else {
-								sb.append('L');
-								String name = c.getName().replace('.', '/');
-								sb.append(name);
-								sb.append(';');
-							}
-						}
+			} else if (lowerBounds.length != 0) {
+				// super, can only be one by the language
+				for (Object lower : lowerBounds) {
+					sb.append('-');
+					reference(sb, lower);
+				}
+			} else
+				sb.append('*');
+		} else if (isInstance(t.getClass(), "java.lang.reflect.TypeVariable")) {
+			sb.append('T');
+			sb.append(call(t, "getName"));
+			sb.append(';');
+		} else if (t instanceof Class< ? >) {
+			Class< ? > c = (Class< ? >) t;
+			if (c.isPrimitive()) {
+				sb.append(primitive(c));
+			} else {
+				sb.append('L');
+				String name = c.getName().replace('.', '/');
+				sb.append(name);
+				sb.append(';');
+			}
+		}
 	}
 
 	/**
-	 * Creates the signature for a Parameterized Type.
-	 * 
-	 * A Parameterized Type has a raw class and a set of type variables.
+	 * Creates the signature for a Parameterized Type. A Parameterized Type has
+	 * a raw class and a set of type variables.
 	 * 
 	 * @param sb
 	 * @param pt
-	 * @throws Exception 
+	 * @throws Exception
 	 */
 	private void parameterizedType(StringBuilder sb, Object pt) throws Exception {
-		Object owner = call(pt,"getOwnerType");
-		String name = ((Class< ? >) call(pt,"getRawType")).getName()
-				.replace('.', '/');
+		Object owner = call(pt, "getOwnerType");
+		String name = ((Class< ? >) call(pt, "getRawType")).getName().replace('.', '/');
 		if (owner != null) {
-			if ( isInstance(owner.getClass(), "java.lang.reflect.ParameterizedType"))
+			if (isInstance(owner.getClass(), "java.lang.reflect.ParameterizedType"))
 				parameterizedType(sb, owner);
 			else
 				sb.append(((Class< ? >) owner).getName().replace('.', '/'));
@@ -355,7 +336,7 @@
 		sb.append(name);
 
 		sb.append('<');
-		for (Object parameterType : (Object[]) call(pt,"getActualTypeArguments")) {
+		for (Object parameterType : (Object[]) call(pt, "getActualTypeArguments")) {
 			reference(sb, parameterType);
 		}
 		sb.append('>');
@@ -365,40 +346,31 @@
 	/**
 	 * Handle primitives, these need to be translated to a single char.
 	 * 
-	 * @param type the primitive class
+	 * @param type
+	 *            the primitive class
 	 * @return the single char associated with the primitive
 	 */
 	private char primitive(Class< ? > type) {
 		if (type == byte.class)
 			return 'B';
+		else if (type == char.class)
+			return 'C';
+		else if (type == double.class)
+			return 'D';
+		else if (type == float.class)
+			return 'F';
+		else if (type == int.class)
+			return 'I';
+		else if (type == long.class)
+			return 'J';
+		else if (type == short.class)
+			return 'S';
+		else if (type == boolean.class)
+			return 'Z';
+		else if (type == void.class)
+			return 'V';
 		else
-			if (type == char.class)
-				return 'C';
-			else
-				if (type == double.class)
-					return 'D';
-				else
-					if (type == float.class)
-						return 'F';
-					else
-						if (type == int.class)
-							return 'I';
-						else
-							if (type == long.class)
-								return 'J';
-							else
-								if (type == short.class)
-									return 'S';
-								else
-									if (type == boolean.class)
-										return 'Z';
-									else
-										if (type == void.class)
-											return 'V';
-										else
-											throw new IllegalArgumentException(
-													"Unknown primitive type "
-															+ type);
+			throw new IllegalArgumentException("Unknown primitive type " + type);
 	}
 
 	/**
@@ -412,7 +384,7 @@
 
 	public String normalize(String signature) {
 		StringBuilder sb = new StringBuilder();
-		Map<String, String> map = new HashMap<String, String>();
+		Map<String,String> map = new HashMap<String,String>();
 		Rover rover = new Rover(signature);
 		declare(sb, map, rover);
 
@@ -424,8 +396,7 @@
 			}
 			sb.append(rover.take(')'));
 			reference(sb, map, rover, true); // return type
-		}
-		else {
+		} else {
 			// field or class
 			reference(sb, map, rover, true); // field type or super class
 			while (!rover.isEOF()) {
@@ -436,58 +407,51 @@
 	}
 
 	/**
-	 * The heart of the routine. Handle a reference to a type. Can be
-	 * an array, a class, a type variable, or a primitive.
+	 * The heart of the routine. Handle a reference to a type. Can be an array,
+	 * a class, a type variable, or a primitive.
 	 * 
 	 * @param sb
 	 * @param map
 	 * @param rover
 	 * @param primitivesAllowed
 	 */
-	private void reference(StringBuilder sb, Map<String, String> map,
-			Rover rover, boolean primitivesAllowed) {
+	private void reference(StringBuilder sb, Map<String,String> map, Rover rover, boolean primitivesAllowed) {
 
 		char type = rover.take();
 		sb.append(type);
 
 		if (type == '[') {
 			reference(sb, map, rover, true);
-		}
-		else
-			if (type == 'L') {
-				String fqnb = rover.upTo("<;.");
-				sb.append(fqnb);
+		} else if (type == 'L') {
+			String fqnb = rover.upTo("<;.");
+			sb.append(fqnb);
+			body(sb, map, rover);
+			while (rover.peek() == '.') {
+				sb.append(rover.take('.'));
+				sb.append(rover.upTo("<;."));
 				body(sb, map, rover);
-				while (rover.peek() == '.') {
-					sb.append(rover.take('.'));
-					sb.append(rover.upTo("<;."));
-					body(sb, map, rover);
-				}
-				sb.append(rover.take(';'));
 			}
-			else
-				if (type == 'T') {
-					String name = rover.upTo(";");
-					name = assign(map, name);
-					sb.append(name);
-					sb.append(rover.take(';'));
-				}
-				else {
-					if (!primitivesAllowed)
-						throw new IllegalStateException(
-								"Primitives are not allowed without an array");
-				}
+			sb.append(rover.take(';'));
+		} else if (type == 'T') {
+			String name = rover.upTo(";");
+			name = assign(map, name);
+			sb.append(name);
+			sb.append(rover.take(';'));
+		} else {
+			if (!primitivesAllowed)
+				throw new IllegalStateException("Primitives are not allowed without an array");
+		}
 	}
 
 	/**
-	 * Because classes can be nested the body handles the part that can 
-	 * be nested, the reference handles the enclosing L ... ;
+	 * Because classes can be nested the body handles the part that can be
+	 * nested, the reference handles the enclosing L ... ;
 	 * 
 	 * @param sb
 	 * @param map
 	 * @param rover
 	 */
-	private void body(StringBuilder sb, Map<String, String> map, Rover rover) {
+	private void body(StringBuilder sb, Map<String,String> map, Rover rover) {
 		if (rover.peek() == '<') {
 			sb.append(rover.take('<'));
 			while (rover.peek() != '>') {
@@ -528,7 +492,7 @@
 	 * @param map
 	 * @param rover
 	 */
-	private void declare(StringBuilder sb, Map<String, String> map, Rover rover) {
+	private void declare(StringBuilder sb, Map<String,String> map, Rover rover) {
 		char c = rover.peek();
 		if (c == '<') {
 			sb.append(rover.take('<'));
@@ -554,14 +518,16 @@
 	}
 
 	/**
-	 * Handles the assignment of type variables to index names so that
-	 * we have a normalized name for each type var.
+	 * Handles the assignment of type variables to index names so that we have a
+	 * normalized name for each type var.
 	 * 
-	 * @param map the map with variables.
-	 * @param name The name of the variable
+	 * @param map
+	 *            the map with variables.
+	 * @param name
+	 *            The name of the variable
 	 * @return the index name, like _1
 	 */
-	private String assign(Map<String, String> map, String name) {
+	private String assign(Map<String,String> map, String name) {
 		if (map.containsKey(name))
 			return map.get(name);
 		else {
@@ -571,23 +537,23 @@
 		}
 	}
 
-	private boolean isInstance(Class<?> type, String string) {
-		if ( type == null)
+	private boolean isInstance(Class< ? > type, String string) {
+		if (type == null)
 			return false;
-		
-		if ( type.getName().equals(string))
+
+		if (type.getName().equals(string))
 			return true;
-		
-		if ( isInstance( type.getSuperclass(), string))
+
+		if (isInstance(type.getSuperclass(), string))
 			return true;
-		
-		for ( Class<?> intf : type.getInterfaces()) {
-			if ( isInstance(intf,string))
+
+		for (Class< ? > intf : type.getInterfaces()) {
+			if (isInstance(intf, string))
 				return true;
 		}
 		return false;
 	}
-	
+
 	private Object call(Object gd, String string) throws Exception {
 		Method m = gd.getClass().getMethod(string);
 		return m.invoke(gd);
diff --git a/bundleplugin/src/main/java/aQute/bnd/component/AnnotationReader.java b/bundleplugin/src/main/java/aQute/bnd/component/AnnotationReader.java
index 35cec3f..d0b915c 100644
--- a/bundleplugin/src/main/java/aQute/bnd/component/AnnotationReader.java
+++ b/bundleplugin/src/main/java/aQute/bnd/component/AnnotationReader.java
@@ -47,7 +47,7 @@
 	MethodDef					method;
 	TypeRef						className;
 	Analyzer					analyzer;
-	MultiMap<String, String>	methods					= new MultiMap<String, String>();
+	MultiMap<String,String>		methods					= new MultiMap<String,String>();
 	TypeRef						extendsClass;
 	boolean						inherit;
 	boolean						baseclass				= true;
@@ -77,29 +77,26 @@
 
 				Clazz ec = analyzer.findClass(extendsClass);
 				if (ec == null) {
-					analyzer.error("Missing super class for DS annotations: " + extendsClass
-							+ " from " + clazz.getClassName());
+					analyzer.error("Missing super class for DS annotations: " + extendsClass + " from "
+							+ clazz.getClassName());
 				} else {
 					ec.parseClassFileWithCollector(this);
 				}
 			}
 		}
 		for (ReferenceDef rdef : component.references.values()) {
-			rdef.unbind = referredMethod(analyzer, rdef, rdef.unbind, "add(.*)", "remove$1",
-					"(.*)", "un$1");
-			rdef.updated = referredMethod(analyzer, rdef, rdef.updated, "(add|set|bind)(.*)",
-					"updated$2", "(.*)", "updated$1");
+			rdef.unbind = referredMethod(analyzer, rdef, rdef.unbind, "add(.*)", "remove$1", "(.*)", "un$1");
+			rdef.updated = referredMethod(analyzer, rdef, rdef.updated, "(add|set|bind)(.*)", "updated$2", "(.*)",
+					"updated$1");
 		}
 		return component;
 	}
 
 	/**
-	 * 
 	 * @param analyzer
 	 * @param rdef
 	 */
-	protected String referredMethod(Analyzer analyzer, ReferenceDef rdef, String value,
-			String... matches) {
+	protected String referredMethod(Analyzer analyzer, ReferenceDef rdef, String value, String... matches) {
 		if (value == null) {
 			String bind = rdef.bind;
 			for (int i = 0; i < matches.length; i += 2) {
@@ -117,8 +114,7 @@
 				Matcher matcher = BINDDESCRIPTOR.matcher(descriptor);
 				if (matcher.matches()) {
 					String type = matcher.group(2);
-					if (rdef.service.equals(Clazz.objectDescriptorToFQN(type))
-							|| type.equals("Ljava/util/Map;")
+					if (rdef.service.equals(Clazz.objectDescriptorToFQN(type)) || type.equals("Ljava/util/Map;")
 							|| type.equals("Lorg/osgi/framework/ServiceReference;")) {
 
 						return value;
@@ -145,7 +141,8 @@
 				doModified();
 			else if (a instanceof Reference)
 				doReference((Reference) a, annotation);
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			e.printStackTrace();
 			analyzer.error("During generation of a component on class %s, exception %s", clazz, e);
 		}
@@ -187,7 +184,7 @@
 
 		if (def.name == null) {
 			Matcher m = BINDNAME.matcher(method.getName());
-			if ( m.matches() )
+			if (m.matches())
 				def.name = m.group(2);
 			else
 				analyzer.error("Invalid name for bind method %s", method.getName());
@@ -315,8 +312,7 @@
 					String value = m.group(4);
 					component.property.add(key, value);
 				} else
-					throw new IllegalArgumentException("Malformed property '" + p
-							+ "' on component: " + className);
+					throw new IllegalArgumentException("Malformed property '" + p + "' on component: " + className);
 			}
 		}
 	}
@@ -325,15 +321,18 @@
 	 * Are called during class parsing
 	 */
 
-	@Override public void classBegin(int access, TypeRef name) {
+	@Override
+	public void classBegin(int access, TypeRef name) {
 		className = name;
 	}
 
-	@Override public void implementsInterfaces(TypeRef[] interfaces) {
+	@Override
+	public void implementsInterfaces(TypeRef[] interfaces) {
 		this.interfaces = interfaces;
 	}
 
-	@Override public void method(Clazz.MethodDef method) {
+	@Override
+	public void method(Clazz.MethodDef method) {
 		int access = method.getAccess();
 
 		if (Modifier.isAbstract(access) || Modifier.isStatic(access))
@@ -346,7 +345,8 @@
 		methods.add(method.getName(), method.getDescriptor().toString());
 	}
 
-	@Override public void extendsClass(TypeRef name) {
+	@Override
+	public void extendsClass(TypeRef name) {
 		this.extendsClass = name;
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/bnd/component/ComponentDef.java b/bundleplugin/src/main/java/aQute/bnd/component/ComponentDef.java
index 75b7b73..edcd909 100644
--- a/bundleplugin/src/main/java/aQute/bnd/component/ComponentDef.java
+++ b/bundleplugin/src/main/java/aQute/bnd/component/ComponentDef.java
@@ -21,8 +21,8 @@
 class ComponentDef {
 	final static String				NAMESPACE_STEM	= "http://www.osgi.org/xmlns/scr";
 	final List<String>				properties		= new ArrayList<String>();
-	final MultiMap<String, String>	property		= new MultiMap<String, String>();
-	final Map<String, ReferenceDef>	references		= new TreeMap<String, ReferenceDef>();
+	final MultiMap<String,String>	property		= new MultiMap<String,String>();
+	final Map<String,ReferenceDef>	references		= new TreeMap<String,ReferenceDef>();
 
 	Version							version			= AnnotationReader.V1_1;
 	String							name;
@@ -75,7 +75,7 @@
 		if (configurationPid != null)
 			version = ReferenceDef.max(version, AnnotationReader.V1_2);
 
-		for (Map.Entry<String, List<String>> kvs : property.entrySet()) {
+		for (Map.Entry<String,List<String>> kvs : property.entrySet()) {
 			Tag property = new Tag("property");
 			String name = kvs.getKey();
 			String type = null;
@@ -127,8 +127,7 @@
 			component.addAttribute("servicefactory", servicefactory);
 
 		if (configurationPolicy != null)
-			component.addAttribute("configuration-policy", configurationPolicy.toString()
-					.toLowerCase());
+			component.addAttribute("configuration-policy", configurationPolicy.toString().toLowerCase());
 
 		if (enabled != null)
 			component.addAttribute("enabled", enabled);
@@ -185,7 +184,7 @@
 			return v;
 
 		try {
-			Class<?> c = Class.forName("java.lang." + type);
+			Class< ? > c = Class.forName("java.lang." + type);
 			if (c == String.class)
 				return v;
 
@@ -194,13 +193,17 @@
 				c = Integer.class;
 			Method m = c.getMethod("valueOf", String.class);
 			m.invoke(null, v);
-		} catch (ClassNotFoundException e) {
+		}
+		catch (ClassNotFoundException e) {
 			analyzer.error("Invalid data type %s", type);
-		} catch (NoSuchMethodException e) {
+		}
+		catch (NoSuchMethodException e) {
 			analyzer.error("Cannot convert data %s to type %s", v, type);
-		} catch (NumberFormatException e) {
+		}
+		catch (NumberFormatException e) {
 			analyzer.error("Not a valid number %s for %s, %s", v, type, e.getMessage());
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			analyzer.error("Cannot convert data %s to type %s", v, type);
 		}
 		return v;
diff --git a/bundleplugin/src/main/java/aQute/bnd/component/DSAnnotations.java b/bundleplugin/src/main/java/aQute/bnd/component/DSAnnotations.java
index 90a20af..0fd4011 100644
--- a/bundleplugin/src/main/java/aQute/bnd/component/DSAnnotations.java
+++ b/bundleplugin/src/main/java/aQute/bnd/component/DSAnnotations.java
@@ -8,23 +8,21 @@
 
 /**
  * Analyze the class space for any classes that have an OSGi annotation for DS.
- * 
  */
 public class DSAnnotations implements AnalyzerPlugin {
 
 	public boolean analyzeJar(Analyzer analyzer) throws Exception {
-		Parameters header = OSGiHeader.parseHeader(analyzer
-				.getProperty(Constants.DSANNOTATIONS));
-		if ( header.size()==0)
+		Parameters header = OSGiHeader.parseHeader(analyzer.getProperty(Constants.DSANNOTATIONS));
+		if (header.size() == 0)
 			return false;
-		
+
 		Instructions instructions = new Instructions(header);
 		Set<Clazz> list = new HashSet<Clazz>(analyzer.getClassspace().values());
 		String sc = analyzer.getProperty(Constants.SERVICE_COMPONENT);
 		List<String> names = new ArrayList<String>();
-		if ( sc != null && sc.trim().length() > 0)
+		if (sc != null && sc.trim().length() > 0)
 			names.add(sc);
-		
+
 		for (Iterator<Clazz> i = list.iterator(); i.hasNext();) {
 			for (Instruction instruction : instructions.keySet()) {
 				Clazz c = i.next();
@@ -38,8 +36,7 @@
 							definition.prepare(analyzer);
 							String name = "OSGI-INF/" + definition.name + ".xml";
 							names.add(name);
-							analyzer.getJar().putResource(name,
-									new TagResource(definition.getTag()));
+							analyzer.getJar().putResource(name, new TagResource(definition.getTag()));
 						}
 					}
 				}
diff --git a/bundleplugin/src/main/java/aQute/bnd/component/ReferenceDef.java b/bundleplugin/src/main/java/aQute/bnd/component/ReferenceDef.java
index 162bdb4..7dfc8b0 100644
--- a/bundleplugin/src/main/java/aQute/bnd/component/ReferenceDef.java
+++ b/bundleplugin/src/main/java/aQute/bnd/component/ReferenceDef.java
@@ -11,7 +11,7 @@
  */
 
 class ReferenceDef {
-	Version					version = AnnotationReader.V1_1;
+	Version					version	= AnnotationReader.V1_1;
 	String					name;
 	String					service;
 	ReferenceCardinality	cardinality;
@@ -25,25 +25,26 @@
 	/**
 	 * Prepare the reference, will check for any errors.
 	 * 
-	 * @param analyzer the analyzer to report errors to.
-	 * @throws Exception 
+	 * @param analyzer
+	 *            the analyzer to report errors to.
+	 * @throws Exception
 	 */
 	public void prepare(Analyzer analyzer) throws Exception {
 		if (name == null)
 			analyzer.error("No name for a reference");
-		
-		if ((updated != null && !updated.equals("-")) || policyOption!= null)
+
+		if ((updated != null && !updated.equals("-")) || policyOption != null)
 			version = max(version, AnnotationReader.V1_2);
 
 		if (target != null) {
 			String error = Verifier.validateFilter(target);
-			if ( error != null)
+			if (error != null)
 				analyzer.error("Invalid target filter %s for %s", target, name);
 		}
 
-		if ( service == null)
+		if (service == null)
 			analyzer.error("No interface specified on %s", name);
-		
+
 	}
 
 	/**
@@ -71,12 +72,12 @@
 		if (unbind != null && !"-".equals(unbind))
 			ref.addAttribute("unbind", unbind);
 
-		if (updated != null && !"-".equals(updated)) 
+		if (updated != null && !"-".equals(updated))
 			ref.addAttribute("updated", updated);
 
-		if ( policyOption != null)
+		if (policyOption != null)
 			ref.addAttribute("policy-option", policyOption.toString());
-		
+
 		return ref;
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/bnd/differ/Baseline.java b/bundleplugin/src/main/java/aQute/bnd/differ/Baseline.java
index eee3e27..3228b7b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/differ/Baseline.java
+++ b/bundleplugin/src/main/java/aQute/bnd/differ/Baseline.java
@@ -14,7 +14,6 @@
 
 /**
  * This class maintains
- * 
  */
 public class Baseline {
 
@@ -22,18 +21,19 @@
 		public String				packageName;
 		public Diff					packageDiff;
 		public Collection<String>	providers;
-		public Map<String, String>	attributes;
+		public Map<String,String>	attributes;
 		public Version				newerVersion;
 		public Version				olderVersion;
 		public Version				suggestedVersion;
 		public Version				suggestedIfProviders;
 		public boolean				mismatch;
-		public String				warning="";
+		public String				warning	= "";
 
 	}
 
 	final Differ	differ;
 	final Reporter	bnd;
+	Diff			diff;
 
 	public Baseline(Reporter bnd, Differ differ) throws IOException {
 		this.differ = differ;
@@ -51,25 +51,24 @@
 	 *         packages (also the ones that were ok).
 	 * @throws Exception
 	 */
-	public Set<Info> baseline(Jar newer, Jar older, Instructions packageFilters)
-			throws Exception {
+	public Set<Info> baseline(Jar newer, Jar older, Instructions packageFilters) throws Exception {
 		Tree n = differ.tree(newer);
 		Parameters nExports = getExports(newer);
 		Tree o = differ.tree(older);
 		Parameters oExports = getExports(older);
-		if ( packageFilters == null)
+		if (packageFilters == null)
 			packageFilters = new Instructions();
-		
+
 		return baseline(n, nExports, o, oExports, packageFilters);
 	}
 
-	public Set<Info> baseline(Tree n, Parameters nExports, Tree o,
-			Parameters oExports, Instructions packageFilters)
+	public Set<Info> baseline(Tree n, Parameters nExports, Tree o, Parameters oExports, Instructions packageFilters)
 			throws Exception {
-		Diff diff = n.diff(o).get("<api>");
+		diff = n.diff(o);
+		Diff apiDiff = diff.get("<api>");
 		Set<Info> infos = Create.set();
 
-		for (Diff pdiff : diff.getChildren()) {
+		for (Diff pdiff : apiDiff.getChildren()) {
 			if (pdiff.getType() != Type.PACKAGE) // Just packages
 				continue;
 
@@ -85,13 +84,13 @@
 			info.packageDiff = pdiff;
 			info.packageName = pdiff.getName();
 			info.attributes = nExports.get(info.packageName);
-			bnd.trace("attrs for %s %s", info.packageName,info.attributes);
+			bnd.trace("attrs for %s %s", info.packageName, info.attributes);
 
 			info.newerVersion = getVersion(info.attributes);
 			info.olderVersion = getVersion(oExports.get(info.packageName));
 			if (pdiff.getDelta() == Delta.UNCHANGED) {
 				info.suggestedVersion = info.olderVersion;
-				if( !info.newerVersion.equals(info.olderVersion)) {
+				if (!info.newerVersion.equals(info.olderVersion)) {
 					info.warning += "No difference but versions are equal";
 				}
 			} else if (pdiff.getDelta() == Delta.REMOVED) {
@@ -122,8 +121,7 @@
 						// by making them providers
 						Delta tryDelta = pdiff.getDelta(new Ignore() {
 							public boolean contains(Diff diff) {
-								if (diff.getType() == Type.INTERFACE
-										&& diff.getDelta() == Delta.MAJOR) {
+								if (diff.getType() == Type.INTERFACE && diff.getDelta() == Delta.MAJOR) {
 									info.providers.add(Descriptors.getShortName(diff.getName()));
 									return true;
 								}
@@ -141,22 +139,31 @@
 		return infos;
 	}
 
+	/**
+	 * Gets the generated diff
+	 * 
+	 * @return the diff
+	 */
+	public Diff getDiff() {
+		return diff;
+	}
+
 	private Version bump(Delta delta, Version last, int offset, int base) {
 		switch (delta) {
-		case UNCHANGED:
-			return last;
-		case MINOR:
-			return new Version(last.getMajor(), last.getMinor() + offset, base);
-		case MAJOR:
-			return new Version(last.getMajor() + 1, base, base);
-		case ADDED:
-			return last;
-		default:
-			return new Version(last.getMajor(), last.getMinor(), last.getMicro() + offset);
+			case UNCHANGED :
+				return last;
+			case MINOR :
+				return new Version(last.getMajor(), last.getMinor() + offset, base);
+			case MAJOR :
+				return new Version(last.getMajor() + 1, base, base);
+			case ADDED :
+				return last;
+			default :
+				return new Version(last.getMajor(), last.getMinor(), last.getMicro() + offset);
 		}
 	}
 
-	private Version getVersion(Map<String, String> map) {
+	private Version getVersion(Map<String,String> map) {
 		if (map == null)
 			return Version.LOWEST;
 
diff --git a/bundleplugin/src/main/java/aQute/bnd/differ/DiffImpl.java b/bundleplugin/src/main/java/aQute/bnd/differ/DiffImpl.java
index 7b675c2..ea6cd50 100644
--- a/bundleplugin/src/main/java/aQute/bnd/differ/DiffImpl.java
+++ b/bundleplugin/src/main/java/aQute/bnd/differ/DiffImpl.java
@@ -17,8 +17,8 @@
 
 public class DiffImpl implements Diff, Comparable<DiffImpl> {
 
-	final Element				older;
-	final Element				newer;
+	final Tree				older;
+	final Tree				newer;
 	final Collection<DiffImpl>	children;
 	final Delta					delta;
 
@@ -28,14 +28,30 @@
 	 * child delta for each child. This escalates deltas from below up.
 	 */
 	final static Delta[][]		TRANSITIONS	= {
-			{ IGNORED, UNCHANGED, CHANGED, MICRO, MINOR, MAJOR }, // IGNORED
-			{ IGNORED, UNCHANGED, CHANGED, MICRO, MINOR, MAJOR }, // UNCHANGED
-			{ IGNORED, CHANGED, CHANGED, MICRO, MINOR, MAJOR }, // CHANGED
-			{ IGNORED, MICRO, MICRO, MICRO, MINOR, MAJOR }, // MICRO
-			{ IGNORED, MINOR, MINOR, MINOR, MINOR, MAJOR }, // MINOR
-			{ IGNORED, MAJOR, MAJOR, MAJOR, MAJOR, MAJOR }, // MAJOR
-			{ IGNORED, MAJOR, MAJOR, MAJOR, MAJOR, MAJOR }, // REMOVED
-			{ IGNORED, MINOR, MINOR, MINOR, MINOR, MAJOR }, // ADDED
+			{
+			IGNORED, UNCHANGED, CHANGED, MICRO, MINOR, MAJOR
+			}, // IGNORED
+			{
+			IGNORED, UNCHANGED, CHANGED, MICRO, MINOR, MAJOR
+			}, // UNCHANGED
+			{
+			IGNORED, CHANGED, CHANGED, MICRO, MINOR, MAJOR
+			}, // CHANGED
+			{
+			IGNORED, MICRO, MICRO, MICRO, MINOR, MAJOR
+			}, // MICRO
+			{
+			IGNORED, MINOR, MINOR, MINOR, MINOR, MAJOR
+			}, // MINOR
+			{
+			IGNORED, MAJOR, MAJOR, MAJOR, MAJOR, MAJOR
+			}, // MAJOR
+			{
+			IGNORED, MAJOR, MAJOR, MAJOR, MAJOR, MAJOR
+			}, // REMOVED
+			{
+			IGNORED, MINOR, MINOR, MINOR, MINOR, MAJOR
+			}, // ADDED
 											};
 
 	/**
@@ -48,22 +64,22 @@
 	 *            The older Element
 	 * @param types
 	 */
-	DiffImpl(Element newer, Element older) {
+	public DiffImpl(Tree newer, Tree older) {
 		assert newer != null || older != null;
 		this.older = older;
 		this.newer = newer;
 
 		// Either newer or older can be null, indicating remove or add
 		// so we have to be very careful.
-		Element[] newerChildren = newer == null ? Element.EMPTY : newer.children;
-		Element[] olderChildren = older == null ? Element.EMPTY : older.children;
+		Tree[] newerChildren = newer == null ? Element.EMPTY : newer.getChildren();
+		Tree[] olderChildren = older == null ? Element.EMPTY : older.getChildren();
 
 		int o = 0;
 		int n = 0;
 		List<DiffImpl> children = new ArrayList<DiffImpl>();
 		while (true) {
-			Element nw = n < newerChildren.length ? newerChildren[n] : null;
-			Element ol = o < olderChildren.length ? olderChildren[o] : null;
+			Tree nw = n < newerChildren.length ? newerChildren[n] : null;
+			Tree ol = o < olderChildren.length ? olderChildren[o] : null;
 			DiffImpl diff;
 
 			if (nw == null && ol == null)
@@ -136,9 +152,9 @@
 			for (DiffImpl child : children) {
 				Delta sub = child.getDelta(ignore);
 				if (sub == REMOVED)
-					sub = child.older.remove;
+					sub = child.older.ifRemoved();
 				else if (sub == ADDED)
-					sub = child.newer.add;
+					sub = child.newer.ifAdded();
 
 				// The escalate method is used to calculate the default
 				// transition in the
@@ -160,7 +176,7 @@
 		return (newer == null ? older : newer).getName();
 	}
 
-	public Collection<? extends Diff> getChildren() {
+	public Collection< ? extends Diff> getChildren() {
 		return children;
 	}
 
@@ -171,8 +187,7 @@
 	public boolean equals(Object other) {
 		if (other instanceof DiffImpl) {
 			DiffImpl o = (DiffImpl) other;
-			return getDelta() == o.getDelta() && getType() == o.getType()
-					&& getName().equals(o.getName());
+			return getDelta() == o.getDelta() && getType() == o.getType() && getName().equals(o.getName());
 		}
 		return false;
 	}
@@ -207,4 +222,19 @@
 		return newer;
 	}
 
+	public Data serialize() {
+		Data data = new Data();
+		data.type = getType();
+		data.delta = delta;
+		data.name = getName();
+		data.children = new Data[children.size()];
+		
+		int i=0;		
+		for ( Diff d : children)
+			data.children[i++] = d.serialize();
+				
+		return data;
+	}
+
+
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/differ/DiffPluginImpl.java b/bundleplugin/src/main/java/aQute/bnd/differ/DiffPluginImpl.java
index e3a1308..2fb366b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/differ/DiffPluginImpl.java
+++ b/bundleplugin/src/main/java/aQute/bnd/differ/DiffPluginImpl.java
@@ -14,26 +14,23 @@
 import aQute.libg.cryptography.*;
 import aQute.libg.header.*;
 
-
 /**
  * This Diff Plugin Implementation will compare JARs for their API (based on the
  * Bundle Class Path and exported packages), the Manifest, and the resources.
  * The Differences are represented in a {@link Diff} tree.
  */
 public class DiffPluginImpl implements Differ {
-	
+
 	/**
 	 * Headers that are considered major enough to parse according to spec and
 	 * compare their constituents
 	 */
-	final static Set<String>				MAJOR_HEADERS	= new TreeSet<String>(
-																	String.CASE_INSENSITIVE_ORDER);
+	final static Set<String>	MAJOR_HEADERS	= new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
 
 	/**
 	 * Headers that are considered not major enough to be considered
 	 */
-	final static Set<String>				IGNORE_HEADERS	= new TreeSet<String>(
-																	String.CASE_INSENSITIVE_ORDER);
+	final static Set<String>	IGNORE_HEADERS	= new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
 
 	static {
 		MAJOR_HEADERS.add(Constants.EXPORT_PACKAGE);
@@ -52,7 +49,6 @@
 	}
 
 	/**
-	 * 
 	 * @see aQute.bnd.service.diff.Differ#diff(aQute.lib.resource.Jar,
 	 *      aQute.lib.resource.Jar)
 	 */
@@ -60,22 +56,23 @@
 		Jar jnewer = new Jar(newer);
 		try {
 			return tree(jnewer);
-		} finally {
+		}
+		finally {
 			jnewer.close();
 		}
 	}
 
 	/**
-	 * 
 	 * @see aQute.bnd.service.diff.Differ#diff(aQute.lib.resource.Jar,
 	 *      aQute.lib.resource.Jar)
 	 */
 	public Tree tree(Jar newer) throws Exception {
 		Analyzer anewer = new Analyzer();
 		try {
-				anewer.setJar(newer);
-				return tree(anewer);
-		} finally {
+			anewer.setJar(newer);
+			return tree(anewer);
+		}
+		finally {
 			anewer.setJar((Jar) null);
 			anewer.close();
 		}
@@ -88,7 +85,7 @@
 	/**
 	 * Create an element representing a bundle from the Jar.
 	 * 
-	 * @param infos 
+	 * @param infos
 	 * @param jar
 	 *            The Jar to be analyzed
 	 * @return the elements that should be compared
@@ -104,8 +101,7 @@
 			result.add(manifestElement(manifest));
 		}
 		result.add(resourcesElement(analyzer.getJar()));
-		return new Element(Type.BUNDLE, analyzer.getJar().getName(), result, CHANGED, CHANGED,
-				null);
+		return new Element(Type.BUNDLE, analyzer.getJar().getName(), result, CHANGED, CHANGED, null);
 	}
 
 	/**
@@ -117,25 +113,22 @@
 	 */
 	private Element resourcesElement(Jar jar) throws Exception {
 		List<Element> resources = new ArrayList<Element>();
-		for (Map.Entry<String, Resource> entry : jar.getResources().entrySet()) {
+		for (Map.Entry<String,Resource> entry : jar.getResources().entrySet()) {
 
 			InputStream in = entry.getValue().openInputStream();
 			try {
 				Digester<SHA1> digester = SHA1.getDigester();
 				IO.copy(in, digester);
 				String value = Hex.toHexString(digester.digest().digest());
-				resources
-						.add(new Element(Type.RESOURCE, entry.getKey()+"="+value, null, CHANGED, CHANGED, null));
-			} finally {
+				resources.add(new Element(Type.RESOURCE, entry.getKey() + "=" + value, null, CHANGED, CHANGED, null));
+			}
+			finally {
 				in.close();
 			}
 		}
 		return new Element(Type.RESOURCES, "<resources>", resources, CHANGED, CHANGED, null);
 	}
 
-
-
-
 	/**
 	 * Create an element for each manifest header. There are
 	 * {@link #IGNORE_HEADERS} and {@link #MAJOR_HEADERS} that will be treated
@@ -157,18 +150,17 @@
 			if (MAJOR_HEADERS.contains(header)) {
 				Parameters clauses = OSGiHeader.parseHeader(value);
 				Collection<Element> clausesDef = new ArrayList<Element>();
-				for (Map.Entry<String, Attrs> clause : clauses.entrySet()) {
+				for (Map.Entry<String,Attrs> clause : clauses.entrySet()) {
 					Collection<Element> parameterDef = new ArrayList<Element>();
-					for (Map.Entry<String, String> parameter : clause.getValue().entrySet()) {
-						parameterDef.add(new Element(Type.PARAMETER, parameter.getKey() + ":" + parameter
-								.getValue(), null, CHANGED, CHANGED, null));
+					for (Map.Entry<String,String> parameter : clause.getValue().entrySet()) {
+						parameterDef.add(new Element(Type.PARAMETER, parameter.getKey() + ":" + parameter.getValue(),
+								null, CHANGED, CHANGED, null));
 					}
-					clausesDef.add(new Element(Type.CLAUSE, clause.getKey(), parameterDef,
-							CHANGED, CHANGED, null));
+					clausesDef.add(new Element(Type.CLAUSE, clause.getKey(), parameterDef, CHANGED, CHANGED, null));
 				}
 				result.add(new Element(Type.HEADER, header, clausesDef, CHANGED, CHANGED, null));
 			} else {
-				result.add(new Element(Type.HEADER, header +":"+ value, null,CHANGED, CHANGED, null));
+				result.add(new Element(Type.HEADER, header + ":" + value, null, CHANGED, CHANGED, null));
 			}
 		}
 		return new Element(Type.MANIFEST, "<manifest>", result, CHANGED, CHANGED, null);
diff --git a/bundleplugin/src/main/java/aQute/bnd/differ/Element.java b/bundleplugin/src/main/java/aQute/bnd/differ/Element.java
index 602f95c..683c7a8 100644
--- a/bundleplugin/src/main/java/aQute/bnd/differ/Element.java
+++ b/bundleplugin/src/main/java/aQute/bnd/differ/Element.java
@@ -20,7 +20,7 @@
  * unnecessary.
  */
 
-class Element implements Comparable<Element>, Tree {
+class Element implements Tree {
 	final static Element[]	EMPTY	= new Element[0];
 	final Type				type;
 	final String			name;
@@ -37,8 +37,7 @@
 		this(type, name, Arrays.asList(children), Delta.MINOR, Delta.MAJOR, null);
 	}
 
-	Element(Type type, String name, Collection<? extends Element> children, Delta add,
-			Delta remove, String comment) {
+	Element(Type type, String name, Collection< ? extends Element> children, Delta add, Delta remove, String comment) {
 		this.type = type;
 		this.name = name;
 		this.add = add;
@@ -66,6 +65,7 @@
 			Arrays.sort(this.children);
 		}
 	}
+
 	public Data serialize() {
 		Data data = new Data();
 		data.type = this.type;
@@ -94,11 +94,11 @@
 		return comment;
 	}
 
-	public int compareTo(Element other) {
-		if (type == other.type)
-			return name.compareTo(other.name);
+	public int compareTo(Tree other) {
+		if (type == other.getType())
+			return name.compareTo(other.getName());
 		else
-			return type.compareTo(other.type);
+			return type.compareTo(other.getType());
 	}
 
 	public boolean equals(Object other) {
@@ -135,10 +135,9 @@
 		}
 		return null;
 	}
-	
+
 	public String toString() {
 		return type + " " + name + " (" + add + "/" + remove + ")";
 	}
 
-
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/differ/JavaElement.java b/bundleplugin/src/main/java/aQute/bnd/differ/JavaElement.java
index e9a77a5..c5bdb4b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/differ/JavaElement.java
+++ b/bundleplugin/src/main/java/aQute/bnd/differ/JavaElement.java
@@ -47,32 +47,26 @@
  * <li>MAJOR - +final
  * <li>MAJOR - +protected
  * </ul>
- * 
  */
 
 class JavaElement {
-	final static EnumSet<Type>			INHERITED		= EnumSet.of(FIELD, METHOD, EXTENDS,
-																IMPLEMENTS);
-	private static final Element		PROTECTED		= new Element(ACCESS, "protected", null,
-																MAJOR, MINOR, null);
-	private static final Element		STATIC			= new Element(ACCESS, "static", null,
-																MAJOR, MAJOR, null);
-	private static final Element		ABSTRACT		= new Element(ACCESS, "abstract", null,
-																MAJOR, MINOR, null);
-	private static final Element		FINAL			= new Element(ACCESS, "final", null, MAJOR,
-																MINOR, null);
+	final static EnumSet<Type>			INHERITED		= EnumSet.of(FIELD, METHOD, EXTENDS, IMPLEMENTS);
+	private static final Element		PROTECTED		= new Element(ACCESS, "protected", null, MAJOR, MINOR, null);
+	private static final Element		STATIC			= new Element(ACCESS, "static", null, MAJOR, MAJOR, null);
+	private static final Element		ABSTRACT		= new Element(ACCESS, "abstract", null, MAJOR, MINOR, null);
+	private static final Element		FINAL			= new Element(ACCESS, "final", null, MAJOR, MINOR, null);
 	// private static final Element DEPRECATED = new Element(ACCESS,
 	// "deprecated", null,
 	// CHANGED, CHANGED, null);
 
 	final Analyzer						analyzer;
-	final Map<PackageRef, Instructions>	providerMatcher	= Create.map();
+	final Map<PackageRef,Instructions>	providerMatcher	= Create.map();
 	final Set<TypeRef>					notAccessible	= Create.set();
-	final Map<Object, Element>			cache			= Create.map();
+	final Map<Object,Element>			cache			= Create.map();
 	MultiMap<PackageRef, //
 	Element>							packages;
 	final MultiMap<TypeRef, //
-	Element>							covariant		= new MultiMap<TypeRef, Element>();
+	Element>							covariant		= new MultiMap<TypeRef,Element>();
 	final Set<JAVA>						javas			= Create.set();
 	final Packages						exports;
 
@@ -87,10 +81,9 @@
 		this.analyzer = analyzer;
 
 		Manifest manifest = analyzer.getJar().getManifest();
-		if (manifest != null
-				&& manifest.getMainAttributes().getValue(Constants.BUNDLE_MANIFESTVERSION) != null) {
+		if (manifest != null && manifest.getMainAttributes().getValue(Constants.BUNDLE_MANIFESTVERSION) != null) {
 			exports = new Packages();
-			for (Map.Entry<String, Attrs> entry : OSGiHeader.parseHeader(
+			for (Map.Entry<String,Attrs> entry : OSGiHeader.parseHeader(
 					manifest.getMainAttributes().getValue(Constants.EXPORT_PACKAGE)).entrySet())
 				exports.put(analyzer.getPackageRef(entry.getKey()), entry.getValue());
 		} else
@@ -101,7 +94,7 @@
 		// out who the providers and consumers are
 		//
 
-		for (Entry<PackageRef, Attrs> entry : exports.entrySet()) {
+		for (Entry<PackageRef,Attrs> entry : exports.entrySet()) {
 			String value = entry.getValue().get(Constants.PROVIDER_TYPE_DIRECTIVE);
 			if (value != null) {
 				providerMatcher.put(entry.getKey(), new Instructions(value));
@@ -112,7 +105,7 @@
 		// creating the packages yet because we do not yet know
 		// which classes are accessible
 
-		packages = new MultiMap<PackageRef, Element>();
+		packages = new MultiMap<PackageRef,Element>();
 
 		for (Clazz c : analyzer.getClassspace().values()) {
 			if (c.isPublic() || c.isProtected()) {
@@ -136,27 +129,25 @@
 	private Element getLocalAPI() throws Exception {
 		List<Element> result = new ArrayList<Element>();
 
-		for (Map.Entry<PackageRef, List<Element>> entry : packages.entrySet()) {
+		for (Map.Entry<PackageRef,List<Element>> entry : packages.entrySet()) {
 			List<Element> set = entry.getValue();
 			for (Iterator<Element> i = set.iterator(); i.hasNext();) {
-				
-				if (notAccessible.contains( analyzer.getTypeRefFromFQN(i.next().getName())))
+
+				if (notAccessible.contains(analyzer.getTypeRefFromFQN(i.next().getName())))
 					i.remove();
-				
+
 			}
 			String version = exports.get(entry.getKey()).get(Constants.VERSION_ATTRIBUTE);
 			if (version != null) {
 				Version v = new Version(version);
-				set.add(new Element(Type.VERSION, v.getWithoutQualifier().toString(), null,
-						IGNORED, IGNORED, null));
+				set.add(new Element(Type.VERSION, v.getWithoutQualifier().toString(), null, IGNORED, IGNORED, null));
 			}
 			Element pd = new Element(Type.PACKAGE, entry.getKey().getFQN(), set, MINOR, MAJOR, null);
 			result.add(pd);
 		}
 
 		for (JAVA java : javas) {
-			result.add(new Element(CLASS_VERSION, java.toString(), null, Delta.CHANGED,
-					Delta.CHANGED, null));
+			result.add(new Element(CLASS_VERSION, java.toString(), null, Delta.CHANGED, Delta.CHANGED, null));
 		}
 
 		return new Element(Type.API, "<api>", result, CHANGED, CHANGED, null);
@@ -183,7 +174,7 @@
 		final Set<Element> members = new HashSet<Element>();
 		final Set<MethodDef> methods = Create.set();
 		final Set<Clazz.FieldDef> fields = Create.set();
-		final MultiMap<Clazz.Def, Element> annotations = new MultiMap<Clazz.Def, Element>();
+		final MultiMap<Clazz.Def,Element> annotations = new MultiMap<Clazz.Def,Element>();
 
 		final TypeRef name = clazz.getClassName();
 
@@ -209,11 +200,13 @@
 			boolean			memberEnd;
 			Clazz.FieldDef	last;
 
-			@Override public void version(int minor, int major) {
+			@Override
+			public void version(int minor, int major) {
 				javas.add(Clazz.JAVA.getJava(major, minor));
 			}
 
-			@Override public void method(MethodDef defined) {
+			@Override
+			public void method(MethodDef defined) {
 				if ((defined.isProtected() || defined.isPublic())) {
 					last = defined;
 					methods.add(defined);
@@ -222,14 +215,16 @@
 				}
 			}
 
-			@Override public void deprecated() {
+			@Override
+			public void deprecated() {
 				if (memberEnd)
 					clazz.setDeprecated(true);
 				else
 					last.setDeprecated(true);
 			}
 
-			@Override public void field(Clazz.FieldDef defined) {
+			@Override
+			public void field(Clazz.FieldDef defined) {
 				if (defined.isProtected() || defined.isPublic()) {
 					last = defined;
 					fields.add(defined);
@@ -237,25 +232,27 @@
 					last = null;
 			}
 
-			@Override public void constant(Object o) {
+			@Override
+			public void constant(Object o) {
 				if (last != null) {
 					// Must be accessible now
 					last.setConstant(o);
 				}
 			}
 
-			@Override public void extendsClass(TypeRef name) throws Exception {
+			@Override
+			public void extendsClass(TypeRef name) throws Exception {
 				String comment = null;
 				if (!clazz.isInterface())
 					comment = inherit(members, name);
 
 				Clazz c = analyzer.findClass(name);
 				if ((c == null || c.isPublic()) && !name.isObject())
-					members.add(new Element(Type.EXTENDS, name.getFQN(), null, MICRO, MAJOR,
-							comment));
+					members.add(new Element(Type.EXTENDS, name.getFQN(), null, MICRO, MAJOR, comment));
 			}
 
-			@Override public void implementsInterfaces(TypeRef names[]) throws Exception {
+			@Override
+			public void implementsInterfaces(TypeRef names[]) throws Exception {
 				// TODO is interface reordering important for binary
 				// compatibility??
 
@@ -264,8 +261,7 @@
 					String comment = null;
 					if (clazz.isInterface() || clazz.isAbstract())
 						comment = inherit(members, name);
-					members.add(new Element(Type.IMPLEMENTS, name.getFQN(), null, MINOR, MAJOR,
-							comment));
+					members.add(new Element(Type.IMPLEMENTS, name.getFQN(), null, MINOR, MAJOR, comment));
 				}
 			}
 
@@ -286,8 +282,7 @@
 							if (INHERITED.contains(child.type)) {
 								String n = child.getName();
 								if (child.type == METHOD) {
-									if (n.startsWith("<init>")
-											|| "getClass()".equals(child.getName())
+									if (n.startsWith("<init>") || "getClass()".equals(child.getName())
 											|| n.startsWith("wait(") || n.startsWith("notify(")
 											|| n.startsWith("notifyAll("))
 										continue;
@@ -314,7 +309,8 @@
 				return null;
 			}
 
-			@Override public void annotation(Annotation annotation) {
+			@Override
+			public void annotation(Annotation annotation) {
 				Collection<Element> properties = Create.set();
 				if (Deprecated.class.getName().equals(annotation.getName().getFQN())) {
 					if (memberEnd)
@@ -330,21 +326,20 @@
 					sb.append('=');
 					toString(sb, annotation.get(key));
 
-					properties.add(new Element(Type.PROPERTY, sb.toString(), null, CHANGED,
-							CHANGED, null));
+					properties.add(new Element(Type.PROPERTY, sb.toString(), null, CHANGED, CHANGED, null));
 				}
 
 				if (memberEnd) {
-					members.add(new Element(Type.ANNOTATED, annotation.getName().getFQN(),
-							properties, CHANGED, CHANGED, null));
+					members.add(new Element(Type.ANNOTATED, annotation.getName().getFQN(), properties, CHANGED,
+							CHANGED, null));
 					if (ProviderType.class.getName().equals(annotation.getName().getFQN())) {
 						provider.set(true);
 					} else if (ConsumerType.class.getName().equals(annotation.getName().getFQN())) {
 						provider.set(false);
 					}
 				} else if (last != null)
-					annotations.add(last, new Element(Type.ANNOTATED,
-							annotation.getName().getFQN(), properties, CHANGED, CHANGED, null));
+					annotations.add(last, new Element(Type.ANNOTATED, annotation.getName().getFQN(), properties,
+							CHANGED, CHANGED, null));
 			}
 
 			private void toString(StringBuilder sb, Object object) {
@@ -359,19 +354,20 @@
 					sb.append(object);
 			}
 
-			@Override public void innerClass(TypeRef innerClass, TypeRef outerClass,
-					String innerName, int innerClassAccessFlags) throws Exception {
+			@Override
+			public void innerClass(TypeRef innerClass, TypeRef outerClass, String innerName, int innerClassAccessFlags)
+					throws Exception {
 				Clazz clazz = analyzer.findClass(innerClass);
 				if (clazz != null)
 					clazz.setInnerAccess(innerClassAccessFlags);
 
-				if (Modifier.isProtected(innerClassAccessFlags)
-						|| Modifier.isPublic(innerClassAccessFlags))
+				if (Modifier.isProtected(innerClassAccessFlags) || Modifier.isPublic(innerClassAccessFlags))
 					return;
 				notAccessible.add(innerClass);
 			}
 
-			@Override public void memberEnd() {
+			@Override
+			public void memberEnd() {
 				memberEnd = true;
 			}
 		});
@@ -463,15 +459,14 @@
 
 			for (Iterator<MethodDef> i = synthetic.iterator(); i.hasNext();) {
 				MethodDef s = i.next();
-				if (s.getName().equals(m.getName())
-						&& Arrays.equals(s.getPrototype(), m.getPrototype())) {
+				if (s.getName().equals(m.getName()) && Arrays.equals(s.getPrototype(), m.getPrototype())) {
 					i.remove();
 					getCovariantReturns(children, s.getType());
 				}
 			}
 
-			Element member = new Element(Type.METHOD, m.getName() + toString(m.getPrototype()),
-					children, add, remove, null);
+			Element member = new Element(Type.METHOD, m.getName() + toString(m.getPrototype()), children, add, remove,
+					null);
 
 			if (!members.add(member)) {
 				members.remove(member);
@@ -505,8 +500,8 @@
 
 			getCovariantReturns(children, m.getType());
 
-			Element member = new Element(Type.METHOD, m.getName() + toString(m.getPrototype()),
-					children, add, remove, "synthetic");
+			Element member = new Element(Type.METHOD, m.getName() + toString(m.getPrototype()), children, add, remove,
+					"synthetic");
 
 			if (!members.add(member)) {
 				members.remove(member);
@@ -521,13 +516,12 @@
 
 			// Fields can have a constant value, this is a new element
 			if (f.getConstant() != null) {
-				children.add(new Element(Type.CONSTANT, f.getConstant().toString(), null, CHANGED,
-						CHANGED, null));
+				children.add(new Element(Type.CONSTANT, f.getConstant().toString(), null, CHANGED, CHANGED, null));
 			}
 
 			access(children, f.getAccess(), f.isDeprecated());
-			Element member = new Element(Type.FIELD, f.getType().getFQN() + " " + f.getName(),
-					children, MINOR, MAJOR, null);
+			Element member = new Element(Type.FIELD, f.getType().getFQN() + " " + f.getName(), children, MINOR, MAJOR,
+					null);
 
 			if (!members.add(member)) {
 				members.remove(member);
@@ -538,8 +532,7 @@
 		access(members, clazz.getAccess(), clazz.isDeprecated());
 
 		// And make the result
-		Element s = new Element(type, fqn, members, MINOR, MAJOR, comment.length() == 0 ? null
-				: comment.toString());
+		Element s = new Element(type, fqn, members, MINOR, MAJOR, comment.length() == 0 ? null : comment.toString());
 		cache.put(clazz, s);
 		return s;
 	}
@@ -577,33 +570,33 @@
 			String name = type.getBinary();
 			Element e;
 			switch (name.charAt(0)) {
-			case 'Z':
-				e = BOOLEAN_R;
-				break;
-			case 'S':
-				e = SHORT_R;
-				break;
-			case 'I':
-				e = INT_R;
-				break;
-			case 'B':
-				e = BYTE_R;
-				break;
-			case 'C':
-				e = CHAR_R;
-				break;
-			case 'J':
-				e = LONG_R;
-				break;
-			case 'F':
-				e = FLOAT_R;
-				break;
-			case 'D':
-				e = DOUBLE_R;
-				break;
+				case 'Z' :
+					e = BOOLEAN_R;
+					break;
+				case 'S' :
+					e = SHORT_R;
+					break;
+				case 'I' :
+					e = INT_R;
+					break;
+				case 'B' :
+					e = BYTE_R;
+					break;
+				case 'C' :
+					e = CHAR_R;
+					break;
+				case 'J' :
+					e = LONG_R;
+					break;
+				case 'F' :
+					e = FLOAT_R;
+					break;
+				case 'D' :
+					e = DOUBLE_R;
+					break;
 
-			default:
-				throw new IllegalArgumentException("Unknown primitive " + type);
+				default :
+					throw new IllegalArgumentException("Unknown primitive " + type);
 			}
 			elements.add(e);
 			return;
diff --git a/bundleplugin/src/main/java/aQute/bnd/differ/RepositoryElement.java b/bundleplugin/src/main/java/aQute/bnd/differ/RepositoryElement.java
new file mode 100644
index 0000000..23a5f20
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/bnd/differ/RepositoryElement.java
@@ -0,0 +1,23 @@
+package aQute.bnd.differ;
+
+import java.util.*;
+
+import aQute.bnd.service.*;
+import aQute.bnd.service.diff.*;
+import aQute.libg.version.*;
+
+public class RepositoryElement {
+
+	public static Element getTree(RepositoryPlugin repo) throws Exception {
+		List<Element> programs = new ArrayList<Element>();
+		for (String bsn : repo.list(null)) {
+			List<Element> versions = new ArrayList<Element>();
+			for (Version version : repo.versions(bsn)) {
+				versions.add(new Element(Type.VERSION, version.toString()));
+			}
+			programs.add(new Element(Type.PROGRAM, bsn, versions, Delta.MINOR, Delta.MAJOR, null));
+		}
+		return new Element(Type.REPO, repo.getName(), programs, Delta.MINOR, Delta.MAJOR, repo.getLocation());
+	}
+
+}
diff --git a/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java b/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java
index 20a7440..7c7b160 100644
--- a/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java
+++ b/bundleplugin/src/main/java/aQute/bnd/help/Syntax.java
@@ -6,476 +6,376 @@
 import aQute.lib.osgi.*;
 
 public class Syntax implements Constants {
-    final String                            header;
-    final String                            lead;
-    final String                            example;
-    final Pattern                           pattern;
-    final String                            values;
-    final Syntax[]                          children;
+	final String							header;
+	final String							lead;
+	final String							example;
+	final Pattern							pattern;
+	final String							values;
+	final Syntax[]							children;
 
-    static Syntax                           version              = new Syntax(
-                                                                         VERSION_ATTRIBUTE,
-                                                                         "A version range to select the version of an export definition. The default value is 0.0.0 .",
-                                                                         "version=\"[1.2,3.0)\"",
-                                                                         null,
-                                                                         Verifier.VERSIONRANGE);
-    static Syntax                           bundle_symbolic_name = new Syntax(
-                                                                         BUNDLE_SYMBOLIC_NAME_ATTRIBUTE,
-                                                                         "The bundle symbolic name of the exporting bundle.",
-                                                                         "bundle-symbolic-name=com.acme.foo.daffy",
-                                                                         null,
-                                                                         Verifier.SYMBOLICNAME);
+	static Syntax							version					= new Syntax(
+																			VERSION_ATTRIBUTE,
+																			"A version range to select the version of an export definition. The default value is 0.0.0 .",
+																			"version=\"[1.2,3.0)\"", null,
+																			Verifier.VERSIONRANGE);
+	static Syntax							bundle_symbolic_name	= new Syntax(
+																			BUNDLE_SYMBOLIC_NAME_ATTRIBUTE,
+																			"The bundle symbolic name of the exporting bundle.",
+																			"bundle-symbolic-name=com.acme.foo.daffy",
+																			null, Verifier.SYMBOLICNAME);
 
-    static Syntax                           bundle_version       = new Syntax(
-                                                                         BUNDLE_VERSION_ATTRIBUTE,
-                                                                         "a version range to select the bundle version of the exporting bundle. The default value is 0.0.0.",
-                                                                         "bundle-version=1.3",
-                                                                         null,
-                                                                         Verifier.VERSIONRANGE);
+	static Syntax							bundle_version			= new Syntax(
+																			BUNDLE_VERSION_ATTRIBUTE,
+																			"a version range to select the bundle version of the exporting bundle. The default value is 0.0.0.",
+																			"bundle-version=1.3", null,
+																			Verifier.VERSIONRANGE);
 
-    static Syntax                           path_version         = new Syntax(
-                                                                         VERSION_ATTRIBUTE,
-                                                                         "Specifies the range in the repository, project, or file",
-                                                                         "version=project",
-                                                                         "project,type",
-                                                                         Pattern
-                                                                                 .compile("project|type|"
-                                                                                         + Verifier.VERSIONRANGE
-                                                                                                 .toString()));
+	static Syntax							path_version			= new Syntax(
+																			VERSION_ATTRIBUTE,
+																			"Specifies the range in the repository, project, or file",
+																			"version=project", "project,type", Pattern
+																					.compile("project|type|"
+																							+ Verifier.VERSIONRANGE
+																									.toString()));
 
-    @SuppressWarnings("deprecation")
-	static Syntax[]                         syntaxes             = new Syntax[] {
-            new Syntax(
-                    BUNDLE_ACTIVATIONPOLICY,
-                    "The Bundle-ActivationPolicy specifies how the framework should activate the bundle once started. ",
-                    "Bundle-ActivationPolicy: lazy", "lazy", Pattern
-                            .compile("lazy")),
+	@SuppressWarnings("deprecation")
+	static Syntax[]							syntaxes				= new Syntax[] {
+			new Syntax(
+					BUNDLE_ACTIVATIONPOLICY,
+					"The Bundle-ActivationPolicy specifies how the framework should activate the bundle once started. ",
+					"Bundle-ActivationPolicy: lazy", "lazy", Pattern.compile("lazy")),
 
-            new Syntax(
-                    BUNDLE_ACTIVATOR,
-                    "The Bundle-Activator header specifies the name of the class used to start and stop the bundle. ",
-                    "Bundle-Activator: com.acme.foo.Activator",
-                    "${classes;implementing;org.osgi.framework.BundleActivator}",
-                    Verifier.FQNPATTERN),
-            new Syntax(
-                    BUNDLE_CATEGORY,
-                    "The Bundle-Category header holds a comma-separated list of category names",
-                    "Bundle-Category: test",
-                    "osgi,test,game,util,eclipse,netbeans,jdk,specification",
-                    null),
-            new Syntax(
-                    BUNDLE_CLASSPATH,
-                    "The Bundle-ClassPath header defines a comma-separated list of JAR file path names or directories (inside the bundle) containing classes and resources. The period (’.’) specifies the root directory of the bundle’s JAR. The period is also the default.",
-                    "Bundle-Classpath: /lib/libnewgen.so, .", null,
-                    Verifier.PATHPATTERN),
-            new Syntax(
-                    BUNDLE_CONTACTADDRESS,
-                    "The Bundle-ContactAddress header provides the contact address of the vendor. ",
-                    "Bundle-ContactAddress: 2400 Oswego Road, Austin, TX 74563",
-                    null, null),
-            new Syntax(
-                    BUNDLE_COPYRIGHT,
-                    "The Bundle-Copyright header contains the copyright specification for this bundle. ",
-                    "Bundle-Copyright: OSGi (c) 2002", null, null),
-            new Syntax(
-                    BUNDLE_DESCRIPTION,
-                    "The Bundle-Description header defines a short description of this bundle.",
-                    "Bundle-Description: Ceci ce n'est pas une bundle", null,
-                    null),
+			new Syntax(BUNDLE_ACTIVATOR,
+					"The Bundle-Activator header specifies the name of the class used to start and stop the bundle. ",
+					"Bundle-Activator: com.acme.foo.Activator",
+					"${classes;implementing;org.osgi.framework.BundleActivator}", Verifier.FQNPATTERN),
+			new Syntax(BUNDLE_CATEGORY, "The Bundle-Category header holds a comma-separated list of category names",
+					"Bundle-Category: test", "osgi,test,game,util,eclipse,netbeans,jdk,specification", null),
+			new Syntax(
+					BUNDLE_CLASSPATH,
+					"The Bundle-ClassPath header defines a comma-separated list of JAR file path names or directories (inside the bundle) containing classes and resources. The period (’.’) specifies the root directory of the bundle’s JAR. The period is also the default.",
+					"Bundle-Classpath: /lib/libnewgen.so, .", null, Verifier.PATHPATTERN),
+			new Syntax(BUNDLE_CONTACTADDRESS,
+					"The Bundle-ContactAddress header provides the contact address of the vendor. ",
+					"Bundle-ContactAddress: 2400 Oswego Road, Austin, TX 74563", null, null),
+			new Syntax(BUNDLE_COPYRIGHT,
+					"The Bundle-Copyright header contains the copyright specification for this bundle. ",
+					"Bundle-Copyright: OSGi (c) 2002", null, null),
+			new Syntax(BUNDLE_DESCRIPTION, "The Bundle-Description header defines a short description of this bundle.",
+					"Bundle-Description: Ceci ce n'est pas une bundle", null, null),
 
-            new Syntax(
-                    BUNDLE_DOCURL,
-                    "The Bundle-DocURL headers must contain a URL pointing to documentation about this bundle.",
-                    "Bundle-DocURL: http://www.aQute.biz/Code/Bnd", null,
-                    Verifier.URLPATTERN),
+			new Syntax(BUNDLE_DOCURL,
+					"The Bundle-DocURL headers must contain a URL pointing to documentation about this bundle.",
+					"Bundle-DocURL: http://www.aQute.biz/Code/Bnd", null, Verifier.URLPATTERN),
 
-            new Syntax(
-                    BUNDLE_ICON,
-                    "The optional Bundle-Icon header provides a list of (relative) URLs to icons representing this bundle in different sizes. ",
-                    "Bundle-Icon: /icons/bnd.png;size=64", "/icons/bundle.png",
-                    Verifier.URLPATTERN, new Syntax("size",
-                            "Icons size in pixels, e.g. 64", "64",
-                            "16,32,48,64,128", Verifier.NUMBERPATTERN)),
+			new Syntax(
+					BUNDLE_ICON,
+					"The optional Bundle-Icon header provides a list of (relative) URLs to icons representing this bundle in different sizes. ",
+					"Bundle-Icon: /icons/bnd.png;size=64", "/icons/bundle.png", Verifier.URLPATTERN, new Syntax("size",
+							"Icons size in pixels, e.g. 64", "64", "16,32,48,64,128", Verifier.NUMBERPATTERN)),
 
-            new Syntax(
-                    BUNDLE_LICENSE,
-                    "The Bundle-License header provides an optional machine readable form of license information. The purpose of this header is to automate some of the license processing required by many organizations",
-                    "Bundle License: http://www.opensource.org/licenses/jabberpl.php",
-                    "http://www.apache.org/licenses/LICENSE-2.0,<<EXTERNAL>>",
-                    Pattern.compile("(" + Verifier.URLPATTERN
-                            + "|<<EXTERNAL>>)"), new Syntax(
-                            DESCRIPTION_ATTRIBUTE,
-                            "Human readable description of the license",
-                            "description=\"Described the license here\"", null,
-                            Verifier.ANYPATTERN), new Syntax(LINK_ATTRIBUTE,
-                            "", "", null, Verifier.URLPATTERN)),
-            new Syntax(
-                    BUNDLE_LOCALIZATION,
-                    "The Bundle-Localization header contains the location in the bundle where localization files can be found. The default value is OSGI-INF/l10n/bundle. Translations are by default therefore OSGI-INF/l10n/bundle_de.properties, OSGI-INF/l10n/bundle_nl.properties, etc.",
-                    "Bundle-Localization: OSGI-INF/l10n/bundle",
-                    "OSGI-INF/l10n/bundle", Verifier.URLPATTERN),
-            new Syntax(
-                    BUNDLE_MANIFESTVERSION,
-                    "This header is set by bnd automatically to 2. The Bundle-ManifestVersion header defines that the bundle follows the rules of this specification. The Bundle-ManifestVersion header determines whether the bundle follows the rules of this specification.",
-                    "# Bundle-ManifestVersion: 2", "2", Verifier.NUMBERPATTERN),
-            new Syntax(
-                    BUNDLE_NAME,
-                    "This header will be derived from the  Bundle-SymbolicName if not set. The Bundle-Name header defines a readable name for this bundle. This should be a short, human-readable name that can contain spaces.",
-                    "Bundle-Name: My Bundle", null, Verifier.ANYPATTERN),
-            new Syntax(
-                    BUNDLE_NATIVECODE,
-                    "The Bundle-NativeCode header contains a specification of native code libraries contained in this bundle. ",
-                    "Bundle-NativeCode: /lib/http.DLL; osname = QNX; osversion = 3.1",
-                    null,
-                    Verifier.PATHPATTERN,
-                    new Syntax(OSNAME_ATTRIBUTE,
-                            "The name of the operating system", "osname=MacOS",
-                            Processor.join(Verifier.OSNAMES, ","),
-                            Verifier.ANYPATTERN),
-                    new Syntax(OSVERSION_ATTRIBUTE, "Operating System Version",
-                            "osversion=3.1", null, Verifier.ANYPATTERN),
-                    new Syntax(LANGUAGE_ATTRIBUTE, "Language ISO 639 code",
-                            "language=nl", null, Verifier.ISO639),
-                    new Syntax(PROCESSOR_ATTRIBUTE, "Processor name",
-                            "processor=x86", Processor.join(
-                                    Verifier.PROCESSORNAMES, ","),
-                            Verifier.ANYPATTERN),
-                    new Syntax(
-                            SELECTION_FILTER_ATTRIBUTE,
-                            "The value of this attribute must be a filter expression that indicates if the native code clause should be selected or not.",
-                            "selection-filter=\"(com.acme.windowing=win32)\"",
-                            null, Verifier.FILTERPATTERN)),
-            new Syntax(
-                    BUNDLE_REQUIREDEXECUTIONENVIRONMENT,
-                    "The Bundle-RequiredExecutionEnvironment contains a comma-separated list of execution environments that must be present on the Service Platform.",
-                    "Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0",
-                    Processor.join(Verifier.EES, ","), Verifier.ANYPATTERN),
+			new Syntax(
+					BUNDLE_LICENSE,
+					"The Bundle-License header provides an optional machine readable form of license information. The purpose of this header is to automate some of the license processing required by many organizations",
+					"Bundle License: http://www.opensource.org/licenses/jabberpl.php",
+					"http://www.apache.org/licenses/LICENSE-2.0,<<EXTERNAL>>", Pattern.compile("("
+							+ Verifier.URLPATTERN + "|<<EXTERNAL>>)"), new Syntax(DESCRIPTION_ATTRIBUTE,
+							"Human readable description of the license", "description=\"Described the license here\"",
+							null, Verifier.ANYPATTERN), new Syntax(LINK_ATTRIBUTE, "", "", null, Verifier.URLPATTERN)),
+			new Syntax(
+					BUNDLE_LOCALIZATION,
+					"The Bundle-Localization header contains the location in the bundle where localization files can be found. The default value is OSGI-INF/l10n/bundle. Translations are by default therefore OSGI-INF/l10n/bundle_de.properties, OSGI-INF/l10n/bundle_nl.properties, etc.",
+					"Bundle-Localization: OSGI-INF/l10n/bundle", "OSGI-INF/l10n/bundle", Verifier.URLPATTERN),
+			new Syntax(
+					BUNDLE_MANIFESTVERSION,
+					"This header is set by bnd automatically to 2. The Bundle-ManifestVersion header defines that the bundle follows the rules of this specification. The Bundle-ManifestVersion header determines whether the bundle follows the rules of this specification.",
+					"# Bundle-ManifestVersion: 2", "2", Verifier.NUMBERPATTERN),
+			new Syntax(
+					BUNDLE_NAME,
+					"This header will be derived from the  Bundle-SymbolicName if not set. The Bundle-Name header defines a readable name for this bundle. This should be a short, human-readable name that can contain spaces.",
+					"Bundle-Name: My Bundle", null, Verifier.ANYPATTERN),
+			new Syntax(
+					BUNDLE_NATIVECODE,
+					"The Bundle-NativeCode header contains a specification of native code libraries contained in this bundle. ",
+					"Bundle-NativeCode: /lib/http.DLL; osname = QNX; osversion = 3.1",
+					null,
+					Verifier.PATHPATTERN,
+					new Syntax(OSNAME_ATTRIBUTE, "The name of the operating system", "osname=MacOS", Processor.join(
+							Verifier.OSNAMES, ","), Verifier.ANYPATTERN),
+					new Syntax(OSVERSION_ATTRIBUTE, "Operating System Version", "osversion=3.1", null,
+							Verifier.ANYPATTERN),
+					new Syntax(LANGUAGE_ATTRIBUTE, "Language ISO 639 code", "language=nl", null, Verifier.ISO639),
+					new Syntax(PROCESSOR_ATTRIBUTE, "Processor name", "processor=x86", Processor.join(
+							Verifier.PROCESSORNAMES, ","), Verifier.ANYPATTERN),
+					new Syntax(
+							SELECTION_FILTER_ATTRIBUTE,
+							"The value of this attribute must be a filter expression that indicates if the native code clause should be selected or not.",
+							"selection-filter=\"(com.acme.windowing=win32)\"", null, Verifier.FILTERPATTERN)),
+			new Syntax(
+					BUNDLE_REQUIREDEXECUTIONENVIRONMENT,
+					"The Bundle-RequiredExecutionEnvironment contains a comma-separated list of execution environments that must be present on the Service Platform.",
+					"Bundle-RequiredExecutionEnvironment: CDC-1.0/Foundation-1.0", Processor.join(Verifier.EES, ","),
+					Verifier.ANYPATTERN),
 
-            new Syntax(
-                    BUNDLE_SYMBOLICNAME,
-                    "The Bundle-SymbolicName header specifies a non-localizable name for this bundle. The bundle symbolic name together with a version must identify a  unique bundle. The bundle symbolic name should be based on the reverse  domain name convention",
-                    "Bundle-SymbolicName: com.acme.foo.daffy;singleton:=true",
-                    "${p}",
-                    Verifier.SYMBOLICNAME,
-                    new Syntax(
-                            SINGLETON_DIRECTIVE,
-                            " Indicates that the bundle can only have  a single version resolved.  A value of true indicates that the bundle is a singleton bundle. The default value is false. The Framework must resolve at most one  bundle when multiple versions of a singleton bundle with the same symbolic name are installed. Singleton bundles do not affect the resolution of non-singleton bundles with the same symbolic name.",
-                            "false", "true,false", Verifier.TRUEORFALSEPATTERN),
-                    new Syntax(
-                            FRAGMENT_ATTACHMENT_DIRECTIVE,
-                            "Defines how fragments are allowed to be attached, see the fragments in Fragment Bundles on page73. The following values are valid for this directive:",
-                            "", "always|never|resolve-time", Pattern
-                                    .compile("always|never|resolve-time")),
-                    new Syntax(BLUEPRINT_WAIT_FOR_DEPENDENCIES_ATTRIBUTE, "",
-                            "", "true,false", Verifier.TRUEORFALSEPATTERN),
-                    new Syntax(BLUEPRINT_TIMEOUT_ATTRIBUTE, "", "",
-                            "30000,60000,300000", Verifier.NUMBERPATTERN)),
+			new Syntax(
+					BUNDLE_SYMBOLICNAME,
+					"The Bundle-SymbolicName header specifies a non-localizable name for this bundle. The bundle symbolic name together with a version must identify a  unique bundle. The bundle symbolic name should be based on the reverse  domain name convention",
+					"Bundle-SymbolicName: com.acme.foo.daffy;singleton:=true",
+					"${p}",
+					Verifier.SYMBOLICNAME,
+					new Syntax(
+							SINGLETON_DIRECTIVE,
+							" Indicates that the bundle can only have  a single version resolved.  A value of true indicates that the bundle is a singleton bundle. The default value is false. The Framework must resolve at most one  bundle when multiple versions of a singleton bundle with the same symbolic name are installed. Singleton bundles do not affect the resolution of non-singleton bundles with the same symbolic name.",
+							"false", "true,false", Verifier.TRUEORFALSEPATTERN),
+					new Syntax(
+							FRAGMENT_ATTACHMENT_DIRECTIVE,
+							"Defines how fragments are allowed to be attached, see the fragments in Fragment Bundles on page73. The following values are valid for this directive:",
+							"", "always|never|resolve-time", Pattern.compile("always|never|resolve-time")), new Syntax(
+							BLUEPRINT_WAIT_FOR_DEPENDENCIES_ATTRIBUTE, "", "", "true,false",
+							Verifier.TRUEORFALSEPATTERN), new Syntax(BLUEPRINT_TIMEOUT_ATTRIBUTE, "", "",
+							"30000,60000,300000", Verifier.NUMBERPATTERN)),
 
-            new Syntax(
-                    BUNDLE_UPDATELOCATION,
-                    "The Bundle-UpdateLocation header specifies a URL where an update for this bundle should come from. If the bundle is updated, this location should be used, if present, to retrieve the updated JAR file.",
-                    "Bundle-UpdateLocation: http://www.acme.com/Firewall/bundle.jar",
-                    null, Verifier.URLPATTERN),
+			new Syntax(
+					BUNDLE_UPDATELOCATION,
+					"The Bundle-UpdateLocation header specifies a URL where an update for this bundle should come from. If the bundle is updated, this location should be used, if present, to retrieve the updated JAR file.",
+					"Bundle-UpdateLocation: http://www.acme.com/Firewall/bundle.jar", null, Verifier.URLPATTERN),
 
-            new Syntax(
-                    BUNDLE_VENDOR,
-                    "The Bundle-Vendor header contains a human-readable description of the bundle vendor. ",
-                    "Bundle-Vendor: OSGi Alliance ", null, null),
+			new Syntax(BUNDLE_VENDOR,
+					"The Bundle-Vendor header contains a human-readable description of the bundle vendor. ",
+					"Bundle-Vendor: OSGi Alliance ", null, null),
 
-            new Syntax(
-                    BUNDLE_VERSION,
-                    "The Bundle-Version header specifies the version of this bundle",
-                    "Bundle-Version: 1.23.4.build200903221000", null,
-                    Verifier.VERSION),
+			new Syntax(BUNDLE_VERSION, "The Bundle-Version header specifies the version of this bundle",
+					"Bundle-Version: 1.23.4.build200903221000", null, Verifier.VERSION),
 
-            new Syntax(
-                    DYNAMICIMPORT_PACKAGE,
-                    "The DynamicImport-Package header contains a comma-separated list of package names that should be dynamically imported when needed.",
-                    "DynamicImport-Package: com.acme.plugin.*", "",
-                    Verifier.WILDCARDNAMEPATTERN, version,
-                    bundle_symbolic_name, bundle_version),
+			new Syntax(
+					DYNAMICIMPORT_PACKAGE,
+					"The DynamicImport-Package header contains a comma-separated list of package names that should be dynamically imported when needed.",
+					"DynamicImport-Package: com.acme.plugin.*", "", Verifier.WILDCARDNAMEPATTERN, version,
+					bundle_symbolic_name, bundle_version),
 
-            new Syntax(
-                    EXPORT_PACKAGE,
-                    "The Export-Package header contains a declaration of exported packages.",
-                    "Export-Package: org.osgi.util.tracker;version=1.3",
-                    "${packages}",
-                    null,
-                    new Syntax(
-                            NO_IMPORT_DIRECTIVE,
-                            "By default, bnd makes all exports also imports. Adding a -noimport to an exported package will make it export only",
-                            "-noimport:=true", "true,false",
-                            Verifier.TRUEORFALSEPATTERN),
-                    new Syntax(
-                            USES_DIRECTIVE,
-                            "Calculated by bnd: It is a comma-separated list of package names that are used by the exported package",
-                            "Is calculated by bnd", null, null),
-                    new Syntax(
-                            MANDATORY_DIRECTIVE,
-                            "A comma-separated list of attribute names. Note that the use of a comma in the value requires it to be enclosed in double quotes. A bundle importing the package must specify the mandatory attributes, with a value that matches, to resolve to the exported package",
-                            "mandatory=\"bar,foo\"", null, null),
-                    new Syntax(
-                            INCLUDE_DIRECTIVE,
-                            "A comma-separated list of class names that must be visible to an importer",
-                            "include:=\"Qux*\"", null, null),
-                    new Syntax(
-                            EXCLUDE_DIRECTIVE,
-                            "A comma-separated list of class names that must not be visible to an importer",
-                            "exclude:=\"QuxImpl*,BarImpl\"", null,
-                            Verifier.WILDCARDNAMEPATTERN), new Syntax(
-                            IMPORT_DIRECTIVE, "Experimental", "", null, null)
+			new Syntax(
+					EXPORT_PACKAGE,
+					"The Export-Package header contains a declaration of exported packages.",
+					"Export-Package: org.osgi.util.tracker;version=1.3",
+					"${packages}",
+					null,
+					new Syntax(
+							NO_IMPORT_DIRECTIVE,
+							"By default, bnd makes all exports also imports. Adding a -noimport to an exported package will make it export only",
+							"-noimport:=true", "true,false", Verifier.TRUEORFALSEPATTERN),
+					new Syntax(
+							USES_DIRECTIVE,
+							"Calculated by bnd: It is a comma-separated list of package names that are used by the exported package",
+							"Is calculated by bnd", null, null),
+					new Syntax(
+							MANDATORY_DIRECTIVE,
+							"A comma-separated list of attribute names. Note that the use of a comma in the value requires it to be enclosed in double quotes. A bundle importing the package must specify the mandatory attributes, with a value that matches, to resolve to the exported package",
+							"mandatory=\"bar,foo\"", null, null), new Syntax(INCLUDE_DIRECTIVE,
+							"A comma-separated list of class names that must be visible to an importer",
+							"include:=\"Qux*\"", null, null), new Syntax(EXCLUDE_DIRECTIVE,
+							"A comma-separated list of class names that must not be visible to an importer",
+							"exclude:=\"QuxImpl*,BarImpl\"", null, Verifier.WILDCARDNAMEPATTERN), new Syntax(
+							IMPORT_DIRECTIVE, "Experimental", "", null, null)
 
-            ),
-            new Syntax(EXPORT_SERVICE, "Deprecated",
-                    "Export-Service: org.osgi.service.log.LogService ",
-                    "${classes;implementing;*}", null),
-            new Syntax(
-                    FRAGMENT_HOST,
-                    "The Fragment-Host header defines the host bundle for this fragment.",
-                    "Fragment-Host: org.eclipse.swt; bundle-version=\"[3.0.0,4.0.0)\"",
-                    null,
-                    null,
-                    new Syntax(
-                            EXTENSION_DIRECTIVE,
-                            " Indicates this extension is a system or boot class path extension. It is only applicable when the Fragment-Host is the System Bundle",
-                            "extension:=framework", "framework,bootclasspath",
-                            Pattern.compile("framework|bootclasspath")),
-                    bundle_version),
-            new Syntax(
-                    IMPORT_PACKAGE,
-                    "This header is normally calculated by bnd, however, you can decorate packages or skip packages. The Import-Package header declares the imported packages for this bundle",
-                    "Import-Package: !com.exotic.*, com.acme.foo;vendor=ACME, *",
-                    "${exported_packages}",
-                    Verifier.WILDCARDNAMEPATTERN,
-                    new Syntax(
-                            REMOVE_ATTRIBUTE_DIRECTIVE,
-                            "Remove the given attributes from matching imported packages",
-                            "-remove-attribute:=foo.*", null,
-                            Verifier.WILDCARDNAMEPATTERN),
-                    new Syntax(
-                            RESOLUTION_DIRECTIVE,
-                            "Indicates that the packages must be resolved if the value is mandatory, which is the default. If mandatory packages cannot be resolved, then the bundle must fail to resolve. A value of optional indicates that the packages are optional",
-                            "resolution:=optional", "mandatory,optional",
-                            Pattern.compile("mandatory|optional")
+			),
+			new Syntax(EXPORT_SERVICE, "Deprecated", "Export-Service: org.osgi.service.log.LogService ",
+					"${classes;implementing;*}", null),
+			new Syntax(
+					FRAGMENT_HOST,
+					"The Fragment-Host header defines the host bundle for this fragment.",
+					"Fragment-Host: org.eclipse.swt; bundle-version=\"[3.0.0,4.0.0)\"",
+					null,
+					null,
+					new Syntax(
+							EXTENSION_DIRECTIVE,
+							" Indicates this extension is a system or boot class path extension. It is only applicable when the Fragment-Host is the System Bundle",
+							"extension:=framework", "framework,bootclasspath", Pattern
+									.compile("framework|bootclasspath")), bundle_version),
+			new Syntax(
+					IMPORT_PACKAGE,
+					"This header is normally calculated by bnd, however, you can decorate packages or skip packages. The Import-Package header declares the imported packages for this bundle",
+					"Import-Package: !com.exotic.*, com.acme.foo;vendor=ACME, *",
+					"${exported_packages}",
+					Verifier.WILDCARDNAMEPATTERN,
+					new Syntax(REMOVE_ATTRIBUTE_DIRECTIVE,
+							"Remove the given attributes from matching imported packages", "-remove-attribute:=foo.*",
+							null, Verifier.WILDCARDNAMEPATTERN),
+					new Syntax(
+							RESOLUTION_DIRECTIVE,
+							"Indicates that the packages must be resolved if the value is mandatory, which is the default. If mandatory packages cannot be resolved, then the bundle must fail to resolve. A value of optional indicates that the packages are optional",
+							"resolution:=optional", "mandatory,optional", Pattern.compile("mandatory|optional")
 
-                    ), version, bundle_symbolic_name, bundle_version),
+					), version, bundle_symbolic_name, bundle_version),
 
-            new Syntax(
-                    REQUIRE_BUNDLE,
-                    "The Require-Bundle header specifies the required exports from another bundle.",
-                    "Require-Bundle: com.acme.chess",
-                    null,
-                    Verifier.WILDCARDNAMEPATTERN,
+			new Syntax(
+					REQUIRE_BUNDLE,
+					"The Require-Bundle header specifies the required exports from another bundle.",
+					"Require-Bundle: com.acme.chess",
+					null,
+					Verifier.WILDCARDNAMEPATTERN,
 
-                    new Syntax(
-                            VISIBILITY_DIRECTIVE,
-                            " If the value is private (Default), then all visible packages from the required bundles are not re-exported. If the value is reexport then bundles that require this bundle will transitively have access to these required bundle’s exported packages.",
-                            "visibility:=private", "private,reexport", Pattern
-                                    .compile("private|reexport")),
+					new Syntax(
+							VISIBILITY_DIRECTIVE,
+							" If the value is private (Default), then all visible packages from the required bundles are not re-exported. If the value is reexport then bundles that require this bundle will transitively have access to these required bundle’s exported packages.",
+							"visibility:=private", "private,reexport", Pattern.compile("private|reexport")),
 
-                    new Syntax(
-                            RESOLUTION_DIRECTIVE,
-                            "If the value is mandatory (default) then the required bundle must exist for this bundle to resolve. If the value is optional, the bundle will resolve even if the required bundle does not exist.",
-                            "resolution:=optional", "mandatory,optional",
-                            Pattern.compile("mandatory|optional")),
+					new Syntax(
+							RESOLUTION_DIRECTIVE,
+							"If the value is mandatory (default) then the required bundle must exist for this bundle to resolve. If the value is optional, the bundle will resolve even if the required bundle does not exist.",
+							"resolution:=optional", "mandatory,optional", Pattern.compile("mandatory|optional")),
 
-                    new Syntax(
-                            SPLIT_PACKAGE_DIRECTIVE,
-                            "Indicates how an imported package should be merged when it is split between different exporters. The default is merge-first with warning",
-                            "-split-package:=merge-first",
-                            "merge-first,merge-last,error,first",
-                            Pattern
-                                    .compile("merge-first|merge-last|error|first")),
-                    bundle_version
+					new Syntax(
+							SPLIT_PACKAGE_DIRECTIVE,
+							"Indicates how an imported package should be merged when it is split between different exporters. The default is merge-first with warning",
+							"-split-package:=merge-first", "merge-first,merge-last,error,first", Pattern
+									.compile("merge-first|merge-last|error|first")), bundle_version
 
-            ),
-            new Syntax(
-                    BUILDPATH,
-                    "Provides the class path for building the jar. The entries are references to the repository",
-                    "-buildpath=osgi;version=4.1", "${repo;bsns}",
-                    Verifier.SYMBOLICNAME, path_version),
-            new Syntax(
-                    BUMPPOLICY,
-                    "Sets the version bump policy. This is a parameter to the ${version} macro.",
-                    "-bumppolicy==+0", "==+,=+0,+00", Pattern
-                            .compile("[=+-0][=+-0][=+-0]")),
+			),
+			new Syntax(BUILDPATH,
+					"Provides the class path for building the jar. The entries are references to the repository",
+					"-buildpath=osgi;version=4.1", "${repo;bsns}", Verifier.SYMBOLICNAME, path_version),
+			new Syntax(BUMPPOLICY, "Sets the version bump policy. This is a parameter to the ${version} macro.",
+					"-bumppolicy==+0", "==+,=+0,+00", Pattern.compile("[=+-0][=+-0][=+-0]")),
 
-            new Syntax(
-                    CONDUIT,
-                    "Allows a bnd file to point to files which will be returned when the bnd file is build",
-                    "-conduit= jar/osgi.jar", null, null),
+			new Syntax(CONDUIT,
+					"Allows a bnd file to point to files which will be returned when the bnd file is build",
+					"-conduit= jar/osgi.jar", null, null),
 
-            new Syntax(
-                    DEPENDSON,
-                    "List of project names that this project directly depends on. These projects are always build ahead of this project",
-                    "-dependson=org.acme.cm", "${projects}", null),
+			new Syntax(
+					DEPENDSON,
+					"List of project names that this project directly depends on. These projects are always build ahead of this project",
+					"-dependson=org.acme.cm", "${projects}", null),
 
-            new Syntax(DEPLOYREPO,
-                    "Specifies to which repo the project should be deployed.",
-                    "-deployrepo=cnf", "${repos}", null),
+			new Syntax(DEPLOYREPO, "Specifies to which repo the project should be deployed.", "-deployrepo=cnf",
+					"${repos}", null),
 
-            new Syntax(
-                    DONOTCOPY,
-                    "Regular expression for names of files and directories that should not be copied when discovered",
-                    "-donotcopy=(CVS|\\.svn)", null, null),
+			new Syntax(DONOTCOPY,
+					"Regular expression for names of files and directories that should not be copied when discovered",
+					"-donotcopy=(CVS|\\.svn)", null, null),
 
-            new Syntax(
-                    EXPORT_CONTENTS,
-                    "Build the JAR in the normal way but use this header for the Export-Package header manifest generation, same format",
-                    "-exportcontents=!*impl*,*;version=3.0", null, null),
+			new Syntax(
+					EXPORT_CONTENTS,
+					"Build the JAR in the normal way but use this header for the Export-Package header manifest generation, same format",
+					"-exportcontents=!*impl*,*;version=3.0", null, null),
 
-            new Syntax(
-                    FAIL_OK,
-                    "Return with an ok status (0) even if the build generates errors",
-                    "-failok=true", "true,false", Verifier.TRUEORFALSEPATTERN),
+			new Syntax(FAIL_OK, "Return with an ok status (0) even if the build generates errors", "-failok=true",
+					"true,false", Verifier.TRUEORFALSEPATTERN),
 
-            new Syntax(
-                    INCLUDE,
-                    "Include files. If an entry starts with '-', it does not have to exist. If it starts with '~', it must not overwrite any existing properties",
-                    "-include: -${java.user}/.bnd", null, null),
+			new Syntax(
+					INCLUDE,
+					"Include files. If an entry starts with '-', it does not have to exist. If it starts with '~', it must not overwrite any existing properties",
+					"-include: -${java.user}/.bnd", null, null),
 
-            new Syntax(
-                    INCLUDERESOURCE,
-                    "Include resources from the file system. You can specify a directory, or file. All files are copied to the root, unless a destination directory is indicated",
-                    "-includeresource: lib=jar", null, null),
+			new Syntax(
+					INCLUDERESOURCE,
+					"Include resources from the file system. You can specify a directory, or file. All files are copied to the root, unless a destination directory is indicated",
+					"-includeresource: lib=jar", null, null),
 
-            new Syntax(
-                    MAKE,
-                    "Set patterns for make plugins. These patterns are used to find a plugin that can make a resource that can not be found.",
-                    "-make: (*).jar;type=bnd;  recipe=\"bnd/$1.bnd\"", null,
-                    null, new Syntax("type", "Type name for plugin",
-                            "type=bnd", "bnd", null), new Syntax("recipe",
-                            "Recipe for the plugin, can use back references",
-                            "recipe=\"bnd/$1.bnd\"", "bnd", null)),
+			new Syntax(
+					MAKE,
+					"Set patterns for make plugins. These patterns are used to find a plugin that can make a resource that can not be found.",
+					"-make: (*).jar;type=bnd;  recipe=\"bnd/$1.bnd\"", null, null, new Syntax("type",
+							"Type name for plugin", "type=bnd", "bnd", null), new Syntax("recipe",
+							"Recipe for the plugin, can use back references", "recipe=\"bnd/$1.bnd\"", "bnd", null)),
 
-            new Syntax(
-                    MANIFEST,
-                    "Directly include a manifest, do not use the calculated manifest",
-                    "-manifest = META-INF/MANIFEST.MF", null, null),
+			new Syntax(MANIFEST, "Directly include a manifest, do not use the calculated manifest",
+					"-manifest = META-INF/MANIFEST.MF", null, null),
 
-            new Syntax(NOEXTRAHEADERS, "Do not generate housekeeping headers",
-                    "-noextraheaders", "true,false",
-                    Verifier.TRUEORFALSEPATTERN),
+			new Syntax(NOEXTRAHEADERS, "Do not generate housekeeping headers", "-noextraheaders", "true,false",
+					Verifier.TRUEORFALSEPATTERN),
 
-            new Syntax(NOUSES,
-                    "Do not calculate the uses: directive on exports",
-                    "-nouses=true", "true,false", Verifier.TRUEORFALSEPATTERN),
+			new Syntax(NOUSES, "Do not calculate the uses: directive on exports", "-nouses=true", "true,false",
+					Verifier.TRUEORFALSEPATTERN),
 
-            new Syntax(NOPE,
-                    "Deprecated, use -nobundles. ",
-                    "-nope=true", "true,false", Verifier.TRUEORFALSEPATTERN),
+			new Syntax(NOPE, "Deprecated, use -nobundles. ", "-nope=true", "true,false", Verifier.TRUEORFALSEPATTERN),
 
-            new Syntax(
-                    PEDANTIC,
-                    "Warn about things that are not really wrong but still not right",
-                    "-nope=true", "true,false", Verifier.TRUEORFALSEPATTERN),
+			new Syntax(PEDANTIC, "Warn about things that are not really wrong but still not right", "-nope=true",
+					"true,false", Verifier.TRUEORFALSEPATTERN),
 
-            new Syntax(
-                    PLUGIN,
-                    "Define the plugins",
-                    "-plugin=aQute.lib.spring.SpringComponent,aQute.lib.deployer.FileRepo;location=${repo}",
-                    null, null),
+			new Syntax(PLUGIN, "Define the plugins",
+					"-plugin=aQute.lib.spring.SpringComponent,aQute.lib.deployer.FileRepo;location=${repo}", null, null),
 
-            new Syntax(SERVICE_COMPONENT,
-                    "The header for Declarative Services",
-                    "Service-Component=com.acme.Foo?;activate='start'", null,
-                    null),
+			new Syntax(SERVICE_COMPONENT, "The header for Declarative Services",
+					"Service-Component=com.acme.Foo?;activate='start'", null, null),
 
-            new Syntax(POM, "Generate a maven pom", "-pom=true", "true,false",
-                    Verifier.TRUEORFALSEPATTERN),
+			new Syntax(POM, "Generate a maven pom", "-pom=true", "true,false", Verifier.TRUEORFALSEPATTERN),
 
-            new Syntax(RELEASEREPO,
-                    "Specifies to which repo the project should be released.",
-                    "-releaserepo=cnf", "${repos}", null),
+			new Syntax(RELEASEREPO, "Specifies to which repo the project should be released.", "-releaserepo=cnf",
+					"${repos}", null),
 
-            new Syntax(REMOVEHEADERS,
-                    "Remove all headers that match the regular expressions",
-                    "-removeheaders=FOO_.*,Proprietary", null, null),
-            new Syntax(
-                    RESOURCEONLY,
-                    "Normally bnd warns when the JAR does not contain any classes, this option suppresses this warning",
-                    "-resourceonly=true", "true,false",
-                    Verifier.TRUEORFALSEPATTERN),
-            new Syntax(SOURCES, "Include sources in the jar", "-sources=true",
-                    "true,false", Verifier.TRUEORFALSEPATTERN),
-            new Syntax(
-                    SOURCEPATH,
-                    "List of directory names that used to source sources for -sources",
-                    "-sourcepath:= src, test", null, null),
-            new Syntax(
-                    SUB,
-                    "Build a set of bnd files that use this bnd file as a basis. The list of bnd file can be specified with wildcards",
-                    "-sub=com.acme.*.bnd", null, null),
-            new Syntax(
-                    RUNPROPERTIES,
-                    "Properties that are set as system properties before the framework is started",
-                    "-runproperties= foo=3, bar=4", null, null),
-            new Syntax(RUNSYSTEMPACKAGES,
-                    "Add additional system packages to a framework run",
-                    "-runsystempackages=com.acme.foo,javax.management", null,
-                    null),
-            new Syntax(
-                    RUNBUNDLES,
-                    "Add additional bundles, specified with their bsn and version like in -buildpath, that are started before the project is run",
-                    "-runbundles=osgi;version=\"[4.1,4.2)\", junit.junit, com.acme.foo;version=project",
-                    null, Verifier.SYMBOLICNAME, path_version),
-            new Syntax(
-                    RUNPATH,
-                    "Additional JARs for the VM path, should include the framework",
-                    "-runpath=org.eclipse.osgi;version=3.5", null, null,
-                    path_version),
-            new Syntax(
-                    RUNVM,
-                    "Additional arguments for the VM invokation. Keys that start with a - are added as options, otherwise they are treated as -D properties for the VM",
-                    "-runvm=-Xmax=30", null, null),
-            new Syntax(
-                    VERSIONPOLICY,
-                    "Provides a version policy to imports that are calculated from exports",
-                    "-versionpolicy = \"[${version;==;${@}},${version;+;${@}})\"",
-                    null, null)
+			new Syntax(REMOVEHEADERS, "Remove all headers that match the regular expressions",
+					"-removeheaders=FOO_.*,Proprietary", null, null),
+			new Syntax(
+					RESOURCEONLY,
+					"Normally bnd warns when the JAR does not contain any classes, this option suppresses this warning",
+					"-resourceonly=true", "true,false", Verifier.TRUEORFALSEPATTERN),
+			new Syntax(SOURCES, "Include sources in the jar", "-sources=true", "true,false",
+					Verifier.TRUEORFALSEPATTERN),
+			new Syntax(SOURCEPATH, "List of directory names that used to source sources for -sources",
+					"-sourcepath:= src, test", null, null),
+			new Syntax(
+					SUB,
+					"Build a set of bnd files that use this bnd file as a basis. The list of bnd file can be specified with wildcards",
+					"-sub=com.acme.*.bnd", null, null),
+			new Syntax(RUNPROPERTIES, "Properties that are set as system properties before the framework is started",
+					"-runproperties= foo=3, bar=4", null, null),
+			new Syntax(RUNSYSTEMPACKAGES, "Add additional system packages to a framework run",
+					"-runsystempackages=com.acme.foo,javax.management", null, null),
+			new Syntax(
+					RUNBUNDLES,
+					"Add additional bundles, specified with their bsn and version like in -buildpath, that are started before the project is run",
+					"-runbundles=osgi;version=\"[4.1,4.2)\", junit.junit, com.acme.foo;version=project", null,
+					Verifier.SYMBOLICNAME, path_version),
+			new Syntax(RUNPATH, "Additional JARs for the VM path, should include the framework",
+					"-runpath=org.eclipse.osgi;version=3.5", null, null, path_version),
+			new Syntax(
+					RUNVM,
+					"Additional arguments for the VM invokation. Keys that start with a - are added as options, otherwise they are treated as -D properties for the VM",
+					"-runvm=-Xmax=30", null, null),
+			new Syntax(VERSIONPOLICY, "Provides a version policy to imports that are calculated from exports",
+					"-versionpolicy = \"[${version;==;${@}},${version;+;${@}})\"", null, null)
 
-                                                                 };
+																	};
 
-    public final static Map<String, Syntax> HELP                 = new HashMap<String, Syntax>();
+	public final static Map<String,Syntax>	HELP					= new HashMap<String,Syntax>();
 
-    static {
-        for (Syntax s : syntaxes) {
-            HELP.put(s.header, s);
-        }
-    }
+	static {
+		for (Syntax s : syntaxes) {
+			HELP.put(s.header, s);
+		}
+	}
 
-    public Syntax(String header, String lead, String example, String values,
-            Pattern pattern, Syntax... children) {
-        this.header = header;
-        this.children = children;
-        this.lead = lead;
-        this.example = example;
-        this.values = values;
-        this.pattern = pattern;
-    }
+	public Syntax(String header, String lead, String example, String values, Pattern pattern, Syntax... children) {
+		this.header = header;
+		this.children = children;
+		this.lead = lead;
+		this.example = example;
+		this.values = values;
+		this.pattern = pattern;
+	}
 
-    public String getLead() {
-        return lead;
-    }
+	public String getLead() {
+		return lead;
+	}
 
-    public String getExample() {
-        return example;
-    }
+	public String getExample() {
+		return example;
+	}
 
-    public String getValues() {
-        return values;
-    }
+	public String getValues() {
+		return values;
+	}
 
-    public String getPattern() {
-        return lead;
-    }
+	public String getPattern() {
+		return lead;
+	}
 
-    public Syntax[] getChildren() {
-        return children;
-    }
+	public Syntax[] getChildren() {
+		return children;
+	}
 
-    public String getHeader() {
-        return header;
-    }
+	public String getHeader() {
+		return header;
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/Make.java b/bundleplugin/src/main/java/aQute/bnd/make/Make.java
index 2b0ce8a..a42b5e0 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/Make.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/Make.java
@@ -9,34 +9,34 @@
 import aQute.libg.header.*;
 
 public class Make {
-	Builder									builder;
-	Map<Instruction, Map<String, String>>	make;
+	Builder								builder;
+	Map<Instruction,Map<String,String>>	make;
 
 	public Make(Builder builder) {
 		this.builder = builder;
 	}
 
 	public Resource process(String source) {
-		Map<Instruction, Map<String, String>> make = getMakeHeader();
+		Map<Instruction,Map<String,String>> make = getMakeHeader();
 		builder.trace("make " + source);
 
-		for (Map.Entry<Instruction, Map<String, String>> entry : make.entrySet()) {
+		for (Map.Entry<Instruction,Map<String,String>> entry : make.entrySet()) {
 			Instruction instr = entry.getKey();
 			Matcher m = instr.getMatcher(source);
 			if (m.matches() || instr.isNegated()) {
-				Map<String, String> arguments = replace(m, entry.getValue());
+				Map<String,String> arguments = replace(m, entry.getValue());
 				List<MakePlugin> plugins = builder.getPlugins(MakePlugin.class);
 				for (MakePlugin plugin : plugins) {
 					try {
 						Resource resource = plugin.make(builder, source, arguments);
 						if (resource != null) {
-							builder.trace("Made " + source + " from args " + arguments + " with "
-									+ plugin);
+							builder.trace("Made " + source + " from args " + arguments + " with " + plugin);
 							return resource;
 						}
-					} catch (Exception e) {
-						builder.error("Plugin " + plugin + " generates error when use in making "
-								+ source + " with args " + arguments, e);
+					}
+					catch (Exception e) {
+						builder.error("Plugin " + plugin + " generates error when use in making " + source
+								+ " with args " + arguments, e);
 					}
 				}
 			}
@@ -44,9 +44,9 @@
 		return null;
 	}
 
-	private Map<String, String> replace(Matcher m, Map<String, String> value) {
-		Map<String, String> newArgs = Processor.newMap();
-		for (Map.Entry<String, String> entry : value.entrySet()) {
+	private Map<String,String> replace(Matcher m, Map<String,String> value) {
+		Map<String,String> newArgs = Processor.newMap();
+		for (Map.Entry<String,String> entry : value.entrySet()) {
 			String s = entry.getValue();
 			s = replace(m, s);
 			newArgs.put(entry.getKey(), s);
@@ -77,15 +77,15 @@
 		return sb.toString();
 	}
 
-	Map<Instruction, Map<String, String>> getMakeHeader() {
+	Map<Instruction,Map<String,String>> getMakeHeader() {
 		if (make != null)
 			return make;
 		make = Processor.newMap();
 
 		String s = builder.getProperty(Builder.MAKE);
 		Parameters make = builder.parseHeader(s);
-		
-		for (Entry<String, Attrs> entry : make.entrySet()) {
+
+		for (Entry<String,Attrs> entry : make.entrySet()) {
 			String pattern = Processor.removeDuplicateMarker(entry.getKey());
 
 			Instruction instr = new Instruction(pattern);
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/MakeBnd.java b/bundleplugin/src/main/java/aQute/bnd/make/MakeBnd.java
index 581deb7..29e5353 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/MakeBnd.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/MakeBnd.java
@@ -9,57 +9,55 @@
 import aQute.lib.osgi.*;
 
 public class MakeBnd implements MakePlugin, Constants {
-    final static Pattern JARFILE = Pattern.compile("(.+)\\.(jar|ipa)");
+	final static Pattern	JARFILE	= Pattern.compile("(.+)\\.(jar|ipa)");
 
-    public Resource make(Builder builder, String destination,
-            Map<String, String> argumentsOnMake) throws Exception {
-        String type = argumentsOnMake.get("type");
-        if (!"bnd".equals(type))
-            return null;
+	public Resource make(Builder builder, String destination, Map<String,String> argumentsOnMake) throws Exception {
+		String type = argumentsOnMake.get("type");
+		if (!"bnd".equals(type))
+			return null;
 
-        String recipe = argumentsOnMake.get("recipe");
-        if (recipe == null) {
-            builder.error("No recipe specified on a make instruction for "
-                    + destination);
-            return null;
-        }
-        File bndfile = builder.getFile(recipe);
-        if (bndfile.isFile()) {
-            // We do not use a parent because then we would
-            // build ourselves again. So we can not blindly
-            // inherit the properties.
-            Builder bchild = builder.getSubBuilder();
-            bchild.removeBundleSpecificHeaders();
-            
-            // We must make sure that we do not include ourselves again!
-            bchild.setProperty(Analyzer.INCLUDE_RESOURCE, "");
-            bchild.setProperty(Analyzer.INCLUDERESOURCE, "");
-            bchild.setProperties(bndfile, builder.getBase());
-            
-            Jar jar = bchild.build();
-            Jar dot = builder.getTarget();
+		String recipe = argumentsOnMake.get("recipe");
+		if (recipe == null) {
+			builder.error("No recipe specified on a make instruction for " + destination);
+			return null;
+		}
+		File bndfile = builder.getFile(recipe);
+		if (bndfile.isFile()) {
+			// We do not use a parent because then we would
+			// build ourselves again. So we can not blindly
+			// inherit the properties.
+			Builder bchild = builder.getSubBuilder();
+			bchild.removeBundleSpecificHeaders();
 
-            if (builder.hasSources()) {
-                for (String key : jar.getResources().keySet()) {
-                    if (key.startsWith("OSGI-OPT/src"))
-                        dot.putResource(key, jar.getResource(key));
-                }
-            }
-            builder.getInfo(bchild, bndfile.getName() +": ");
-            String debug = bchild.getProperty(DEBUG);
-            if (Processor.isTrue(debug)) {
-                if ( builder instanceof ProjectBuilder ) {
-                    ProjectBuilder pb = (ProjectBuilder) builder;
-                    File target = pb.getProject().getTarget();
-                    String bsn = bchild.getBsn();
-                    File output = new File(target, bsn+".jar");
-                    jar.write(output);
-                    pb.getProject().getWorkspace().changedFile(output);
-                }
-            }
-            return new JarResource(jar);
-        } else
-            return null;
-    }
+			// We must make sure that we do not include ourselves again!
+			bchild.setProperty(Analyzer.INCLUDE_RESOURCE, "");
+			bchild.setProperty(Analyzer.INCLUDERESOURCE, "");
+			bchild.setProperties(bndfile, builder.getBase());
+
+			Jar jar = bchild.build();
+			Jar dot = builder.getTarget();
+
+			if (builder.hasSources()) {
+				for (String key : jar.getResources().keySet()) {
+					if (key.startsWith("OSGI-OPT/src"))
+						dot.putResource(key, jar.getResource(key));
+				}
+			}
+			builder.getInfo(bchild, bndfile.getName() + ": ");
+			String debug = bchild.getProperty(DEBUG);
+			if (Processor.isTrue(debug)) {
+				if (builder instanceof ProjectBuilder) {
+					ProjectBuilder pb = (ProjectBuilder) builder;
+					File target = pb.getProject().getTarget();
+					String bsn = bchild.getBsn();
+					File output = new File(target, bsn + ".jar");
+					jar.write(output);
+					pb.getProject().getWorkspace().changedFile(output);
+				}
+			}
+			return new JarResource(jar);
+		} else
+			return null;
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/MakeCopy.java b/bundleplugin/src/main/java/aQute/bnd/make/MakeCopy.java
index 3d5e4c8..74d2921 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/MakeCopy.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/MakeCopy.java
@@ -9,37 +9,34 @@
 
 public class MakeCopy implements MakePlugin {
 
-    public Resource make(Builder builder, String destination,
-            Map<String, String> argumentsOnMake) throws Exception {
-        String type = argumentsOnMake.get("type");
-        if (!type.equals("copy"))
-            return null;
+	public Resource make(Builder builder, String destination, Map<String,String> argumentsOnMake) throws Exception {
+		String type = argumentsOnMake.get("type");
+		if (!type.equals("copy"))
+			return null;
 
-        String from = argumentsOnMake.get("from");
-        if (from == null) {
-            String content = argumentsOnMake.get("content");
-            if (content == null)
-                throw new IllegalArgumentException(
-                        "No 'from' or 'content' field in copy "
-                                + argumentsOnMake);
-            return new EmbeddedResource(content.getBytes("UTF-8"),0);
-        } else {
+		String from = argumentsOnMake.get("from");
+		if (from == null) {
+			String content = argumentsOnMake.get("content");
+			if (content == null)
+				throw new IllegalArgumentException("No 'from' or 'content' field in copy " + argumentsOnMake);
+			return new EmbeddedResource(content.getBytes("UTF-8"), 0);
+		} else {
 
-            File f = builder.getFile(from);
-            if (f.isFile())
-                return new FileResource(f);
-            else {
-                try {
-                    URL url = new URL(from);
-                    return new URLResource(url);
-                } catch(MalformedURLException mfue) {
-                    // We ignore this
-                }
-                throw new IllegalArgumentException(
-                        "Copy source does not exist " + from
-                                + " for destination " + destination);
-            }
-        }
-    }
+			File f = builder.getFile(from);
+			if (f.isFile())
+				return new FileResource(f);
+			else {
+				try {
+					URL url = new URL(from);
+					return new URLResource(url);
+				}
+				catch (MalformedURLException mfue) {
+					// We ignore this
+				}
+				throw new IllegalArgumentException("Copy source does not exist " + from + " for destination "
+						+ destination);
+			}
+		}
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/calltree/CalltreeResource.java b/bundleplugin/src/main/java/aQute/bnd/make/calltree/CalltreeResource.java
index e06cdc5f..a41e337 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/calltree/CalltreeResource.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/calltree/CalltreeResource.java
@@ -14,160 +14,160 @@
  *    calltree ::= &lt;using&gt; &lt;usedby&gt;
  *    using    ::= &lt;method&gt; *
  *    usedby   ::= &lt;method&gt; *
- *    method   ::= &lt;ref&gt; 
+ *    method   ::= &lt;ref&gt;
  * </pre>
  * 
  * The <code>using</code> element contains methods in the set of classes and
  * their references. The <code>usedby</code> element contains the used methods
  * and their references to the set of classes. The <code>ref</code> element
  * contains the class, the method name, the descriptor, and a pretty print
- * version of the method.
- * 
- * The XML does not contain an XML processor instruction to make it easier to
- * include in other XML. The encoding is always UTF-8.
- * 
- * This class can be used as a resource, just add it to a JAR and the data is
+ * version of the method. The XML does not contain an XML processor instruction
+ * to make it easier to include in other XML. The encoding is always UTF-8. This
+ * class can be used as a resource, just add it to a JAR and the data is
  * generated when the resource is written (saving time when the JAR is up to
  * date and does not have to be generated). However, the actual write method is
  * a static method and can be called as well:
  * {@link #writeCalltree(PrintWriter, Collection)}.
  */
 public class CalltreeResource extends WriteResource {
-    Collection<Clazz> classes;
+	Collection<Clazz>	classes;
 
-    /**
-     * Create a resource for inclusion that will print a call tree.
-     * 
-     * @param values the classes for which the call tree is generated.
-     */
-    public CalltreeResource(Collection<Clazz> values) {
-        this.classes = values;
-        System.err.println(values);
-    }
+	/**
+	 * Create a resource for inclusion that will print a call tree.
+	 * 
+	 * @param values
+	 *            the classes for which the call tree is generated.
+	 */
+	public CalltreeResource(Collection<Clazz> values) {
+		this.classes = values;
+		System.err.println(values);
+	}
 
-    /**
-     * We set the last modified to 0 so this resource does not force
-     * a new JAR if all other resources are up to date.
-     */
-    public long lastModified() {
-        return 0;
-    }
+	/**
+	 * We set the last modified to 0 so this resource does not force a new JAR
+	 * if all other resources are up to date.
+	 */
+	public long lastModified() {
+		return 0;
+	}
 
-    /**
-     * The write method is called to write the resource. We just call the static
-     * method.
-     */
-    public void write(OutputStream out) throws Exception {
-        OutputStreamWriter osw = new OutputStreamWriter(out, Constants.DEFAULT_CHARSET);
-        PrintWriter pw = new PrintWriter(osw);
-        try {
-            writeCalltree(pw, classes);
-        } finally {
-            pw.flush();
-        }
-    }
-
-    /**
-     * Print the call tree in XML.
-     * 
-     * @param out The output writer
-     * @param classes The set of classes
-     * @throws IOException Any errors
-     */
-    public static void writeCalltree(PrintWriter out, Collection<Clazz> classes)
-            throws Exception {
-
-        final Map<Clazz.MethodDef, Set<Clazz.MethodDef>> using = new TreeMap<Clazz.MethodDef, Set<Clazz.MethodDef>>(COMPARATOR);
-        final Map<Clazz.MethodDef, Set<Clazz.MethodDef>> usedby = new TreeMap<Clazz.MethodDef, Set<Clazz.MethodDef>>(COMPARATOR);
-
-        ClassDataCollector cd = new ClassDataCollector() {
-            Clazz.MethodDef source;
-
-            // Before a method is parsed
-            public void method(Clazz.MethodDef source) {
-                this.source = source;
-                xref(using, source, null);
-                xref(usedby, source, null);
-            }
-
-            // For any reference in the previous method.
-            public void reference(Clazz.MethodDef reference) {
-                xref(using, source, reference);
-                xref(usedby, reference, source);
-            }
-        };
-        for (Clazz clazz : classes) {
-            clazz.parseClassFileWithCollector(cd);
-        }
-
-        out.println("<calltree>");
-        xref(out, "using", using);
-        xref(out, "usedby", usedby);
-        out.println("</calltree>");
-    }
-
-    /*
-     * Add a new reference
-     */
-    static Comparator<Clazz.MethodDef> COMPARATOR = new Comparator<Clazz.MethodDef>() {
-		
-		public int compare(MethodDef a, MethodDef b) {
-			int r =a.getName().compareTo(b.getName()); 
-			return  r != 0 ? r : a.getDescriptor().toString().compareTo(b.getDescriptor().toString());
+	/**
+	 * The write method is called to write the resource. We just call the static
+	 * method.
+	 */
+	public void write(OutputStream out) throws Exception {
+		OutputStreamWriter osw = new OutputStreamWriter(out, Constants.DEFAULT_CHARSET);
+		PrintWriter pw = new PrintWriter(osw);
+		try {
+			writeCalltree(pw, classes);
 		}
-	};
-    private static void xref(
-            Map<Clazz.MethodDef, Set<Clazz.MethodDef>> references,
-            Clazz.MethodDef source, Clazz.MethodDef reference) {
-        Set<Clazz.MethodDef> set = references.get(source);
-        if (set == null)
-            references.put(source, set=new TreeSet<Clazz.MethodDef>(COMPARATOR));
-        if ( reference != null)
-            set.add(reference);
-    }
+		finally {
+			pw.flush();
+		}
+	}
 
-    /*
-     * Print out either using or usedby sets
-     */
-    private static void xref(PrintWriter out, String group,
-            Map<Clazz.MethodDef, Set<Clazz.MethodDef>> references) {
-        out.println("  <" + group + ">");
-        for (Map.Entry<Clazz.MethodDef, Set<Clazz.MethodDef>> entry : references
-                .entrySet()) {
-            Clazz.MethodDef source = entry.getKey();
-            Set<Clazz.MethodDef> refs = entry.getValue();
-            method(out, "method", source, ">");
-            for (Clazz.MethodDef ref : refs) {
-                method(out, "ref", ref, "/>");
-            }
-            out.println("      </method>");
-        }
-        out.println("  </" + group + ">");
-    }
+	/**
+	 * Print the call tree in XML.
+	 * 
+	 * @param out
+	 *            The output writer
+	 * @param classes
+	 *            The set of classes
+	 * @throws IOException
+	 *             Any errors
+	 */
+	public static void writeCalltree(PrintWriter out, Collection<Clazz> classes) throws Exception {
 
-    /*
-     * Print out a method.
-     */
-    private static void method(PrintWriter out, String element,
-            Clazz.MethodDef source, String closeElement) {
-        out.println("      <" + element + " class='" + source.getContainingClass().getFQN() + "'"
-                + getAccess(source.getAccess()) + 
-                ( source.isConstructor() ? "" :  " name='" + source.getName() + "'") + " descriptor='" + source.getDescriptor() + "' pretty='"
-                + source.toString() + "'" + closeElement);
-    }
+		final Map<Clazz.MethodDef,Set<Clazz.MethodDef>> using = new TreeMap<Clazz.MethodDef,Set<Clazz.MethodDef>>(
+				COMPARATOR);
+		final Map<Clazz.MethodDef,Set<Clazz.MethodDef>> usedby = new TreeMap<Clazz.MethodDef,Set<Clazz.MethodDef>>(
+				COMPARATOR);
 
-    private static String getAccess(int access) {
-        StringBuilder sb = new StringBuilder();
-        if ( Modifier.isPublic(access) )
-            sb.append(" public='true'");
-        if ( Modifier.isStatic(access) )
-            sb.append(" static='true'");
-        if ( Modifier.isProtected(access) )
-            sb.append(" protected='true'");
-        if ( Modifier.isInterface(access) )
-            sb.append(" interface='true'");
-        
-        return sb.toString();
-    }
+		ClassDataCollector cd = new ClassDataCollector() {
+			Clazz.MethodDef	source;
+
+			// Before a method is parsed
+			public void method(Clazz.MethodDef source) {
+				this.source = source;
+				xref(using, source, null);
+				xref(usedby, source, null);
+			}
+
+			// For any reference in the previous method.
+			public void reference(Clazz.MethodDef reference) {
+				xref(using, source, reference);
+				xref(usedby, reference, source);
+			}
+		};
+		for (Clazz clazz : classes) {
+			clazz.parseClassFileWithCollector(cd);
+		}
+
+		out.println("<calltree>");
+		xref(out, "using", using);
+		xref(out, "usedby", usedby);
+		out.println("</calltree>");
+	}
+
+	/*
+	 * Add a new reference
+	 */
+	static Comparator<Clazz.MethodDef>	COMPARATOR	= new Comparator<Clazz.MethodDef>() {
+
+														public int compare(MethodDef a, MethodDef b) {
+															int r = a.getName().compareTo(b.getName());
+															return r != 0 ? r : a.getDescriptor().toString()
+																	.compareTo(b.getDescriptor().toString());
+														}
+													};
+
+	private static void xref(Map<Clazz.MethodDef,Set<Clazz.MethodDef>> references, Clazz.MethodDef source,
+			Clazz.MethodDef reference) {
+		Set<Clazz.MethodDef> set = references.get(source);
+		if (set == null)
+			references.put(source, set = new TreeSet<Clazz.MethodDef>(COMPARATOR));
+		if (reference != null)
+			set.add(reference);
+	}
+
+	/*
+	 * Print out either using or usedby sets
+	 */
+	private static void xref(PrintWriter out, String group, Map<Clazz.MethodDef,Set<Clazz.MethodDef>> references) {
+		out.println("  <" + group + ">");
+		for (Map.Entry<Clazz.MethodDef,Set<Clazz.MethodDef>> entry : references.entrySet()) {
+			Clazz.MethodDef source = entry.getKey();
+			Set<Clazz.MethodDef> refs = entry.getValue();
+			method(out, "method", source, ">");
+			for (Clazz.MethodDef ref : refs) {
+				method(out, "ref", ref, "/>");
+			}
+			out.println("      </method>");
+		}
+		out.println("  </" + group + ">");
+	}
+
+	/*
+	 * Print out a method.
+	 */
+	private static void method(PrintWriter out, String element, Clazz.MethodDef source, String closeElement) {
+		out.println("      <" + element + " class='" + source.getContainingClass().getFQN() + "'"
+				+ getAccess(source.getAccess()) + (source.isConstructor() ? "" : " name='" + source.getName() + "'")
+				+ " descriptor='" + source.getDescriptor() + "' pretty='" + source.toString() + "'" + closeElement);
+	}
+
+	private static String getAccess(int access) {
+		StringBuilder sb = new StringBuilder();
+		if (Modifier.isPublic(access))
+			sb.append(" public='true'");
+		if (Modifier.isStatic(access))
+			sb.append(" static='true'");
+		if (Modifier.isProtected(access))
+			sb.append(" protected='true'");
+		if (Modifier.isInterface(access))
+			sb.append(" interface='true'");
+
+		return sb.toString();
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/component/ComponentAnnotationReader.java b/bundleplugin/src/main/java/aQute/bnd/make/component/ComponentAnnotationReader.java
index 1a586b4..7c776b3 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/component/ComponentAnnotationReader.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/component/ComponentAnnotationReader.java
@@ -22,18 +22,20 @@
 	static Pattern				ACTIVATEDESCRIPTOR		= Pattern
 																.compile("\\(((Lorg/osgi/service/component/ComponentContext;)|(Lorg/osgi/framework/BundleContext;)|(Ljava/util/Map;))*\\)V");
 	static Pattern				OLDACTIVATEDESCRIPTOR	= Pattern
-	.compile("\\(Lorg/osgi/service/component/ComponentContext;\\)V");
-	
-	
+																.compile("\\(Lorg/osgi/service/component/ComponentContext;\\)V");
+
 	static Pattern				OLDBINDDESCRIPTOR		= Pattern.compile("\\(L([^;]*);\\)V");
 	static Pattern				REFERENCEBINDDESCRIPTOR	= Pattern
 																.compile("\\(Lorg/osgi/framework/ServiceReference;\\)V");
 
 	static String[]				ACTIVATE_ARGUMENTS		= {
-		"org.osgi.service.component.ComponentContext", "org.osgi.framework.BundleContext",
-		Map.class.getName(), "org.osgi.framework.BundleContext" };
-	static String[]				OLD_ACTIVATE_ARGUMENTS	= { "org.osgi.service.component.ComponentContext" };
-	
+			"org.osgi.service.component.ComponentContext", "org.osgi.framework.BundleContext", Map.class.getName(),
+			"org.osgi.framework.BundleContext"
+														};
+	static String[]				OLD_ACTIVATE_ARGUMENTS	= {
+															"org.osgi.service.component.ComponentContext"
+														};
+
 	Reporter					reporter				= new Processor();
 	MethodDef					method;
 	TypeRef						className;
@@ -43,7 +45,7 @@
 	Set<String>					optional				= new HashSet<String>();
 	Set<String>					dynamic					= new HashSet<String>();
 
-	Map<String, String>			map						= new TreeMap<String, String>();
+	Map<String,String>			map						= new TreeMap<String,String>();
 	Set<String>					descriptors				= new HashSet<String>();
 	List<String>				properties				= new ArrayList<String>();
 	String						version					= null;
@@ -62,11 +64,11 @@
 		return this.reporter;
 	}
 
-	public static Map<String, String> getDefinition(Clazz c) throws Exception {
+	public static Map<String,String> getDefinition(Clazz c) throws Exception {
 		return getDefinition(c, new Processor());
 	}
 
-	public static Map<String, String> getDefinition(Clazz c, Reporter reporter) throws Exception {
+	public static Map<String,String> getDefinition(Clazz c, Reporter reporter) throws Exception {
 		ComponentAnnotationReader r = new ComponentAnnotationReader(c);
 		r.setReporter(reporter);
 		c.parseClassFileWithCollector(r);
@@ -76,7 +78,7 @@
 
 	public void annotation(Annotation annotation) {
 		String fqn = annotation.getName().getFQN();
-		
+
 		if (fqn.equals(Component.class.getName())) {
 			set(COMPONENT_NAME, annotation.get(Component.NAME), "<>");
 			set(COMPONENT_FACTORY, annotation.get(Component.FACTORY), false);
@@ -296,9 +298,8 @@
 	}
 
 	/**
-	 * Skip L and ; and replace / for . in an object descriptor.
-	 * 
-	 * A string like Lcom/acme/Foo; becomes com.acme.Foo
+	 * Skip L and ; and replace / for . in an object descriptor. A string like
+	 * Lcom/acme/Foo; becomes com.acme.Foo
 	 * 
 	 * @param string
 	 * @return
@@ -315,15 +316,18 @@
 		return sb.toString();
 	}
 
-	@Override public void classBegin(int access, TypeRef name) {
+	@Override
+	public void classBegin(int access, TypeRef name) {
 		className = name;
 	}
 
-	@Override public void implementsInterfaces(TypeRef[] interfaces) {
+	@Override
+	public void implementsInterfaces(TypeRef[] interfaces) {
 		this.interfaces = interfaces;
 	}
 
-	@Override public void method(Clazz.MethodDef method) {
+	@Override
+	public void method(Clazz.MethodDef method) {
 		this.method = method;
 		descriptors.add(method.getName());
 	}
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/component/ServiceComponent.java b/bundleplugin/src/main/java/aQute/bnd/make/component/ServiceComponent.java
index 1e5989f..653c48d 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/component/ServiceComponent.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/component/ServiceComponent.java
@@ -26,7 +26,7 @@
 
 		ComponentMaker m = new ComponentMaker(analyzer);
 
-		Map<String, Map<String, String>> l = m.doServiceComponent();
+		Map<String,Map<String,String>> l = m.doServiceComponent();
 
 		analyzer.setProperty(Constants.SERVICE_COMPONENT, Processor.printClauses(l));
 
@@ -50,21 +50,20 @@
 		 * <li>An XML file reference</li>
 		 * <li>A FQN/wildcard with a set of attributes</li>
 		 * </ol>
-		 * 
 		 * An XML reference is immediately expanded, an FQN/wildcard is more
 		 * complicated and is delegated to
 		 * {@link #componentEntry(Map, String, Map)}.
 		 * 
 		 * @throws Exception
 		 */
-		Map<String, Map<String, String>> doServiceComponent() throws Exception {
-			Map<String, Map<String, String>> serviceComponents = newMap();
+		Map<String,Map<String,String>> doServiceComponent() throws Exception {
+			Map<String,Map<String,String>> serviceComponents = newMap();
 			String header = getProperty(SERVICE_COMPONENT);
 			Parameters sc = parseHeader(header);
 
-			for (Entry<String, Attrs> entry : sc.entrySet()) {
+			for (Entry<String,Attrs> entry : sc.entrySet()) {
 				String name = entry.getKey();
-				Map<String, String> info = entry.getValue();
+				Map<String,String> info = entry.getValue();
 
 				try {
 					if (name.indexOf('/') >= 0 || name.endsWith(".xml")) {
@@ -73,7 +72,8 @@
 					} else {
 						componentEntry(serviceComponents, name, info);
 					}
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					e.printStackTrace();
 					error("Invalid Service-Component header: %s %s, throws %s", name, info, e);
 				}
@@ -89,17 +89,16 @@
 		 * <li>A wildcard expression for finding annotated components.</li>
 		 * </ol>
 		 * The problem is the distinction between an FQN and a wildcard because
-		 * an FQN can also be used as a wildcard.
-		 * 
-		 * If the info specifies {@link Constants#NOANNOTATIONS} then wildcards
-		 * are an error and the component must be fully described by the info.
-		 * Otherwise the FQN/wildcard is expanded into a list of classes with
-		 * annotations. If this list is empty, the FQN case is interpreted as a
-		 * complete component definition. For the wildcard case, it is checked
-		 * if any matching classes for the wildcard have been compiled for a
-		 * class file format that does not support annotations, this can be a
-		 * problem with JSR14 who silently ignores annotations. An error is
-		 * reported in such a case.
+		 * an FQN can also be used as a wildcard. If the info specifies
+		 * {@link Constants#NOANNOTATIONS} then wildcards are an error and the
+		 * component must be fully described by the info. Otherwise the
+		 * FQN/wildcard is expanded into a list of classes with annotations. If
+		 * this list is empty, the FQN case is interpreted as a complete
+		 * component definition. For the wildcard case, it is checked if any
+		 * matching classes for the wildcard have been compiled for a class file
+		 * format that does not support annotations, this can be a problem with
+		 * JSR14 who silently ignores annotations. An error is reported in such
+		 * a case.
 		 * 
 		 * @param serviceComponents
 		 * @param name
@@ -107,8 +106,8 @@
 		 * @throws Exception
 		 * @throws IOException
 		 */
-		private void componentEntry(Map<String, Map<String, String>> serviceComponents,
-				String name, Map<String, String> info) throws Exception, IOException {
+		private void componentEntry(Map<String,Map<String,String>> serviceComponents, String name,
+				Map<String,String> info) throws Exception, IOException {
 
 			boolean annotations = !Processor.isTrue(info.get(NOANNOTATIONS));
 			boolean fqn = Verifier.isFQN(name);
@@ -117,8 +116,8 @@
 
 				// Annotations possible!
 
-				Collection<Clazz> annotatedComponents = analyzer.getClasses("",
-						QUERY.ANNOTATED.toString(), Component.class.getName(), //
+				Collection<Clazz> annotatedComponents = analyzer.getClasses("", QUERY.ANNOTATED.toString(),
+						Component.class.getName(), //
 						QUERY.NAMED.toString(), name //
 						);
 
@@ -169,9 +168,9 @@
 		private Collection<Clazz> checkAnnotationsFeasible(String name) throws Exception {
 			Collection<Clazz> not = analyzer.getClasses("", QUERY.NAMED.toString(), name //
 					);
-			
+
 			if (not.isEmpty())
-				if ( "*".equals(name))
+				if ("*".equals(name))
 					return not;
 				else
 					error("Specified %s but could not find any class matching this pattern", name);
@@ -180,18 +179,17 @@
 				if (c.getFormat().hasAnnotations())
 					return not;
 			}
-			
+
 			warning("Wildcards are used (%s) requiring annotations to decide what is a component. Wildcard maps to classes that are compiled with java.target < 1.5. Annotations were introduced in Java 1.5",
 					name);
-			
+
 			return not;
 		}
 
-		void annotated(Map<String, Map<String, String>> components, Clazz c,
-				Map<String, String> info) throws Exception {
+		void annotated(Map<String,Map<String,String>> components, Clazz c, Map<String,String> info) throws Exception {
 			// Get the component definition
 			// from the annotations
-			Map<String, String> map = ComponentAnnotationReader.getDefinition(c, this);
+			Map<String,String> map = ComponentAnnotationReader.getDefinition(c, this);
 
 			// Pick the name, the annotation can override
 			// the name.
@@ -202,16 +200,15 @@
 			// Override the component info without manifest
 			// entries. We merge the properties though.
 
-			String merged = Processor.merge(info.remove(COMPONENT_PROPERTIES),
-					map.remove(COMPONENT_PROPERTIES));
+			String merged = Processor.merge(info.remove(COMPONENT_PROPERTIES), map.remove(COMPONENT_PROPERTIES));
 			if (merged != null && merged.length() > 0)
 				map.put(COMPONENT_PROPERTIES, merged);
 			map.putAll(info);
 			createComponentResource(components, localname, map);
 		}
 
-		private void createComponentResource(Map<String, Map<String, String>> components,
-				String name, Map<String, String> info) throws IOException {
+		private void createComponentResource(Map<String,Map<String,String>> components, String name,
+				Map<String,String> info) throws IOException {
 
 			// We can override the name in the parameters
 			if (info.containsKey(COMPONENT_NAME))
@@ -264,9 +261,7 @@
 
 					analyzer.getJar().putResource(rname, r);
 				} else {
-					analyzer.error(
-							"Cannot find designated configuration class %s for component %s", c,
-							name);
+					analyzer.error("Cannot find designated configuration class %s for component %s", c, name);
 				}
 			}
 			return true;
@@ -280,8 +275,7 @@
 		 * @param info
 		 * @throws UnsupportedEncodingException
 		 */
-		Resource createComponentResource(String name, String impl, Map<String, String> info)
-				throws IOException {
+		Resource createComponentResource(String name, String impl, Map<String,String> info) throws IOException {
 			String namespace = getNamespace(info);
 			ByteArrayOutputStream out = new ByteArrayOutputStream();
 			PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, Constants.DEFAULT_CHARSET));
@@ -295,8 +289,8 @@
 			doAttribute(pw, info.get(COMPONENT_FACTORY), "factory");
 			doAttribute(pw, info.get(COMPONENT_IMMEDIATE), "immediate", "false", "true");
 			doAttribute(pw, info.get(COMPONENT_ENABLED), "enabled", "true", "false");
-			doAttribute(pw, info.get(COMPONENT_CONFIGURATION_POLICY), "configuration-policy",
-					"optional", "require", "ignore");
+			doAttribute(pw, info.get(COMPONENT_CONFIGURATION_POLICY), "configuration-policy", "optional", "require",
+					"ignore");
 			doAttribute(pw, info.get(COMPONENT_ACTIVATE), "activate", JIDENTIFIER);
 			doAttribute(pw, info.get(COMPONENT_DEACTIVATE), "deactivate", JIDENTIFIER);
 			doAttribute(pw, info.get(COMPONENT_MODIFIED), "modified", JIDENTIFIER);
@@ -335,13 +329,12 @@
 				if (matches.length != 0) {
 					if (matches.length == 1 && matches[0].equals(JIDENTIFIER)) {
 						if (!Verifier.isIdentifier(value))
-							error("Component attribute %s has value %s but is not a Java identifier",
-									name, value);
+							error("Component attribute %s has value %s but is not a Java identifier", name, value);
 					} else {
 
 						if (!Verifier.isMember(value, matches))
-							error("Component attribute %s has value %s but is not a member of %s",
-									name, value, Arrays.toString(matches));
+							error("Component attribute %s has value %s but is not a member of %s", name, value,
+									Arrays.toString(matches));
 					}
 				}
 				pw.print(" ");
@@ -358,15 +351,15 @@
 		 * @param info
 		 * @return
 		 */
-		private String getNamespace(Map<String, String> info) {
+		private String getNamespace(Map<String,String> info) {
 			String version = info.get(COMPONENT_VERSION);
 			if (version != null) {
 				try {
 					Version v = new Version(version);
 					return NAMESPACE_STEM + "/v" + v;
-				} catch (Exception e) {
-					error("version: specified on component header but not a valid version: "
-							+ version);
+				}
+				catch (Exception e) {
+					error("version: specified on component header but not a valid version: " + version);
 					return null;
 				}
 			}
@@ -384,7 +377,7 @@
 		 * @param pw
 		 * @param info
 		 */
-		void properties(PrintWriter pw, Map<String, String> info) {
+		void properties(PrintWriter pw, Map<String,String> info) {
 			Collection<String> properties = split(info.get(COMPONENT_PROPERTIES));
 			for (Iterator<String> p = properties.iterator(); p.hasNext();) {
 				String clause = p.next();
@@ -468,21 +461,20 @@
 		 * @param pw
 		 */
 
-		void reference(Map<String, String> info, PrintWriter pw) {
+		void reference(Map<String,String> info, PrintWriter pw) {
 			Collection<String> dynamic = new ArrayList<String>(split(info.get(COMPONENT_DYNAMIC)));
 			Collection<String> optional = new ArrayList<String>(split(info.get(COMPONENT_OPTIONAL)));
 			Collection<String> multiple = new ArrayList<String>(split(info.get(COMPONENT_MULTIPLE)));
 
 			Collection<String> descriptors = split(info.get(COMPONENT_DESCRIPTORS));
 
-			for (Map.Entry<String, String> entry : info.entrySet()) {
+			for (Map.Entry<String,String> entry : info.entrySet()) {
 
 				// Skip directives
 				String referenceName = entry.getKey();
 				if (referenceName.endsWith(":")) {
 					if (!SET_COMPONENT_DIRECTIVES.contains(referenceName))
-						error("Unrecognized directive in Service-Component header: "
-								+ referenceName);
+						error("Unrecognized directive in Service-Component header: " + referenceName);
 					continue;
 				}
 
@@ -508,15 +500,14 @@
 					}
 				} else if (Character.isLowerCase(referenceName.charAt(0))) {
 					unbindCalculated = true;
-					bind = "set" + Character.toUpperCase(referenceName.charAt(0))
-							+ referenceName.substring(1);
+					bind = "set" + Character.toUpperCase(referenceName.charAt(0)) + referenceName.substring(1);
 					unbind = "un" + bind;
 				}
 
 				String interfaceName = entry.getValue();
 				if (interfaceName == null || interfaceName.length() == 0) {
-					error("Invalid Interface Name for references in Service Component: "
-							+ referenceName + "=" + interfaceName);
+					error("Invalid Interface Name for references in Service Component: " + referenceName + "="
+							+ interfaceName);
 					continue;
 				}
 
@@ -603,21 +594,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("&amp;");
-				break;
-			case '\'':
-				sb.append("&quot;");
-				break;
-			default:
-				sb.append(c);
-				break;
+				case '<' :
+					sb.append("&lt;");
+					break;
+				case '>' :
+					sb.append("&gt;");
+					break;
+				case '&' :
+					sb.append("&amp;");
+					break;
+				case '\'' :
+					sb.append("&quot;");
+					break;
+				default :
+					sb.append(c);
+					break;
 			}
 		}
 		return sb.toString();
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/coverage/Coverage.java b/bundleplugin/src/main/java/aQute/bnd/make/coverage/Coverage.java
index 020b85a..024b5fe 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/coverage/Coverage.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/coverage/Coverage.java
@@ -11,89 +11,84 @@
  * This class can create a coverage table between two classspaces. The
  * destination class space is used to create a table of methods. All source
  * methods that refer to a specific dest are then filled into the table.
- * 
  */
 public class Coverage {
 
-    /**
-     * Create a cross reference table from source to dest.
-     * 
-     * @param source
-     *            The methods that refer to dest
-     * @param dest
-     *            The methods that are being referred to
-     * @return A mapping of source methods to destination methods.
-     * @throws IOException
-     */
-    public static Map<MethodDef, List<MethodDef>> getCrossRef(
-            Collection<Clazz> source, Collection<Clazz> dest)
-            throws Exception {
-        final Map<MethodDef, List<MethodDef>> catalog = buildCatalog(dest);
-        crossRef(source, catalog);
-        return catalog;
-    }
+	/**
+	 * Create a cross reference table from source to dest.
+	 * 
+	 * @param source
+	 *            The methods that refer to dest
+	 * @param dest
+	 *            The methods that are being referred to
+	 * @return A mapping of source methods to destination methods.
+	 * @throws IOException
+	 */
+	public static Map<MethodDef,List<MethodDef>> getCrossRef(Collection<Clazz> source, Collection<Clazz> dest)
+			throws Exception {
+		final Map<MethodDef,List<MethodDef>> catalog = buildCatalog(dest);
+		crossRef(source, catalog);
+		return catalog;
+	}
 
-    private static void crossRef(Collection<Clazz> source,
-            final Map<MethodDef, List<MethodDef>> catalog) throws Exception {
-        for (final Clazz clazz : source) {
-            clazz.parseClassFileWithCollector(new ClassDataCollector() {
-                MethodDef source;
+	private static void crossRef(Collection<Clazz> source, final Map<MethodDef,List<MethodDef>> catalog)
+			throws Exception {
+		for (final Clazz clazz : source) {
+			clazz.parseClassFileWithCollector(new ClassDataCollector() {
+				MethodDef	source;
 
-                public void implementsInterfaces(TypeRef names[]) {
-                    MethodDef def = clazz.getMethodDef(0,
-                            "<implements>", "()V");
-                    // TODO
-                    for (TypeRef interfaceName : names) {
-                        for (Map.Entry<MethodDef, List<MethodDef>> entry : catalog
-                                .entrySet()) {
-                            String catalogClass = entry.getKey().getContainingClass().getFQN();
-                            List<MethodDef> references = entry.getValue();
+				public void implementsInterfaces(TypeRef names[]) {
+					MethodDef def = clazz.getMethodDef(0, "<implements>", "()V");
+					// TODO
+					for (TypeRef interfaceName : names) {
+						for (Map.Entry<MethodDef,List<MethodDef>> entry : catalog.entrySet()) {
+							String catalogClass = entry.getKey().getContainingClass().getFQN();
+							List<MethodDef> references = entry.getValue();
 
-                            if (catalogClass.equals(interfaceName.getFQN())) {
-                                references.add(def);
-                            }
-                        }
-                    }
-                }
+							if (catalogClass.equals(interfaceName.getFQN())) {
+								references.add(def);
+							}
+						}
+					}
+				}
 
-                // Method definitions
-                public void method(MethodDef source) {
-                    this.source = source;
-                }
+				// Method definitions
+				public void method(MethodDef source) {
+					this.source = source;
+				}
 
-                public void reference(MethodDef reference) {
-                    List<MethodDef> references = catalog.get(reference);
-                    if (references != null) {
-                        references.add(source);
-                    }
-                }
-            });
-        }
-    }
+				public void reference(MethodDef reference) {
+					List<MethodDef> references = catalog.get(reference);
+					if (references != null) {
+						references.add(source);
+					}
+				}
+			});
+		}
+	}
 
-    private static Map<MethodDef, List<MethodDef>> buildCatalog(
-            Collection<Clazz> sources) throws Exception {
-        final Map<MethodDef, List<MethodDef>> catalog = new TreeMap<MethodDef, List<MethodDef>>(new Comparator<MethodDef>() {
-			public int compare(MethodDef a, MethodDef b) {
-				return a.getName().compareTo(b.getName());
-			}
-		});
-        for (final Clazz clazz : sources) {
-            clazz.parseClassFileWithCollector(new ClassDataCollector() {
+	private static Map<MethodDef,List<MethodDef>> buildCatalog(Collection<Clazz> sources) throws Exception {
+		final Map<MethodDef,List<MethodDef>> catalog = new TreeMap<MethodDef,List<MethodDef>>(
+				new Comparator<MethodDef>() {
+					public int compare(MethodDef a, MethodDef b) {
+						return a.getName().compareTo(b.getName());
+					}
+				});
+		for (final Clazz clazz : sources) {
+			clazz.parseClassFileWithCollector(new ClassDataCollector() {
 
-                public boolean classStart(int access, TypeRef name) {
-                    return clazz.isPublic();
-                }
+				public boolean classStart(int access, TypeRef name) {
+					return clazz.isPublic();
+				}
 
-                public void method(MethodDef source) {
-                    if (source.isPublic()
-                            || source.isProtected())
-                        catalog.put(source, new ArrayList<MethodDef>());
-                }
+				public void method(MethodDef source) {
+					if (source.isPublic() || source.isProtected())
+						catalog.put(source, new ArrayList<MethodDef>());
+				}
 
-            });
-        }
-        return catalog;
-    }
+			});
+		}
+		return catalog;
+	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/coverage/CoverageResource.java b/bundleplugin/src/main/java/aQute/bnd/make/coverage/CoverageResource.java
index d879e53..0a1b8ab 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/coverage/CoverageResource.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/coverage/CoverageResource.java
@@ -12,80 +12,78 @@
 /**
  * Creates an XML Coverage report. This class can be used as a resource so the
  * report is created only when the JAR is written.
- * 
  */
 public class CoverageResource extends WriteResource {
-    Collection<Clazz> testsuite;
-    Collection<Clazz> service;
+	Collection<Clazz>	testsuite;
+	Collection<Clazz>	service;
 
-    public CoverageResource(Collection<Clazz> testsuite,
-            Collection<Clazz> service) {
-        this.testsuite = testsuite;
-        this.service = service;
-    }
+	public CoverageResource(Collection<Clazz> testsuite, Collection<Clazz> service) {
+		this.testsuite = testsuite;
+		this.service = service;
+	}
 
-    @Override
-    public long lastModified() {
-        return 0;
-    }
+	@Override
+	public long lastModified() {
+		return 0;
+	}
 
-    @Override
-    public void write(OutputStream out) throws IOException {
-        try {
-            Map<MethodDef, List<MethodDef>> table = getCrossRef(testsuite,
-                    service);
-            Tag coverage = toTag(table);
-            PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,
-                    Constants.DEFAULT_CHARSET));
-            try {
-                coverage.print(0, pw);
-            } finally {
-                pw.flush();
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
+	@Override
+	public void write(OutputStream out) throws IOException {
+		try {
+			Map<MethodDef,List<MethodDef>> table = getCrossRef(testsuite, service);
+			Tag coverage = toTag(table);
+			PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, Constants.DEFAULT_CHARSET));
+			try {
+				coverage.print(0, pw);
+			}
+			finally {
+				pw.flush();
+			}
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
 
-    public static Tag toTag(Map<MethodDef, List<MethodDef>> catalog) {
-        Tag coverage = new Tag("coverage");
-        String currentClass = null;
-        Tag classTag = null;
+	public static Tag toTag(Map<MethodDef,List<MethodDef>> catalog) {
+		Tag coverage = new Tag("coverage");
+		String currentClass = null;
+		Tag classTag = null;
 
-        for (Map.Entry<MethodDef, List<MethodDef>> m : catalog.entrySet()) {
-            String className = m.getKey().getContainingClass().getFQN();
-            if (!className.equals(currentClass)) {
-                classTag = new Tag("class");
-                classTag.addAttribute("name", className);
-                classTag.addAttribute("package", Descriptors.getPackage(className));
-                classTag.addAttribute("short", Descriptors.getShortName(className));
-                coverage.addContent(classTag);
-                currentClass = className;
-            }
-            Tag method = doMethod(new Tag("method"), m.getKey());
-            classTag.addContent(method);
-            for (MethodDef r : m.getValue()) {
-                Tag ref = doMethod(new Tag("ref"), r);
-                method.addContent(ref);
-            }
-        }
-        return coverage;
-    }
+		for (Map.Entry<MethodDef,List<MethodDef>> m : catalog.entrySet()) {
+			String className = m.getKey().getContainingClass().getFQN();
+			if (!className.equals(currentClass)) {
+				classTag = new Tag("class");
+				classTag.addAttribute("name", className);
+				classTag.addAttribute("package", Descriptors.getPackage(className));
+				classTag.addAttribute("short", Descriptors.getShortName(className));
+				coverage.addContent(classTag);
+				currentClass = className;
+			}
+			Tag method = doMethod(new Tag("method"), m.getKey());
+			classTag.addContent(method);
+			for (MethodDef r : m.getValue()) {
+				Tag ref = doMethod(new Tag("ref"), r);
+				method.addContent(ref);
+			}
+		}
+		return coverage;
+	}
 
-    private static Tag doMethod(Tag tag, MethodDef method) {
-        tag.addAttribute("pretty", method.toString());
-        if (method.isPublic())
-            tag.addAttribute("public", true);
-        if (method.isStatic())
-            tag.addAttribute("static", true);
-        if (method.isProtected())
-            tag.addAttribute("protected", true);
-        if (method.isInterface())
-            tag.addAttribute("interface", true);
-        tag.addAttribute("constructor", method.isConstructor());
-        if (!method.isConstructor())
-            tag.addAttribute("name", method.getName());
-        tag.addAttribute("descriptor", method.getDescriptor());
-        return tag;
-    }
+	private static Tag doMethod(Tag tag, MethodDef method) {
+		tag.addAttribute("pretty", method.toString());
+		if (method.isPublic())
+			tag.addAttribute("public", true);
+		if (method.isStatic())
+			tag.addAttribute("static", true);
+		if (method.isProtected())
+			tag.addAttribute("protected", true);
+		if (method.isInterface())
+			tag.addAttribute("interface", true);
+		tag.addAttribute("constructor", method.isConstructor());
+		if (!method.isConstructor())
+			tag.addAttribute("name", method.getName());
+		tag.addAttribute("descriptor", method.getDescriptor());
+		return tag;
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetaTypeReader.java b/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetaTypeReader.java
index ae541d6..beb1a36 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetaTypeReader.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetaTypeReader.java
@@ -12,33 +12,34 @@
 import aQute.libg.generics.*;
 
 public class MetaTypeReader extends WriteResource {
-	final Analyzer				reporter;
-	Clazz						clazz;
-	String						interfaces[];
-	Tag							metadata	= new Tag("metatype:MetaData", new String[] {
-			"xmlns:metatype", "http://www.osgi.org/xmlns/metatype/v1.1.0" });
-	Tag							ocd			= new Tag(metadata, "OCD");
-	Tag							designate	= new Tag(metadata, "Designate");
-	Tag							object		= new Tag(designate, "Object");
+	final Analyzer			reporter;
+	Clazz					clazz;
+	String					interfaces[];
+	Tag						metadata	= new Tag("metatype:MetaData", new String[] {
+			"xmlns:metatype", "http://www.osgi.org/xmlns/metatype/v1.1.0"
+										});
+	Tag						ocd			= new Tag(metadata, "OCD");
+	Tag						designate	= new Tag(metadata, "Designate");
+	Tag						object		= new Tag(designate, "Object");
 
 	// Resource
-	String						extra;
+	String					extra;
 
 	// One time init
-	boolean						finished;
+	boolean					finished;
 
 	// Designate
-	boolean						override;
-	String						designatePid;
-	boolean						factory;
+	boolean					override;
+	String					designatePid;
+	boolean					factory;
 
 	// AD
-	Map<MethodDef, Meta.AD>	methods		= new LinkedHashMap<MethodDef, Meta.AD>();
+	Map<MethodDef,Meta.AD>	methods		= new LinkedHashMap<MethodDef,Meta.AD>();
 
 	// OCD
-	Annotation					ocdAnnotation;
+	Annotation				ocdAnnotation;
 
-	MethodDef					method;
+	MethodDef				method;
 
 	public MetaTypeReader(Clazz clazz, Analyzer reporter) {
 		this.clazz = clazz;
@@ -58,13 +59,12 @@
 	 * @param optionValues
 	 */
 
-	static Pattern	COLLECTION	= Pattern
-										.compile("(.*(Collection|Set|List|Queue|Stack|Deque))<(L.+;)>");
+	static Pattern	COLLECTION	= Pattern.compile("(.*(Collection|Set|List|Queue|Stack|Deque))<(L.+;)>");
 
 	private void addMethod(MethodDef method, Meta.AD ad) throws Exception {
 
 		// Set all the defaults.
-		
+
 		String rtype = method.getGenericReturnType();
 		String id = Configurable.mangleMethodName(method.getName());
 		String name = Clazz.unCamel(id);
@@ -88,8 +88,8 @@
 		}
 
 		Meta.Type type = getType(rtype);
-		
-		boolean required = ad ==null || ad.required();
+
+		boolean required = ad == null || ad.required();
 		String deflt = null;
 		String max = null;
 		String min = null;
@@ -114,15 +114,15 @@
 				cardinality = ad.cardinality();
 			if (ad.type() != null)
 				type = ad.type();
-//			if (ad.required() || ad.deflt() == null)
-//				required = true;
+			// if (ad.required() || ad.deflt() == null)
+			// required = true;
 
 			if (ad.description() != null)
 				description = ad.description();
 
 			if (ad.optionLabels() != null)
 				optionLabels = ad.optionLabels();
-			if (ad.optionValues() != null )
+			if (ad.optionValues() != null)
 				optionValues = ad.optionValues();
 
 			if (ad.min() != null)
@@ -208,13 +208,15 @@
 	}
 
 	class Find extends ClassDataCollector {
-		
-		@Override public void method(MethodDef mdef) {
+
+		@Override
+		public void method(MethodDef mdef) {
 			method = mdef;
 			methods.put(mdef, null);
 		}
-		
-		@Override public void annotation(Annotation annotation) {
+
+		@Override
+		public void annotation(Annotation annotation) {
 			try {
 				Meta.OCD ocd = annotation.getAnnotation(Meta.OCD.class);
 				Meta.AD ad = annotation.getAnnotation(Meta.AD.class);
@@ -225,20 +227,20 @@
 					assert method != null;
 					methods.put(method, ad);
 				}
-			} catch (Exception e) {
+			}
+			catch (Exception e) {
 				reporter.error("Error during annotation parsing %s : %s", clazz, e);
 				e.printStackTrace();
 			}
 		}
 
 	}
-	
-
 
 	public void write(OutputStream out) throws IOException {
 		try {
 			finish();
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			throw new RuntimeException(e);
 		}
 		PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, "UTF-8"));
@@ -255,8 +257,7 @@
 			if (this.ocdAnnotation != null)
 				ocd = this.ocdAnnotation.getAnnotation(Meta.OCD.class);
 			else
-				ocd = Configurable.createConfigurable(Meta.OCD.class,
-						new HashMap<String, Object>());
+				ocd = Configurable.createConfigurable(Meta.OCD.class, new HashMap<String,Object>());
 
 			// defaults
 			String id = clazz.getClassName().getFQN();
@@ -268,7 +269,6 @@
 			if (ocd.id() != null)
 				id = ocd.id();
 
-			
 			if (ocd.name() != null)
 				name = ocd.name();
 
@@ -295,7 +295,7 @@
 			this.ocd.addAttribute("localization", localization);
 
 			// do ADs
-			for (Map.Entry<MethodDef, Meta.AD> entry : methods.entrySet())
+			for (Map.Entry<MethodDef,Meta.AD> entry : methods.entrySet())
 				addMethod(entry.getKey(), entry.getValue());
 
 			this.designate.addAttribute("pid", pid);
@@ -313,7 +313,8 @@
 		this.designatePid = pid;
 	}
 
-	@Override public long lastModified() {
+	@Override
+	public long lastModified() {
 		return 0;
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetatypePlugin.java b/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetatypePlugin.java
index ff43613..c6218a1 100644
--- a/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetatypePlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/make/metatype/MetatypePlugin.java
@@ -9,26 +9,23 @@
 import aQute.libg.header.*;
 
 /**
- * This class is responsible for meta type types. It is a plugin that can 
+ * This class is responsible for meta type types. It is a plugin that can
+ * 
  * @author aqute
- *
  */
 public class MetatypePlugin implements AnalyzerPlugin {
 
 	public boolean analyzeJar(Analyzer analyzer) throws Exception {
 
-		Parameters map = analyzer.parseHeader(analyzer
-				.getProperty(Constants.METATYPE));
+		Parameters map = analyzer.parseHeader(analyzer.getProperty(Constants.METATYPE));
 
 		Jar jar = analyzer.getJar();
 		for (String name : map.keySet()) {
-			Collection<Clazz> metatypes = analyzer.getClasses("", QUERY.ANNOTATED.toString(),
-					Meta.OCD.class.getName(), // 
+			Collection<Clazz> metatypes = analyzer.getClasses("", QUERY.ANNOTATED.toString(), Meta.OCD.class.getName(), //
 					QUERY.NAMED.toString(), name //
 					);
 			for (Clazz c : metatypes) {
-				jar.putResource("OSGI-INF/metatype/" + c.getFQN() + ".xml", new MetaTypeReader(c,
-						analyzer));
+				jar.putResource("OSGI-INF/metatype/" + c.getFQN() + ".xml", new MetaTypeReader(c, analyzer));
 			}
 		}
 		return false;
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/BsnToMavenPath.java b/bundleplugin/src/main/java/aQute/bnd/maven/BsnToMavenPath.java
index 6dc716c..85125ce 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/BsnToMavenPath.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/BsnToMavenPath.java
@@ -1,5 +1,5 @@
 package aQute.bnd.maven;
 
 public interface BsnToMavenPath {
-    String[] getGroupAndArtifact(String bsn);
+	String[] getGroupAndArtifact(String bsn);
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/MavenCommand.java b/bundleplugin/src/main/java/aQute/bnd/maven/MavenCommand.java
index e9cbfc3..edd212b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/MavenCommand.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/MavenCommand.java
@@ -22,8 +22,7 @@
 	final Settings	settings	= new Settings();
 	File			temp;
 
-	public MavenCommand() {
-	}
+	public MavenCommand() {}
 
 	public MavenCommand(Processor p) {
 		super(p);
@@ -167,14 +166,15 @@
 			else if (option.equals("-output"))
 				output = args[i++];
 			else if (option.equals("-nodelete"))
-				nodelete=true;
+				nodelete = true;
 			else if (option.startsWith("-properties")) {
 				InputStream in = null;
 				try {
 					in = new FileInputStream(args[i++]);
 					properties.load(in);
-				} catch (Exception e) {
-				} finally {
+				}
+				catch (Exception e) {}
+				finally {
 					if (in != null) {
 						in.close();
 					}
@@ -233,17 +233,16 @@
 		for (String d : developers)
 			pom.addDeveloper(d);
 
-		Set<String> exports = OSGiHeader.parseHeader(
-				manifest.getMainAttributes().getValue(Constants.EXPORT_PACKAGE)).keySet();
+		Set<String> exports = OSGiHeader.parseHeader(manifest.getMainAttributes().getValue(Constants.EXPORT_PACKAGE))
+				.keySet();
 
 		Jar sourceJar;
 		if (source == null) {
 			trace("Splitting source code");
 			sourceJar = new Jar("source");
-			for (Map.Entry<String, Resource> entry : binaryJar.getResources().entrySet()) {
+			for (Map.Entry<String,Resource> entry : binaryJar.getResources().entrySet()) {
 				if (entry.getKey().startsWith("OSGI-OPT/src")) {
-					sourceJar.putResource(entry.getKey().substring("OSGI-OPT/src/".length()),
-							entry.getValue());
+					sourceJar.putResource(entry.getKey().substring("OSGI-OPT/src/".length()), entry.getValue());
 				}
 			}
 			copyInfo(binaryJar, sourceJar, "source");
@@ -251,7 +250,7 @@
 			sourceJar = getJarFromFileOrURL(source);
 		}
 		sourceJar.calcChecksums(null);
-		
+
 		Jar javadocJar;
 		if (javadoc == null) {
 			trace("creating javadoc because -javadoc not used");
@@ -266,7 +265,7 @@
 			javadocJar = getJarFromFileOrURL(javadoc);
 		}
 		javadocJar.calcChecksums(null);
-		
+
 		addClose(binaryJar);
 		addClose(sourceJar);
 		addClose(javadocJar);
@@ -280,8 +279,7 @@
 		File sourceFile = new File(bundle, prefix + "-sources.jar");
 		File javadocFile = new File(bundle, prefix + "-javadoc.jar");
 		File pomFile = new File(bundle, "pom.xml").getAbsoluteFile();
-		trace("creating output files %s, %s,%s, and %s", binaryFile, sourceFile, javadocFile,
-				pomFile);
+		trace("creating output files %s, %s,%s, and %s", binaryFile, sourceFile, javadocFile, pomFile);
 
 		IO.copy(pom.openInputStream(), pomFile);
 		trace("copied pom");
@@ -318,39 +316,39 @@
 	private void copyInfo(Jar source, Jar dest, String type) throws Exception {
 		source.ensureManifest();
 		dest.ensureManifest();
-		copyInfoResource( source, dest, "LICENSE");
-		copyInfoResource( source, dest, "LICENSE.html");
-		copyInfoResource( source, dest, "about.html");
-		
+		copyInfoResource(source, dest, "LICENSE");
+		copyInfoResource(source, dest, "LICENSE.html");
+		copyInfoResource(source, dest, "about.html");
+
 		Manifest sm = source.getManifest();
 		Manifest dm = dest.getManifest();
-		copyInfoHeader( sm, dm, "Bundle-Description","");
-		copyInfoHeader( sm, dm, "Bundle-Vendor","");
-		copyInfoHeader( sm, dm, "Bundle-Copyright","");
-		copyInfoHeader( sm, dm, "Bundle-DocURL","");
-		copyInfoHeader( sm, dm, "Bundle-License","");
-		copyInfoHeader( sm, dm, "Bundle-Name", " " + type);
-		copyInfoHeader( sm, dm, "Bundle-SymbolicName", "." + type);
-		copyInfoHeader( sm, dm, "Bundle-Version", "");
+		copyInfoHeader(sm, dm, "Bundle-Description", "");
+		copyInfoHeader(sm, dm, "Bundle-Vendor", "");
+		copyInfoHeader(sm, dm, "Bundle-Copyright", "");
+		copyInfoHeader(sm, dm, "Bundle-DocURL", "");
+		copyInfoHeader(sm, dm, "Bundle-License", "");
+		copyInfoHeader(sm, dm, "Bundle-Name", " " + type);
+		copyInfoHeader(sm, dm, "Bundle-SymbolicName", "." + type);
+		copyInfoHeader(sm, dm, "Bundle-Version", "");
 	}
 
 	private void copyInfoHeader(Manifest sm, Manifest dm, String key, String value) {
 		String v = sm.getMainAttributes().getValue(key);
-		if ( v == null) {
+		if (v == null) {
 			trace("no source for " + key);
 			return;
 		}
-		
-		if ( dm.getMainAttributes().getValue(key) != null) {
-			trace("already have " + key );
+
+		if (dm.getMainAttributes().getValue(key) != null) {
+			trace("already have " + key);
 			return;
 		}
-		
+
 		dm.getMainAttributes().putValue(key, v + value);
 	}
 
 	private void copyInfoResource(Jar source, Jar dest, String type) {
-		if ( source.getResources().containsKey(type) && !dest.getResources().containsKey(type))
+		if (source.getResources().containsKey(type) && !dest.getResources().containsKey(type))
 			dest.putResource(type, source.getResource(type));
 	}
 
@@ -369,7 +367,8 @@
 			InputStream in = url.openStream();
 			try {
 				jar = new Jar(url.getFile(), in);
-			} finally {
+			}
+			finally {
 				in.close();
 			}
 		}
@@ -399,8 +398,7 @@
 		}
 	}
 
-	private Jar javadoc(File source, Set<String> exports, Manifest m, Properties p)
-			throws Exception {
+	private Jar javadoc(File source, Set<String> exports, Manifest m, Properties p) throws Exception {
 		File tmp = new File(temp, "javadoc");
 		tmp.mkdirs();
 
@@ -438,7 +436,7 @@
 		command.add("-tag");
 		command.add("noimplement:t:Consumers of this API must not implement this interface");
 
-		for (Enumeration<?> e = pp.propertyNames(); e.hasMoreElements();) {
+		for (Enumeration< ? > e = pp.propertyNames(); e.hasMoreElements();) {
 			String key = (String) e.nextElement();
 			String value = pp.getProperty(key);
 
@@ -460,8 +458,7 @@
 
 		int result = command.execute(out, err);
 		if (result != 0) {
-			warning("Error during execution of javadoc command: %s\n******************\n%s", out,
-					err);
+			warning("Error during execution of javadoc command: %s\n******************\n%s", out, err);
 		}
 		Jar jar = new Jar(tmp);
 		addClose(jar);
@@ -475,14 +472,13 @@
 	 * @return
 	 */
 	private String license(Attributes attr) {
-		Parameters map = Processor.parseHeader(
-				attr.getValue(Constants.BUNDLE_LICENSE), null);
+		Parameters map = Processor.parseHeader(attr.getValue(Constants.BUNDLE_LICENSE), null);
 		if (map.isEmpty())
 			return null;
 
 		StringBuilder sb = new StringBuilder();
 		String sep = "Licensed under ";
-		for (Entry<String, Attrs> entry : map.entrySet()) {
+		for (Entry<String,Attrs> entry : map.entrySet()) {
 			sb.append(sep);
 			String key = entry.getKey();
 			String link = entry.getValue().get("link");
@@ -541,78 +537,74 @@
 		pp.setProperty(key, defaultValue);
 	}
 
-	
 	/**
 	 * View - Show the dependency details of an artifact
 	 */
-	
 
-	static Executor executor = Executors.newCachedThreadPool();
-	static Pattern GROUP_ARTIFACT_VERSION = Pattern.compile("([^+]+)\\+([^+]+)\\+([^+]+)");
-	void view( String args[], int i) throws Exception {
+	static Executor	executor				= Executors.newCachedThreadPool();
+	static Pattern	GROUP_ARTIFACT_VERSION	= Pattern.compile("([^+]+)\\+([^+]+)\\+([^+]+)");
+
+	void view(String args[], int i) throws Exception {
 		Maven maven = new Maven(executor);
 		OutputStream out = System.err;
-		
-		List<URI>	urls = new ArrayList<URI>();
-		
-		while ( i < args.length && args[i].startsWith("-")) {
-			if( "-r".equals(args[i])) {
+
+		List<URI> urls = new ArrayList<URI>();
+
+		while (i < args.length && args[i].startsWith("-")) {
+			if ("-r".equals(args[i])) {
 				URI uri = new URI(args[++i]);
-				urls.add( uri );
+				urls.add(uri);
 				System.err.println("URI for repo " + uri);
-			}
-			else
-				if ( "-o".equals(args[i])) {
-					out = new FileOutputStream(args[++i]);
-				}
-				else
-					throw new IllegalArgumentException("Unknown option: " + args[i]);
-			
+			} else if ("-o".equals(args[i])) {
+				out = new FileOutputStream(args[++i]);
+			} else
+				throw new IllegalArgumentException("Unknown option: " + args[i]);
+
 			i++;
 		}
-		
+
 		URI[] urls2 = urls.toArray(new URI[urls.size()]);
 		PrintWriter pw = IO.writer(out);
-		
-		while ( i < args.length) {
+
+		while (i < args.length) {
 			String ref = args[i++];
 			pw.println("Ref " + ref);
-			
+
 			Matcher matcher = GROUP_ARTIFACT_VERSION.matcher(ref);
 			if (matcher.matches()) {
-				
+
 				String group = matcher.group(1);
 				String artifact = matcher.group(2);
 				String version = matcher.group(3);
 				CachedPom pom = maven.getPom(group, artifact, version, urls2);
-				
+
 				Builder a = new Builder();
 				a.setProperty("Private-Package", "*");
 				Set<Pom> dependencies = pom.getDependencies(Scope.compile, urls2);
-				for ( Pom dep : dependencies ) {
-					System.err.printf( "%20s %-20s %10s%n", dep.getGroupId(), dep.getArtifactId(), dep.getVersion());
+				for (Pom dep : dependencies) {
+					System.err.printf("%20s %-20s %10s%n", dep.getGroupId(), dep.getArtifactId(), dep.getVersion());
 					a.addClasspath(dep.getArtifact());
 				}
 				pw.println(a.getClasspath());
 				a.build();
 
-				TreeSet<PackageRef> sorted = new TreeSet<PackageRef>( a.getImports().keySet());
-				for ( PackageRef p :sorted) {
-					pw.printf("%-40s\n",p);
+				TreeSet<PackageRef> sorted = new TreeSet<PackageRef>(a.getImports().keySet());
+				for (PackageRef p : sorted) {
+					pw.printf("%-40s\n", p);
 				}
-//				for ( Map.Entry<String, Set<String>> entry : a.getUses().entrySet()) {
-//					String from = entry.getKey();
-//					for ( String uses : entry.getValue()) {
-//						System.err.printf("%40s %s\n", from, uses);
-//						from = "";
-//					}
-//				}
+				// for ( Map.Entry<String, Set<String>> entry :
+				// a.getUses().entrySet()) {
+				// String from = entry.getKey();
+				// for ( String uses : entry.getValue()) {
+				// System.err.printf("%40s %s\n", from, uses);
+				// from = "";
+				// }
+				// }
 				a.close();
 			} else
 				System.err.println("Wrong, must look like group+artifact+version, is " + ref);
-			
+
 		}
 	}
-	
-	
+
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/MavenDependencyGraph.java b/bundleplugin/src/main/java/aQute/bnd/maven/MavenDependencyGraph.java
index 52d2708..d34f2b2 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/MavenDependencyGraph.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/MavenDependencyGraph.java
@@ -14,14 +14,13 @@
 	final List<Artifact>				dependencies	= new ArrayList<Artifact>();
 	final List<URL>						repositories	= new ArrayList<URL>();
 	final XPath							xpath			= xpathFactory.newXPath();
-	final Map<URL, Artifact>			cache			= new HashMap<URL, Artifact>();
-	Artifact						root;
+	final Map<URL,Artifact>				cache			= new HashMap<URL,Artifact>();
+	Artifact							root;
 
 	enum Scope {
 		COMPILE, RUNTIME, TEST, PROVIDED, SYSTEM, IMPORT,
 	}
 
-	
 	public class Artifact {
 
 		String			groupId;
@@ -49,33 +48,27 @@
 				if (scope != null && scope.length() > 0) {
 					this.scope = Scope.valueOf(scope.toUpperCase());
 				}
-				NodeList evaluate = (NodeList) xpath.evaluate("//dependencies/dependency", doc,
-						XPathConstants.NODESET);
+				NodeList evaluate = (NodeList) xpath.evaluate("//dependencies/dependency", doc, XPathConstants.NODESET);
 
 				for (int i = 0; i < evaluate.getLength(); i++) {
 					Node childNode = evaluate.item(i);
-					Artifact artifact = getArtifact(xpath.evaluate("groupId", childNode), xpath
-							.evaluate("artifactId", childNode), xpath.evaluate("version", childNode));
+					Artifact artifact = getArtifact(xpath.evaluate("groupId", childNode),
+							xpath.evaluate("artifactId", childNode), xpath.evaluate("version", childNode));
 					add(artifact);
 				}
 			}
 		}
-		
-		
 
 		public void add(Artifact artifact) {
 			dependencies.add(artifact);
 		}
 
-
-
 		public String toString() {
 			return groupId + "." + artifactId + "-" + version + "[" + scope + "," + optional + "]";
 		}
 
 		public String getPath() throws URISyntaxException {
-			return groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + artifactId
-					+ "-" + version;
+			return groupId.replace('.', '/') + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version;
 		}
 
 	}
@@ -102,7 +95,8 @@
 				} else {
 					return new Artifact(url);
 				}
-			} catch (Exception e) {
+			}
+			catch (Exception e) {
 				System.err.println("Failed to get " + artifactId + " from " + repository);
 			}
 		}
@@ -127,13 +121,10 @@
 		return null;
 	}
 
-	
-	
-	public void addArtifact( Artifact artifact ) throws Exception {
-		if ( root == null)
+	public void addArtifact(Artifact artifact) throws Exception {
+		if (root == null)
 			root = new Artifact(null);
 		root.add(artifact);
 	}
-	
-	
+
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeploy.java b/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeploy.java
index ce936e7..ec5e2b7 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeploy.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeploy.java
@@ -21,7 +21,7 @@
 	String		passphrase;
 	Reporter	reporter;
 
-	public void setProperties(Map<String, String> map) {
+	public void setProperties(Map<String,String> map) {
 		repository = map.get("repository");
 		url = map.get("url");
 		passphrase = map.get("passphrase");
@@ -41,10 +41,9 @@
 	/**
 	 */
 	public boolean deploy(Project project, Jar original) throws Exception {
-		Parameters deploy = project.parseHeader(project
-				.getProperty(Constants.DEPLOY));
+		Parameters deploy = project.parseHeader(project.getProperty(Constants.DEPLOY));
 
-		Map<String, String> maven = deploy.get(repository);
+		Map<String,String> maven = deploy.get(repository);
 		if (maven == null)
 			return false; // we're not playing for this bundle
 
@@ -66,8 +65,8 @@
 			Jar src = new Jar("src");
 			try {
 				split(original, main, src);
-				Parameters exports = project.parseHeader(manifest
-						.getMainAttributes().getValue(Constants.EXPORT_PACKAGE));
+				Parameters exports = project.parseHeader(manifest.getMainAttributes()
+						.getValue(Constants.EXPORT_PACKAGE));
 				File jdoc = new File(tmp, "jdoc");
 				jdoc.mkdirs();
 				project.progress("Generating Javadoc for: " + exports.keySet());
@@ -86,7 +85,8 @@
 				project.progress("Deploying main javadoc file");
 				maven_gpg_sign_and_deploy(project, javadocFile, "javadoc", null);
 
-			} finally {
+			}
+			finally {
 				main.close();
 				src.close();
 			}
@@ -95,7 +95,7 @@
 	}
 
 	private void split(Jar original, Jar main, Jar src) {
-		for (Map.Entry<String, Resource> e : original.getResources().entrySet()) {
+		for (Map.Entry<String,Resource> e : original.getResources().entrySet()) {
 			String path = e.getKey();
 			if (path.startsWith("OSGI-OPT/src/")) {
 				src.putResource(path.substring("OSGI-OPT/src/".length()), e.getValue());
@@ -114,8 +114,7 @@
 	// -Dfile=/Ws/bnd/biz.aQute.bndlib/tmp/biz.aQute.bndlib.jar \
 	// -Dpassphrase=a1k3v3t5x3
 
-	private void maven_gpg_sign_and_deploy(Project b, File file, String classifier, File pomFile)
-			throws Exception {
+	private void maven_gpg_sign_and_deploy(Project b, File file, String classifier, File pomFile) throws Exception {
 		Command command = new Command();
 		command.setTrace();
 		command.add(b.getProperty("mvn", "mvn"));
@@ -134,8 +133,8 @@
 
 		int result = command.execute(stdout, stderr);
 		if (result != 0) {
-			b.error("Maven deploy to %s failed to sign and transfer %s because %s", repository,
-					file, "" + stdout + stderr);
+			b.error("Maven deploy to %s failed to sign and transfer %s because %s", repository, file, "" + stdout
+					+ stderr);
 		}
 	}
 
@@ -148,12 +147,12 @@
 
 	private Jar javadoc(File tmp, Project b, Set<String> exports) throws Exception {
 		Command command = new Command();
-		
+
 		command.add(b.getProperty("javadoc", "javadoc"));
 		command.add("-d");
 		command.add(tmp.getAbsolutePath());
 		command.add("-sourcepath");
-		command.add( Processor.join(b.getSourcePath(),File.pathSeparator));
+		command.add(Processor.join(b.getSourcePath(), File.pathSeparator));
 
 		for (String packageName : exports) {
 			command.add(packageName);
@@ -178,7 +177,8 @@
 		OutputStream out = new FileOutputStream(f);
 		try {
 			r.write(out);
-		} finally {
+		}
+		finally {
 			out.close();
 		}
 		return f;
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeployCmd.java b/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeployCmd.java
index bbd233f..0209f5c 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeployCmd.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/MavenDeployCmd.java
@@ -30,16 +30,16 @@
 	 */
 	void run(String args[], int i) throws Exception {
 		if (i >= args.length) {
+			System.err.println("Usage:%n");
 			System.err
-					.println("Usage:%n");
-			System.err.println("  deploy [-url repo] [-passphrase passphrase] [-homedir homedir] [-keyname keyname] bundle ...");
+					.println("  deploy [-url repo] [-passphrase passphrase] [-homedir homedir] [-keyname keyname] bundle ...");
 			System.err.println("  settings");
 			return;
 		}
 
 		/* skip first argument */
 		i++;
-		
+
 		while (i < args.length && args[i].startsWith("-")) {
 			String option = args[i];
 			if (option.equals("-url"))
@@ -54,10 +54,9 @@
 				error("Invalid command ");
 		}
 
-		
 	}
 
-	public void setProperties(Map<String, String> map) {
+	public void setProperties(Map<String,String> map) {
 		repository = map.get("repository");
 		url = map.get("url");
 		passphrase = map.get("passphrase");
@@ -77,10 +76,9 @@
 	/**
 	 */
 	public boolean deploy(Project project, Jar original) throws Exception {
-		Parameters deploy = project.parseHeader(project
-				.getProperty(Constants.DEPLOY));
+		Parameters deploy = project.parseHeader(project.getProperty(Constants.DEPLOY));
 
-		Map<String, String> maven = deploy.get(repository);
+		Map<String,String> maven = deploy.get(repository);
 		if (maven == null)
 			return false; // we're not playing for this bundle
 
@@ -102,8 +100,8 @@
 			Jar src = new Jar("src");
 			try {
 				split(original, main, src);
-				Parameters exports = project.parseHeader(manifest
-						.getMainAttributes().getValue(Constants.EXPORT_PACKAGE));
+				Parameters exports = project.parseHeader(manifest.getMainAttributes()
+						.getValue(Constants.EXPORT_PACKAGE));
 				File jdoc = new File(tmp, "jdoc");
 				jdoc.mkdirs();
 				project.progress("Generating Javadoc for: " + exports.keySet());
@@ -122,7 +120,8 @@
 				project.progress("Deploying main javadoc file");
 				maven_gpg_sign_and_deploy(project, javadocFile, "javadoc", null);
 
-			} finally {
+			}
+			finally {
 				main.close();
 				src.close();
 			}
@@ -131,7 +130,7 @@
 	}
 
 	private void split(Jar original, Jar main, Jar src) {
-		for (Map.Entry<String, Resource> e : original.getResources().entrySet()) {
+		for (Map.Entry<String,Resource> e : original.getResources().entrySet()) {
 			String path = e.getKey();
 			if (path.startsWith("OSGI-OPT/src/")) {
 				src.putResource(path.substring("OSGI-OPT/src/".length()), e.getValue());
@@ -150,8 +149,7 @@
 	// -Dfile=/Ws/bnd/biz.aQute.bndlib/tmp/biz.aQute.bndlib.jar \
 	// -Dpassphrase=a1k3v3t5x3
 
-	private void maven_gpg_sign_and_deploy(Project b, File file, String classifier, File pomFile)
-			throws Exception {
+	private void maven_gpg_sign_and_deploy(Project b, File file, String classifier, File pomFile) throws Exception {
 		Command command = new Command();
 		command.setTrace();
 		command.add(b.getProperty("mvn", "mvn"));
@@ -170,8 +168,8 @@
 
 		int result = command.execute(stdout, stderr);
 		if (result != 0) {
-			b.error("Maven deploy to %s failed to sign and transfer %s because %s", repository,
-					file, "" + stdout + stderr);
+			b.error("Maven deploy to %s failed to sign and transfer %s because %s", repository, file, "" + stdout
+					+ stderr);
 		}
 	}
 
@@ -214,7 +212,8 @@
 		OutputStream out = new FileOutputStream(f);
 		try {
 			r.write(out);
-		} finally {
+		}
+		finally {
 			out.close();
 		}
 		return f;
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/MavenGroup.java b/bundleplugin/src/main/java/aQute/bnd/maven/MavenGroup.java
index 2d49be6..d74b6d6 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/MavenGroup.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/MavenGroup.java
@@ -6,22 +6,21 @@
 import aQute.libg.reporter.*;
 
 public class MavenGroup implements BsnToMavenPath, Plugin {
-    String    groupId = "";
+	String	groupId	= "";
 
-    public String[] getGroupAndArtifact(String bsn) {
-        String[] result = new String[2];
-        result[0] = groupId;
-        result[1] = bsn;
-        return result;
-    }
+	public String[] getGroupAndArtifact(String bsn) {
+		String[] result = new String[2];
+		result[0] = groupId;
+		result[1] = bsn;
+		return result;
+	}
 
-    public void setProperties(Map<String, String> map) {
-        if (map.containsKey("groupId")) {
-            groupId = map.get("groupId");
-        }
-    }
+	public void setProperties(Map<String,String> map) {
+		if (map.containsKey("groupId")) {
+			groupId = map.get("groupId");
+		}
+	}
 
-    public void setReporter(Reporter processor) {
-    }
+	public void setReporter(Reporter processor) {}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/MavenRepository.java b/bundleplugin/src/main/java/aQute/bnd/maven/MavenRepository.java
index a5ad200..80a0a4e 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/MavenRepository.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/MavenRepository.java
@@ -13,9 +13,9 @@
 
 	public final static String	NAME	= "name";
 
-	File					root;
-	Reporter				reporter;
-	String					name;
+	File						root;
+	Reporter					reporter;
+	String						name;
 
 	public String toString() {
 		return "maven:" + root;
@@ -31,9 +31,9 @@
 			range = new VersionRange(version);
 
 		List<BsnToMavenPath> plugins = ((Processor) reporter).getPlugins(BsnToMavenPath.class);
-		if ( plugins.isEmpty())
+		if (plugins.isEmpty())
 			plugins.add(this);
-		
+
 		for (BsnToMavenPath cvr : plugins) {
 			String[] paths = cvr.getGroupAndArtifact(bsn);
 			if (paths != null) {
@@ -62,18 +62,16 @@
 				if (Verifier.isVersion(vv)) {
 					Version vvv = new Version(vv);
 					if (range.includes(vvv)) {
-						File file = Processor.getFile(vsdir, v + "/" + artifactId + "-" + v
-								+ ".jar");
+						File file = Processor.getFile(vsdir, v + "/" + artifactId + "-" + v + ".jar");
 						if (file.isFile())
 							result.add(file);
 						else
 							reporter.warning("Expected maven entry was not a valid file %s ", file);
 					}
 				} else {
-					reporter
-							.warning(
-									"Expected a version directory in maven: dir=%s raw-version=%s cleaned-up-version=%s",
-									vsdir, vv, v);
+					reporter.warning(
+							"Expected a version directory in maven: dir=%s raw-version=%s cleaned-up-version=%s",
+							vsdir, vv, v);
 				}
 			}
 		} else
@@ -119,27 +117,27 @@
 	}
 
 	public List<Version> versions(String bsn) throws Exception {
-		
-		File files[] = get( bsn, null);
+
+		File files[] = get(bsn, null);
 		List<Version> versions = new ArrayList<Version>();
-		for ( File f : files ) {
+		for (File f : files) {
 			String version = f.getParentFile().getName();
 			version = Builder.cleanupVersion(version);
-			Version v = new Version( version );
+			Version v = new Version(version);
 			versions.add(v);
 		}
 		return versions;
 	}
 
-	public void setProperties(Map<String, String> map) {
+	public void setProperties(Map<String,String> map) {
 		File home = new File("");
 		String root = map.get("root");
 		if (root == null) {
-			home = new File( System.getProperty("user.home") );
-			this.root = Processor.getFile(home , ".m2/repository").getAbsoluteFile();
+			home = new File(System.getProperty("user.home"));
+			this.root = Processor.getFile(home, ".m2/repository").getAbsoluteFile();
 		} else
 			this.root = Processor.getFile(home, root).getAbsoluteFile();
-		
+
 		if (!this.root.isDirectory()) {
 			reporter.error("Maven repository did not get a proper URL to the repository %s", root);
 		}
@@ -155,21 +153,23 @@
 		String groupId;
 		String artifactId;
 		int n = bsn.indexOf('.');
-		
-		while ( n > 0 ) {
-			artifactId = bsn.substring(n+1);
-			groupId = bsn.substring(0,n);
-			
-			File gdir = new File(root, groupId.replace('.',File.separatorChar)).getAbsoluteFile();
-			File adir = new File( gdir, artifactId).getAbsoluteFile();
-			if ( adir.isDirectory() )
-				return new String[] {groupId, artifactId};
-			
-			n = bsn.indexOf('.',n+1);
+
+		while (n > 0) {
+			artifactId = bsn.substring(n + 1);
+			groupId = bsn.substring(0, n);
+
+			File gdir = new File(root, groupId.replace('.', File.separatorChar)).getAbsoluteFile();
+			File adir = new File(gdir, artifactId).getAbsoluteFile();
+			if (adir.isDirectory())
+				return new String[] {
+						groupId, artifactId
+				};
+
+			n = bsn.indexOf('.', n + 1);
 		}
 		return null;
 	}
-	
+
 	public String getName() {
 		if (name == null) {
 			return toString();
@@ -181,16 +181,16 @@
 		File[] files = get(bsn, range);
 		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;
 	}
 
-	public void setRoot( File f  ) {
+	public void setRoot(File f) {
 		root = f;
 	}
 
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/PomFromManifest.java b/bundleplugin/src/main/java/aQute/bnd/maven/PomFromManifest.java
index 5b8c149..782c282 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/PomFromManifest.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/PomFromManifest.java
@@ -70,11 +70,13 @@
 		this.manifest = manifest;
 	}
 
-	@Override public long lastModified() {
+	@Override
+	public long lastModified() {
 		return 0;
 	}
 
-	@Override public void write(OutputStream out) throws IOException {
+	@Override
+	public void write(OutputStream out) throws IOException {
 		PrintWriter ps = IO.writer(out);
 
 		String name = manifest.getMainAttributes().getValue(Analyzer.BUNDLE_NAME);
@@ -148,8 +150,7 @@
 				String xname = email;
 				String organization = null;
 
-				Matcher m = Pattern.compile("([^@]+)@([\\d\\w\\-_\\.]+)\\.([\\d\\w\\-_\\.]+)")
-						.matcher(email);
+				Matcher m = Pattern.compile("([^@]+)@([\\d\\w\\-_\\.]+)\\.([\\d\\w\\-_\\.]+)").matcher(email);
 				if (m.matches()) {
 					xname = m.group(1);
 					organization = m.group(2);
@@ -167,8 +168,7 @@
 			Tag ls = new Tag(project, "licenses");
 
 			Parameters map = Processor.parseHeader(licenses, null);
-			for (Iterator<Entry<String, Attrs>> e = map.entrySet().iterator(); e
-					.hasNext();) {
+			for (Iterator<Entry<String,Attrs>> e = map.entrySet().iterator(); e.hasNext();) {
 
 				// Bundle-License:
 				// http://www.opensource.org/licenses/apache2.0.php; \
@@ -182,9 +182,9 @@
 				//    <distribution>repo</distribution>
 				//    </license>
 
-				Entry<String, Attrs> entry = e.next();
+				Entry<String,Attrs> entry = e.next();
 				Tag l = new Tag(ls, "license");
-				Map<String, String> values = entry.getValue();
+				Map<String,String> values = entry.getValue();
 				String url = entry.getKey();
 
 				if (values.containsKey("description"))
@@ -209,8 +209,7 @@
 	 * @param tag
 	 * @param object
 	 */
-	private Tag tagFromMap(Tag parent, Map<String, String> values, String string, String tag,
-			String object) {
+	private Tag tagFromMap(Tag parent, Map<String,String> values, String string, String tag, String object) {
 		String value = values.get(string);
 		if (value == null)
 			value = object;
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/PomParser.java b/bundleplugin/src/main/java/aQute/bnd/maven/PomParser.java
index e529141..12c2edc 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/PomParser.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/PomParser.java
@@ -12,22 +12,21 @@
 import aQute.lib.osgi.*;
 
 /**
- * Provides a way to parse a maven pom as properties.
- * 
- * This provides most of the maven elements as properties. It also
- * provides pom.scope.[compile|test|runtime|provided|system] properties
- * that can be appended to the build and run path. That is, they are
- * in the correct format for this.
+ * Provides a way to parse a maven pom as properties. This provides most of the
+ * maven elements as properties. It also provides
+ * pom.scope.[compile|test|runtime|provided|system] properties that can be
+ * appended to the build and run path. That is, they are in the correct format
+ * for this.
  */
 public class PomParser extends Processor {
 	static DocumentBuilderFactory	dbf			= DocumentBuilderFactory.newInstance();
 	static XPathFactory				xpathf		= XPathFactory.newInstance();
 	static Set<String>				multiple	= new HashSet<String>();
-	static Set<String>				skip	= new HashSet<String>();
+	static Set<String>				skip		= new HashSet<String>();
 
 	static {
 		dbf.setNamespaceAware(false);
-		
+
 		// Set all elements that need enumeration of their elements
 		// these will not use the name of the subelement but instead
 		// they use an index from 0..n
@@ -46,7 +45,7 @@
 		skip.add("dependencies");
 		skip.add("reporting");
 		skip.add("extensions");
-		
+
 	}
 
 	public Properties getProperties(File pom) throws Exception {
@@ -58,7 +57,7 @@
 
 		// Check if there is a parent pom
 		String relativePath = xpath.evaluate("project/parent/relativePath", doc);
-		if (relativePath != null && relativePath.length()!=0) {
+		if (relativePath != null && relativePath.length() != 0) {
 			File parentPom = IO.getFile(pom.getParentFile(), relativePath);
 			if (parentPom.isFile()) {
 				Properties parentProps = getProperties(parentPom);
@@ -71,15 +70,16 @@
 		Element e = doc.getDocumentElement();
 		traverse("pom", e, p);
 
-		String scopes[] = { "provided", "runtime", "test", "system" };
+		String scopes[] = {
+				"provided", "runtime", "test", "system"
+		};
 		NodeList set = (NodeList) xpath.evaluate("//dependency[not(scope) or scope='compile']", doc,
 				XPathConstants.NODESET);
 		if (set.getLength() != 0)
 			p.put("pom.scope.compile", toBsn(set));
 
 		for (String scope : scopes) {
-			set = (NodeList) xpath.evaluate("//dependency[scope='" + scope + "']", doc,
-					XPathConstants.NODESET);
+			set = (NodeList) xpath.evaluate("//dependency[scope='" + scope + "']", doc, XPathConstants.NODESET);
 			if (set.getLength() != 0)
 				p.put("pom.scope." + scope, toBsn(set));
 		}
@@ -98,9 +98,9 @@
 			sb.append(xpath.evaluate("groupId", child));
 			sb.append(".");
 			sb.append(xpath.evaluate("artifactId", child));
-			if (version != null && version.trim().length()!=0) {
+			if (version != null && version.trim().length() != 0) {
 				sb.append(";version=");
-				sb.append( Analyzer.cleanupVersion(version));
+				sb.append(Analyzer.cleanupVersion(version));
 			}
 			del = ", ";
 		}
@@ -108,15 +108,17 @@
 	}
 
 	/**
-	 * The maven POM is quite straightforward, it is basically a structured property file.
+	 * The maven POM is quite straightforward, it is basically a structured
+	 * property file.
+	 * 
 	 * @param name
 	 * @param parent
 	 * @param p
 	 */
 	static void traverse(String name, Node parent, Properties p) {
-		if ( skip.contains(parent.getNodeName()))
+		if (skip.contains(parent.getNodeName()))
 			return;
-		
+
 		NodeList children = parent.getChildNodes();
 		if (multiple.contains(parent.getNodeName())) {
 			int n = 0;
@@ -132,7 +134,7 @@
 				Node child = children.item(i);
 				if (child instanceof Text) {
 					String value = child.getNodeValue().trim();
-					if (value.length()!=0) {
+					if (value.length() != 0) {
 						p.put(name, value);
 					}
 				} else {
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/PomResource.java b/bundleplugin/src/main/java/aQute/bnd/maven/PomResource.java
index 416062d..b722d0f 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/PomResource.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/PomResource.java
@@ -13,18 +13,20 @@
 
 public class PomResource extends WriteResource {
 	final Manifest				manifest;
-	private Map<String, String>	scm;
+	private Map<String,String>	scm;
 	final static Pattern		NAME_URL	= Pattern.compile("(.*)(http://.*)");
 
 	public PomResource(Manifest manifest) {
 		this.manifest = manifest;
 	}
 
-	@Override public long lastModified() {
+	@Override
+	public long lastModified() {
 		return 0;
 	}
 
-	@Override public void write(OutputStream out) throws IOException {
+	@Override
+	public void write(OutputStream out) throws IOException {
 		PrintWriter ps = IO.writer(out);
 
 		String name = manifest.getMainAttributes().getValue(Analyzer.BUNDLE_NAME);
@@ -80,7 +82,7 @@
 
 		if (scm != null) {
 			Tag scm = new Tag(project, "scm");
-			for (Map.Entry<String, String> e : this.scm.entrySet()) {
+			for (Map.Entry<String,String> e : this.scm.entrySet()) {
 				new Tag(scm, e.getKey()).addContent(e.getValue());
 			}
 		}
@@ -103,8 +105,7 @@
 			Tag ls = new Tag(project, "licenses");
 
 			Parameters map = Processor.parseHeader(licenses, null);
-			for (Iterator<Entry<String, Attrs>> e = map.entrySet().iterator(); e
-					.hasNext();) {
+			for (Iterator<Entry<String,Attrs>> e = map.entrySet().iterator(); e.hasNext();) {
 
 				// Bundle-License:
 				// http://www.opensource.org/licenses/apache2.0.php; \
@@ -118,9 +119,9 @@
 				//    <distribution>repo</distribution>
 				//    </license>
 
-				Entry<String, Attrs> entry = e.next();
+				Entry<String,Attrs> entry = e.next();
 				Tag l = new Tag(ls, "license");
-				Map<String, String> values = entry.getValue();
+				Map<String,String> values = entry.getValue();
 				String url = entry.getKey();
 
 				if (values.containsKey("description"))
@@ -145,8 +146,7 @@
 	 * @param tag
 	 * @param object
 	 */
-	private Tag tagFromMap(Tag parent, Map<String, String> values, String string, String tag,
-			String object) {
+	private Tag tagFromMap(Tag parent, Map<String,String> values, String string, String tag, String object) {
 		String value = values.get(string);
 		if (value == null)
 			value = object;
@@ -156,7 +156,7 @@
 		return parent;
 	}
 
-	public void setProperties(Map<String, String> scm) {
+	public void setProperties(Map<String,String> scm) {
 		this.scm = scm;
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/support/CachedPom.java b/bundleplugin/src/main/java/aQute/bnd/maven/support/CachedPom.java
index 02449fa..5787e29 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/support/CachedPom.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/support/CachedPom.java
@@ -4,7 +4,7 @@
 import java.net.*;
 
 public class CachedPom extends Pom {
-	final MavenEntry				maven;
+	final MavenEntry	maven;
 
 	CachedPom(MavenEntry mavenEntry, URI repo) throws Exception {
 		super(mavenEntry.maven, mavenEntry.getPomFile(), repo);
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/support/Maven.java b/bundleplugin/src/main/java/aQute/bnd/maven/support/Maven.java
index 2124a05..416f255 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/support/Maven.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/support/Maven.java
@@ -12,25 +12,27 @@
  */
 public class Maven {
 	final File						userHome	= new File(System.getProperty("user.home"));
-	final Map<String, MavenEntry>	entries		= new ConcurrentHashMap<String, MavenEntry>();
-	final static String[]			ALGORITHMS	= { "md5", "sha1" };
+	final Map<String,MavenEntry>	entries		= new ConcurrentHashMap<String,MavenEntry>();
+	final static String[]			ALGORITHMS	= {
+			"md5", "sha1"
+												};
 	boolean							usecache	= false;
 	final Executor					executor;
 	File							m2			= new File(userHome, ".m2");
 	File							repository	= new File(m2, "repository");
 
 	public Maven(Executor executor) {
-		if ( executor == null)
+		if (executor == null)
 			this.executor = Executors.newCachedThreadPool();
 		else
 			this.executor = executor;
 	}
-	
-	//http://repo1.maven.org/maven2/junit/junit/maven-metadata.xml
-	
-	static Pattern MAVEN_RANGE = Pattern.compile("(\\[|\\()(.+)(,(.+))(\\]|\\))");
-	public CachedPom getPom(String groupId, String artifactId, String version, URI... extra)
-			throws Exception {		
+
+	// http://repo1.maven.org/maven2/junit/junit/maven-metadata.xml
+
+	static Pattern	MAVEN_RANGE	= Pattern.compile("(\\[|\\()(.+)(,(.+))(\\]|\\))");
+
+	public CachedPom getPom(String groupId, String artifactId, String version, URI... extra) throws Exception {
 		MavenEntry entry = getEntry(groupId, artifactId, version);
 		return entry.getPom(extra);
 	}
@@ -59,8 +61,7 @@
 	}
 
 	private String path(String groupId, String artifactId, String version) {
-		return groupId.replace('.', '/') + '/' + artifactId + '/' + version + "/" + artifactId
-				+ "-" + version;
+		return groupId.replace('.', '/') + '/' + artifactId + '/' + version + "/" + artifactId + "-" + version;
 	}
 
 	public void schedule(Runnable runnable) {
@@ -82,7 +83,7 @@
 
 	public void setM2(File dir) {
 		this.m2 = dir;
-		this.repository = new File(dir,"repository");
+		this.repository = new File(dir, "repository");
 	}
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenEntry.java b/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenEntry.java
index 60ebb63..fd4459a 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenEntry.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenEntry.java
@@ -13,7 +13,6 @@
 /**
  * An entry (a group/artifact) in the maven cache in the .m2/repository
  * directory. It provides methods to get the pom and the artifact.
- * 
  */
 public class MavenEntry implements Closeable {
 	final Maven					maven;
@@ -21,7 +20,7 @@
 	final File					dir;
 	final String				path;
 	final DirectoryLock			lock;
-	final Map<URI, CachedPom>	poms	= new HashMap<URI, CachedPom>();
+	final Map<URI,CachedPom>	poms	= new HashMap<URI,CachedPom>();
 	final File					pomFile;
 	final File					artifactFile;
 	final String				pomPath;
@@ -57,7 +56,6 @@
 	 * @param urls
 	 *            The allowed URLs
 	 * @return a CachedPom for this maven entry
-	 * 
 	 * @throws Exception
 	 *             If something goes haywire
 	 */
@@ -124,7 +122,8 @@
 				}
 			}
 			return null;
-		} finally {
+		}
+		finally {
 			saveProperties();
 			// lock.release();
 		}
@@ -143,12 +142,13 @@
 	private boolean download(URI repo, String path) throws MalformedURLException {
 		try {
 			URL url = toURL(repo, path);
-			System.err.println("Downloading "  + repo + " path " + path + " url " + url);
+			System.err.println("Downloading " + repo + " path " + path + " url " + url);
 			File file = new File(root, path);
 			IO.copy(url.openStream(), file);
-			System.err.println("Downloaded "  + url);
+			System.err.println("Downloaded " + url);
 			return true;
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			System.err.println("debug: " + e);
 			return false;
 		}
@@ -162,7 +162,6 @@
 	 * @param path
 	 *            The path in the directory + url
 	 * @return a URL that points to the file in the repo
-	 * 
 	 * @throws MalformedURLException
 	 */
 	URL toURL(URI base, String path) throws MalformedURLException {
@@ -181,8 +180,7 @@
 	 * @return true if valid
 	 */
 	private boolean isValid() {
-		return pomFile.isFile() && pomFile.length() > 100 && artifactFile.isFile()
-				&& artifactFile.length() > 100;
+		return pomFile.isFile() && pomFile.length() > 100 && artifactFile.isFile() && artifactFile.length() > 100;
 	}
 
 	/**
@@ -211,9 +209,11 @@
 				try {
 					in = new FileInputStream(props);
 					properties.load(in);
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					// we ignore for now, will handle it on safe
-				} finally {
+				}
+				finally {
 					IO.close(in);
 				}
 			}
@@ -238,7 +238,8 @@
 			FileOutputStream fout = new FileOutputStream(propertiesFile);
 			try {
 				properties.store(fout, "");
-			} finally {
+			}
+			finally {
 				properties = null;
 				propertiesChanged = false;
 				fout.close();
@@ -298,11 +299,13 @@
 			File digestFile = new File(root, digestPath);
 			final MessageDigest md = MessageDigest.getInstance(algorithm);
 			IO.copy(actualFile, new OutputStream() {
-				@Override public void write(int c) throws IOException {
+				@Override
+				public void write(int c) throws IOException {
 					md.update((byte) c);
 				}
 
-				@Override public void write(byte[] buffer, int offset, int length) {
+				@Override
+				public void write(byte[] buffer, int offset, int length) {
 					md.update(buffer, offset, length);
 				}
 			});
@@ -319,7 +322,7 @@
 	}
 
 	public File getArtifact() throws Exception {
-		if (artifact == null )
+		if (artifact == null)
 			return artifactFile;
 		return artifact.get();
 	}
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenRemoteRepository.java b/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenRemoteRepository.java
index a9f0ba2..d1c0472 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenRemoteRepository.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/support/MavenRemoteRepository.java
@@ -21,23 +21,24 @@
 		if (f == null)
 			return null;
 
-		return new File[] { f };
+		return new File[] {
+			f
+		};
 	}
 
-	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 {
 		String groupId = null;
-		
+
 		if (properties != null)
 			groupId = properties.get("groupId");
-		
+
 		if (groupId == null) {
 			int n = bsn.indexOf('+');
-			if ( n < 0)
+			if (n < 0)
 				return null;
-			
-			groupId = bsn.substring(0,n);
-			bsn = bsn.substring(n+1);
+
+			groupId = bsn.substring(0, n);
+			bsn = bsn.substring(n + 1);
 		}
 
 		String artifactId = bsn;
@@ -59,15 +60,16 @@
 		try {
 			action = Pom.Scope.valueOf(value);
 			return pom.getLibrary(action, repositories);
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			return pom.getArtifact();
 		}
 	}
 
 	public Maven getMaven() {
-		if ( maven != null)
+		if (maven != null)
 			return maven;
-		
+
 		maven = registry.getPlugin(Maven.class);
 		return maven;
 	}
@@ -96,7 +98,7 @@
 		repositories = urls;
 	}
 
-	public void setProperties(Map<String, String> map) {
+	public void setProperties(Map<String,String> map) {
 		String repoString = map.get("repositories");
 		if (repoString != null) {
 			String[] repos = repoString.split("\\s*,\\s*");
@@ -105,10 +107,11 @@
 			for (String repo : repos) {
 				try {
 					URI uri = new URI(repo);
-					if ( !uri.isAbsolute())
-						uri = IO.getFile( new File(""),repo).toURI();
+					if (!uri.isAbsolute())
+						uri = IO.getFile(new File(""), repo).toURI();
 					repositories[n++] = uri;
-				} catch (Exception e) {
+				}
+				catch (Exception e) {
 					if (reporter != null)
 						reporter.error("Invalid repository %s for maven plugin, %s", repo, e);
 				}
@@ -129,9 +132,9 @@
 	}
 
 	public String getLocation() {
-		if ( repositories == null || repositories.length==0)
+		if (repositories == null || repositories.length == 0)
 			return "maven central";
-		
-		return Arrays.toString(repositories); 
+
+		return Arrays.toString(repositories);
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/support/Pom.java b/bundleplugin/src/main/java/aQute/bnd/maven/support/Pom.java
index 30a3378..0055d19 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/support/Pom.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/support/Pom.java
@@ -18,19 +18,19 @@
 	static {
 		dbf.setNamespaceAware(false);
 	}
-	
+
 	public enum Scope {
 		compile, runtime, system, import_, provided, test, ;
-		
-//		private boolean includes(Scope other) {
-//			if (other == this) return true;
-//			switch (this) {
-//			case compile:
-//				return other == provided || other == test;
-//			default:
-//				return false;
-//			}
-//		}
+
+		// private boolean includes(Scope other) {
+		// if (other == this) return true;
+		// switch (this) {
+		// case compile:
+		// return other == provided || other == test;
+		// default:
+		// return false;
+		// }
+		// }
 	}
 
 	final Maven			maven;
@@ -41,7 +41,7 @@
 	String				version;
 	List<Dependency>	dependencies	= new ArrayList<Dependency>();
 	File				pomFile;
-	String				description="";
+	String				description		= "";
 	String				name;
 
 	public String getDescription() {
@@ -88,6 +88,7 @@
 		public Pom getPom() throws Exception {
 			return maven.getPom(groupId, artifactId, version);
 		}
+
 		@Override
 		public String toString() {
 			StringBuilder builder = new StringBuilder();
@@ -129,16 +130,15 @@
 		this.artifactId = replace(xp.evaluate("project/artifactId", doc).trim(), this.artifactId);
 		this.groupId = replace(xp.evaluate("project/groupId", doc).trim(), this.groupId);
 		this.version = replace(xp.evaluate("project/version", doc).trim(), this.version);
-		
+
 		String nextDescription = xp.evaluate("project/description", doc).trim();
-		if ( this.description.length() != 0 && nextDescription.length() != 0)
+		if (this.description.length() != 0 && nextDescription.length() != 0)
 			this.description += "\n";
 		this.description += replace(nextDescription);
-		
+
 		this.name = replace(xp.evaluate("project/name", doc).trim(), this.name);
 
-		NodeList list = (NodeList) xp.evaluate("project/dependencies/dependency", doc,
-				XPathConstants.NODESET);
+		NodeList list = (NodeList) xp.evaluate("project/dependencies/dependency", doc, XPathConstants.NODESET);
 		for (int i = 0; i < list.getLength(); i++) {
 			Node node = list.item(i);
 			Dependency dep = new Dependency();
@@ -157,8 +157,7 @@
 			dep.version = replace(xp.evaluate("version", node).trim());
 			dependencies.add(dep);
 
-			NodeList exclusions = (NodeList) xp
-					.evaluate("exclusions", node, XPathConstants.NODESET);
+			NodeList exclusions = (NodeList) xp.evaluate("exclusions", node, XPathConstants.NODESET);
 			for (int e = 0; e < exclusions.getLength(); e++) {
 				Node exc = exclusions.item(e);
 				String exclGroupId = xp.evaluate("groupId", exc).trim();
@@ -170,9 +169,9 @@
 	}
 
 	private String replace(String key, String dflt) {
-		if ( key == null || key.length() == 0)
+		if (key == null || key.length() == 0)
 			return dflt;
-		
+
 		return replace(key);
 	}
 
@@ -185,7 +184,7 @@
 	}
 
 	public String getVersion() throws Exception {
-		if ( version == null)
+		if (version == null)
 			return "<not set>";
 		return replace(version);
 	}
@@ -205,8 +204,7 @@
 		final Dependency	dependency;
 
 		public boolean excludes(String name) {
-			return dependency.exclusions.contains(name) && previous != null
-					&& previous.excludes(name);
+			return dependency.exclusions.contains(name) && previous != null && previous.excludes(name);
 		}
 	}
 
@@ -229,7 +227,7 @@
 
 			if (rover.excludes(name) || dep.optional)
 				continue;
-			
+
 			if (dep.scope == scope && !dep.optional) {
 				try {
 					Pom sub = maven.getPom(groupId, artifactId, version, urls);
@@ -240,35 +238,35 @@
 								queue.add(new Rover(rover, subd));
 							}
 						}
-					} else
-						if (rover.previous != null)
-							System.err.println("Cannot find " + dep + " from "
-									+ rover.previous.dependency);
-						else
-							System.err.println("Cannot find " + dep + " from top");
-				} catch (Exception e) {
+					} else if (rover.previous != null)
+						System.err.println("Cannot find " + dep + " from " + rover.previous.dependency);
+					else
+						System.err.println("Cannot find " + dep + " from top");
+				}
+				catch (Exception e) {
 					if (rover.previous != null)
-						System.err.println("Cannot find " + dep + " from "
-								+ rover.previous.dependency);
+						System.err.println("Cannot find " + dep + " from " + rover.previous.dependency);
 					else
 						System.err.println("Cannot find " + dep + " from top");
 
-//			boolean include = false;
-//			if (dep.scope == Scope.compile) {
-//				include = true;
-//			} else if (dep.scope == Scope.test) {
-//				include = rover.previous == null && (action == Action.compile || action == Action.test);
-//			} else if (dep.scope == Scope.runtime) {
-//				include = action == Action.run;
-//			}
-//			if (include) {
-//				Pom sub = maven.getPom(groupId, artifactId, version, urls);
-//				if (!result.contains(sub)) {
-//					result.add(sub);
-//					for (Dependency subd : sub.dependencies) {
-//						queue.add(new Rover(rover, subd));
-//					}
-					
+					// boolean include = false;
+					// if (dep.scope == Scope.compile) {
+					// include = true;
+					// } else if (dep.scope == Scope.test) {
+					// include = rover.previous == null && (action ==
+					// Action.compile || action == Action.test);
+					// } else if (dep.scope == Scope.runtime) {
+					// include = action == Action.run;
+					// }
+					// if (include) {
+					// Pom sub = maven.getPom(groupId, artifactId, version,
+					// urls);
+					// if (!result.contains(sub)) {
+					// result.add(sub);
+					// for (Dependency subd : sub.dependencies) {
+					// queue.add(new Rover(rover, subd));
+					// }
+
 				}
 			}
 		}
@@ -281,8 +279,7 @@
 			return "null";
 
 		in = in.trim();
-		if ("${pom.version}".equals(in) || "${version}".equals(in)
-				|| "${project.version}".equals(in))
+		if ("${pom.version}".equals(in) || "${version}".equals(in) || "${project.version}".equals(in))
 			return version;
 
 		if ("${basedir}".equals(in))
@@ -318,7 +315,8 @@
 			for (Pom dep : getDependencies(action, repositories)) {
 				doEntry(writer, dep);
 			}
-		} finally {
+		}
+		finally {
 			writer.close();
 		}
 		return file;
diff --git a/bundleplugin/src/main/java/aQute/bnd/maven/support/ProjectPom.java b/bundleplugin/src/main/java/aQute/bnd/maven/support/ProjectPom.java
index 069acb9..6a8130c 100644
--- a/bundleplugin/src/main/java/aQute/bnd/maven/support/ProjectPom.java
+++ b/bundleplugin/src/main/java/aQute/bnd/maven/support/ProjectPom.java
@@ -13,20 +13,21 @@
 
 public class ProjectPom extends Pom {
 
-	final List<URI>	repositories	= new ArrayList<URI>();
+	final List<URI>		repositories	= new ArrayList<URI>();
 	final Properties	properties		= new Properties();
-	String 		packaging;
-	String 		url;
-	
+	String				packaging;
+	String				url;
+
 	ProjectPom(Maven maven, File pomFile) throws Exception {
 		super(maven, pomFile, pomFile.toURI());
 	}
 
-	@Override protected void parse(Document doc, XPath xp) throws Exception {
+	@Override
+	protected void parse(Document doc, XPath xp) throws Exception {
 
 		packaging = xp.evaluate("project/packaging", doc);
 		url = xp.evaluate("project/url", doc);
-		
+
 		Node parent = (Node) xp.evaluate("project/parent", doc, XPathConstants.NODE);
 		if (parent != null && parent.hasChildNodes()) {
 			File parentFile = IO.getFile(getPomFile().getParentFile(), "../pom.xml");
@@ -35,20 +36,20 @@
 			String parentArtifactId = xp.evaluate("artifactId", parent).trim();
 			String parentVersion = xp.evaluate("version", parent).trim();
 			String parentPath = xp.evaluate("relativePath", parent).trim();
-			if (parentPath != null && parentPath.length()!=0) {
+			if (parentPath != null && parentPath.length() != 0) {
 				parentFile = IO.getFile(getPomFile().getParentFile(), parentPath);
 			}
 			if (parentFile.isFile()) {
 				ProjectPom parentPom = new ProjectPom(maven, parentFile);
 				parentPom.parse();
 				dependencies.addAll(parentPom.dependencies);
-				for ( Enumeration<?> e = parentPom.properties.propertyNames(); e.hasMoreElements(); ) {
+				for (Enumeration< ? > e = parentPom.properties.propertyNames(); e.hasMoreElements();) {
 					String key = (String) e.nextElement();
-					if ( ! properties.contains(key))
+					if (!properties.contains(key))
 						properties.put(key, parentPom.properties.get(key));
 				}
 				repositories.addAll(parentPom.repositories);
-				
+
 				setNames(parentPom);
 			} else {
 				// This seems to be a bit bizarre, extending an external pom?
@@ -58,42 +59,40 @@
 			}
 		}
 
-		NodeList propNodes = (NodeList) xp.evaluate("project/properties/*", doc,
-				XPathConstants.NODESET);
+		NodeList propNodes = (NodeList) xp.evaluate("project/properties/*", doc, XPathConstants.NODESET);
 		for (int i = 0; i < propNodes.getLength(); i++) {
 			Node node = propNodes.item(i);
 			String key = node.getNodeName();
 			String value = node.getTextContent();
-			if ( key == null || key.length()==0)
+			if (key == null || key.length() == 0)
 				throw new IllegalArgumentException("Pom has an empty or null key");
-			if ( value == null || value.length()==0)
+			if (value == null || value.length() == 0)
 				throw new IllegalArgumentException("Pom has an empty or null value for property " + key);
 			properties.setProperty(key, value.trim());
 		}
 
-		NodeList repos = (NodeList) xp.evaluate("project/repositories/repository/url", doc,
-				XPathConstants.NODESET);
+		NodeList repos = (NodeList) xp.evaluate("project/repositories/repository/url", doc, XPathConstants.NODESET);
 		for (int i = 0; i < repos.getLength(); i++) {
 			Node node = repos.item(i);
 			String URIString = node.getTextContent().trim();
 			URI uri = new URI(URIString);
-			if ( uri.getScheme() ==null )
-				uri = IO.getFile(pomFile.getParentFile(),URIString).toURI();
+			if (uri.getScheme() == null)
+				uri = IO.getFile(pomFile.getParentFile(), URIString).toURI();
 			repositories.add(uri);
 		}
 
 		super.parse(doc, xp);
 	}
 
-//	private void print(Node node, String indent) {
-//		System.err.print(indent);
-//		System.err.println(node.getNodeName());
-//		Node rover = node.getFirstChild();
-//		while ( rover != null) {
-//			print( rover, indent+" ");
-//			rover = rover.getNextSibling();
-//		}
-//	}
+	// private void print(Node node, String indent) {
+	// System.err.print(indent);
+	// System.err.println(node.getNodeName());
+	// Node rover = node.getFirstChild();
+	// while ( rover != null) {
+	// print( rover, indent+" ");
+	// rover = rover.getNextSibling();
+	// }
+	// }
 
 	/**
 	 * @param parentArtifactId
@@ -102,17 +101,17 @@
 	 * @throws Exception
 	 */
 	private void setNames(Pom pom) throws Exception {
-		if (artifactId == null || artifactId.length()==0)
+		if (artifactId == null || artifactId.length() == 0)
 			artifactId = pom.getArtifactId();
-		if (groupId == null || groupId.length()==0)
+		if (groupId == null || groupId.length() == 0)
 			groupId = pom.getGroupId();
-		if (version == null || version.length()==0)
+		if (version == null || version.length() == 0)
 			version = pom.getVersion();
-		if ( description == null )
+		if (description == null)
 			description = pom.getDescription();
 		else
 			description = pom.getDescription() + "\n" + description;
-	
+
 	}
 
 	static class Rover {
@@ -126,8 +125,7 @@
 		final Dependency	dependency;
 
 		public boolean excludes(String name) {
-			return dependency.exclusions.contains(name) && previous != null
-					&& previous.excludes(name);
+			return dependency.exclusions.contains(name) && previous != null && previous.excludes(name);
 		}
 	}
 
@@ -140,7 +138,7 @@
 
 	protected String replace(String in) {
 		System.err.println("Replce: " + in);
-		if ( in == null) {
+		if (in == null) {
 			System.err.println("null??");
 		}
 		Matcher matcher = MACRO.matcher(in);
@@ -148,18 +146,18 @@
 		StringBuilder sb = new StringBuilder();
 		while (matcher.find()) {
 			int n = matcher.start();
-			sb.append( in, last, n);
+			sb.append(in, last, n);
 			String replacement = get(matcher.group(2));
-			if ( replacement == null )
-				sb.append( matcher.group(1));
+			if (replacement == null)
+				sb.append(matcher.group(1));
 			else
-				sb.append( replacement );
+				sb.append(replacement);
 			last = matcher.end();
 		}
-		if ( last == 0)
+		if (last == 0)
 			return in;
-		
-		sb.append( in, last, in.length());
+
+		sb.append(in, last, in.length());
 		return sb.toString();
 	}
 
@@ -170,14 +168,14 @@
 			return groupId;
 		if (key.equals("pom.version"))
 			return version;
-		
+
 		if (key.equals("pom.name"))
 			return name;
-		
+
 		String prop = properties.getProperty(key);
-		if ( prop != null )
+		if (prop != null)
 			return prop;
-		
+
 		return System.getProperty(key);
 	}
 
@@ -198,7 +196,8 @@
 		return replace(s);
 	}
 
-	@Override public File getArtifact() throws Exception {
+	@Override
+	public File getArtifact() throws Exception {
 		return null;
 	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/repo/eclipse/EclipseRepo.java b/bundleplugin/src/main/java/aQute/bnd/repo/eclipse/EclipseRepo.java
index 312825e..a54fc7e 100644
--- a/bundleplugin/src/main/java/aQute/bnd/repo/eclipse/EclipseRepo.java
+++ b/bundleplugin/src/main/java/aQute/bnd/repo/eclipse/EclipseRepo.java
@@ -14,186 +14,181 @@
 import aQute.libg.version.*;
 
 public class EclipseRepo implements Plugin, RepositoryPlugin {
-    File                             root;
-    Reporter                         reporter;
-    String                           name;
-    Parameters index;
+	File						root;
+	Reporter					reporter;
+	String						name;
+	Parameters					index;
 
-    public final static String             LOCATION = "location";
-    public final static String             NAME     = "name";
+	public final static String	LOCATION	= "location";
+	public final static String	NAME		= "name";
 
-    public void setProperties(Map<String, String> map) {
-        String location = map.get(LOCATION);
-        if (location == null)
-            throw new IllegalArgumentException(
-                    "Location muse be set on a EclipseRepo plugin");
+	public void setProperties(Map<String,String> map) {
+		String location = map.get(LOCATION);
+		if (location == null)
+			throw new IllegalArgumentException("Location muse be set on a EclipseRepo plugin");
 
-        root = new File(location);
-        if (!root.isDirectory())
-            throw new IllegalArgumentException(
-                    "Repository is not a valid directory " + root);
+		root = new File(location);
+		if (!root.isDirectory())
+			throw new IllegalArgumentException("Repository is not a valid directory " + root);
 
-        if (!new File(root, "plugins").isDirectory())
-            throw new IllegalArgumentException(
-                    "Repository is not a valid directory (no plugins directory)"
-                            + root);
+		if (!new File(root, "plugins").isDirectory())
+			throw new IllegalArgumentException("Repository is not a valid directory (no plugins directory)" + root);
 
-        name = map.get(NAME);
+		name = map.get(NAME);
 
-        try {
-            index = buildIndex();
-        } catch (Exception e) {
-            throw new RuntimeException(
-                    "Could not build index for eclipse repo: " + root);
-        }
-    }
+		try {
+			index = buildIndex();
+		}
+		catch (Exception e) {
+			throw new RuntimeException("Could not build index for eclipse repo: " + root);
+		}
+	}
 
-    Parameters buildIndex() throws Exception {
-        File index = new File(root, "bnd.index").getAbsoluteFile();
-        File[] plugins = new File(root, "plugins").listFiles();
+	Parameters buildIndex() throws Exception {
+		File index = new File(root, "bnd.index").getAbsoluteFile();
+		File[] plugins = new File(root, "plugins").listFiles();
 
-        for (File f : plugins) {
-            f = f.getAbsoluteFile();
-            if (f.isFile()) {
-                if (f.lastModified() > index.lastModified()) {
+		for (File f : plugins) {
+			f = f.getAbsoluteFile();
+			if (f.isFile()) {
+				if (f.lastModified() > index.lastModified()) {
 
-                    Parameters map = buildIndex(plugins);
-                    write(index, map);
-                    return map;
-                }
-            }
-        }
+					Parameters map = buildIndex(plugins);
+					write(index, map);
+					return map;
+				}
+			}
+		}
 
-        String s = read(index);
-        return Processor.parseHeader(s, null);
-    }
+		String s = read(index);
+		return Processor.parseHeader(s, null);
+	}
 
-    private String read(File index) throws Exception {
-        if (index.isFile()) {
-            BufferedReader fr = IO.reader(index);
-            StringBuilder sb = new StringBuilder();
+	private String read(File index) throws Exception {
+		if (index.isFile()) {
+			BufferedReader fr = IO.reader(index);
+			StringBuilder sb = new StringBuilder();
 
-            try {
-                String s = fr.readLine();
-                while (s != null) {
-                    sb.append(s);
-                    s = fr.readLine();
-                }
-            } finally {
-                fr.close();
-            }
-        }
-        return null;
-    }
+			try {
+				String s = fr.readLine();
+				while (s != null) {
+					sb.append(s);
+					s = fr.readLine();
+				}
+			}
+			finally {
+				fr.close();
+			}
+		}
+		return null;
+	}
 
-    private void write(File index, Map<String, ? extends Map<String, String>> map)
-            throws Exception {
-        String s = Processor.printClauses(map);
-        index.getParentFile().mkdirs();
-        PrintWriter fw = IO.writer(index);
-        try {
-            fw.write(s);
-        } finally {
-            fw.close();
-        }
-    }
+	private void write(File index, Map<String, ? extends Map<String,String>> map) throws Exception {
+		String s = Processor.printClauses(map);
+		index.getParentFile().mkdirs();
+		PrintWriter fw = IO.writer(index);
+		try {
+			fw.write(s);
+		}
+		finally {
+			fw.close();
+		}
+	}
 
-    private Parameters buildIndex(File[] plugins) {
-        Parameters map = new Parameters();
-        for (File plugin : plugins) {
-            try {
-                Jar jar = new Jar(plugin);
-                Manifest manifest = jar.getManifest();
-                String bsn = manifest.getMainAttributes().getValue(
-                        Constants.BUNDLE_SYMBOLICNAME);
-                String version = manifest.getMainAttributes().getValue(
-                        Constants.BUNDLE_VERSION);
+	private Parameters buildIndex(File[] plugins) {
+		Parameters map = new Parameters();
+		for (File plugin : plugins) {
+			try {
+				Jar jar = new Jar(plugin);
+				Manifest manifest = jar.getManifest();
+				String bsn = manifest.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
+				String version = manifest.getMainAttributes().getValue(Constants.BUNDLE_VERSION);
 
-                if (bsn != null) {
-                    if (version == null)
-                        version = "0";
+				if (bsn != null) {
+					if (version == null)
+						version = "0";
 
-                    Map<String, String> instance = map.get(bsn);
-                    if (instance == null) {
-                        instance = Create.map();
-                    }
-                    instance.put(version, plugin.getAbsolutePath());
-                }
-            } catch (Exception e) {
-                // Ignore exceptions in the plugins dir.
-            }
-        }
-        return map;
-    }
+					Map<String,String> instance = map.get(bsn);
+					if (instance == null) {
+						instance = Create.map();
+					}
+					instance.put(version, plugin.getAbsolutePath());
+				}
+			}
+			catch (Exception e) {
+				// Ignore exceptions in the plugins dir.
+			}
+		}
+		return map;
+	}
 
-    public void setReporter(Reporter reporter) {
-        this.reporter = reporter;
-    }
+	public void setReporter(Reporter reporter) {
+		this.reporter = reporter;
+	}
 
-    public boolean canWrite() {
-        return false;
-    }
+	public boolean canWrite() {
+		return false;
+	}
 
-    public File[] get(String bsn, String range) throws Exception {
-        VersionRange r = new VersionRange(range);
-        Map<String, String> instances = index.get(bsn);
-        if (instances == null)
-            return null;
+	public File[] get(String bsn, String range) throws Exception {
+		VersionRange r = new VersionRange(range);
+		Map<String,String> instances = index.get(bsn);
+		if (instances == null)
+			return null;
 
-        List<File> result = Create.list();
+		List<File> result = Create.list();
 
-        for (Entry<String, String> entry : instances.entrySet()) {
-            if (r.includes(new Version(entry.getKey()))) {
-                File f = new File(entry.getValue());
-                if (f.isFile()) {
-                    result.add(f);
-                }
-            }
-        }
-        return result.toArray(new File[result.size()]);
-    }
+		for (Entry<String,String> entry : instances.entrySet()) {
+			if (r.includes(new Version(entry.getKey()))) {
+				File f = new File(entry.getValue());
+				if (f.isFile()) {
+					result.add(f);
+				}
+			}
+		}
+		return result.toArray(new File[result.size()]);
+	}
 
-    public String getName() {
-        return name;
-    }
+	public String getName() {
+		return name;
+	}
 
-    public List<String> list(String regex) {
-        Instruction pattern = null;
-        if (regex != null)
-            pattern = new Instruction(regex);
+	public List<String> list(String regex) {
+		Instruction pattern = null;
+		if (regex != null)
+			pattern = new Instruction(regex);
 
-        List<String> result = new ArrayList<String>();
-        for (String f : index.keySet()) {
-            if (pattern == null || pattern.matches(f))
-                result.add(f);
-        }
-        return result;
-    }
+		List<String> result = new ArrayList<String>();
+		for (String f : index.keySet()) {
+			if (pattern == null || pattern.matches(f))
+				result.add(f);
+		}
+		return result;
+	}
 
-    public File put(Jar jar) throws Exception {
-        return null;
-    }
+	public File put(Jar jar) throws Exception {
+		return null;
+	}
 
-    public List<Version> versions(String bsn) {
-        Map<String, String> instances = index.get(bsn);
-        if (instances == null)
-            return null;
+	public List<Version> versions(String bsn) {
+		Map<String,String> instances = index.get(bsn);
+		if (instances == null)
+			return null;
 
-        List<Version> versions = Create.list();
-        for (String v : instances.keySet())
-            versions.add(new Version(v));
-        return versions;
-    }
-
+		List<Version> versions = Create.list();
+		for (String v : instances.keySet())
+			versions.add(new Version(v));
+		return versions;
+	}
 
 	public File get(String bsn, String range, Strategy strategy, Map<String,String> properties) throws Exception {
 		File[] files = get(bsn, range);
 		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/bnd/service/AnalyzerPlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/AnalyzerPlugin.java
index 3efe8ee..1a5b19a 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/AnalyzerPlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/AnalyzerPlugin.java
@@ -4,17 +4,17 @@
 
 public interface AnalyzerPlugin {
 
-    /**
-     * This plugin is called after analysis. The plugin is free to modify the
-     * jar and/or change the classpath information (see referred, contained).
-     * This plugin is called after analysis of the JAR but before manifest
-     * generation.
-     * 
-     * @param analyzer
-     * @return true if the classpace has been modified so that the bundle
-     *         classpath must be reanalyzed
-     * @throws Exception
-     */
+	/**
+	 * This plugin is called after analysis. The plugin is free to modify the
+	 * jar and/or change the classpath information (see referred, contained).
+	 * This plugin is called after analysis of the JAR but before manifest
+	 * generation.
+	 * 
+	 * @param analyzer
+	 * @return true if the classpace has been modified so that the bundle
+	 *         classpath must be reanalyzed
+	 * @throws Exception
+	 */
 
-    boolean analyzeJar(Analyzer analyzer) throws Exception;
+	boolean analyzeJar(Analyzer analyzer) throws Exception;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/BndListener.java b/bundleplugin/src/main/java/aQute/bnd/service/BndListener.java
index e937110..6335697 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/BndListener.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/BndListener.java
@@ -6,18 +6,23 @@
 import aQute.libg.reporter.*;
 
 public class BndListener {
-	final AtomicInteger inside = new AtomicInteger();
-	
-    public void changed(File file) {
-    }
-    public void begin() { inside.incrementAndGet();}
-    public void end() { inside.decrementAndGet(); }
-    
-    public boolean isInside() {
-    	return inside.get()!=0;
-    }
-    
-    public void signal(Reporter reporter) {
-    	
-    }
+	final AtomicInteger	inside	= new AtomicInteger();
+
+	public void changed(File file) {}
+
+	public void begin() {
+		inside.incrementAndGet();
+	}
+
+	public void end() {
+		inside.decrementAndGet();
+	}
+
+	public boolean isInside() {
+		return inside.get() != 0;
+	}
+
+	public void signal(Reporter reporter) {
+
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/CommandPlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/CommandPlugin.java
index 34c72c2..9511637 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/CommandPlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/CommandPlugin.java
@@ -3,28 +3,30 @@
 import aQute.bnd.build.*;
 
 /**
- * A plugin that makes it possible to 
+ * A plugin that makes it possible to
+ * 
  * @author aqute
- *
  */
 public interface CommandPlugin {
-    /**
-     * Is run before a command is executed. These plugins are called
-     * in the order of declaration.
-     * 
-     * @param project The project for which the command runs
-     * 
-     * @param command the command name
-     */
-    void before(Project project, String command);
-    
-    /**
-     * Is run after a command is executed. These plugins are
-     * called in the reverse order of declaration.
-     * 
-     * @param project The project for which the command runs
-     *
-     * @param command the command name
-     */
-    void after(Project project, String command, Throwable outcome);
+	/**
+	 * Is run before a command is executed. These plugins are called in the
+	 * order of declaration.
+	 * 
+	 * @param project
+	 *            The project for which the command runs
+	 * @param command
+	 *            the command name
+	 */
+	void before(Project project, String command);
+
+	/**
+	 * Is run after a command is executed. These plugins are called in the
+	 * reverse order of declaration.
+	 * 
+	 * @param project
+	 *            The project for which the command runs
+	 * @param command
+	 *            the command name
+	 */
+	void after(Project project, String command, Throwable outcome);
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/Compiler.java b/bundleplugin/src/main/java/aQute/bnd/service/Compiler.java
index 626b68c..a57fa5f 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/Compiler.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/Compiler.java
@@ -6,6 +6,6 @@
 import aQute.bnd.build.*;
 
 public interface Compiler {
-	boolean compile(Project project, Collection<File> sources, Collection<Container> buildpath,
-			File bin) throws Exception;
+	boolean compile(Project project, Collection<File> sources, Collection<Container> buildpath, File bin)
+			throws Exception;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/DependencyContributor.java b/bundleplugin/src/main/java/aQute/bnd/service/DependencyContributor.java
index e6a88ff..1fb073b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/DependencyContributor.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/DependencyContributor.java
@@ -5,5 +5,5 @@
 import aQute.bnd.build.*;
 
 public interface DependencyContributor {
-    void addDependencies(Project project, Set<String> dependencies);
+	void addDependencies(Project project, Set<String> dependencies);
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/Deploy.java b/bundleplugin/src/main/java/aQute/bnd/service/Deploy.java
index e1d92e1..c2f2b61 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/Deploy.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/Deploy.java
@@ -5,8 +5,7 @@
 
 /**
  * Deploy this artifact to maven.
- * 
  */
-public interface Deploy {	
+public interface Deploy {
 	boolean deploy(Project project, Jar jar) throws Exception;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/EclipseJUnitTester.java b/bundleplugin/src/main/java/aQute/bnd/service/EclipseJUnitTester.java
index a2af9b0..f5e4174 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/EclipseJUnitTester.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/EclipseJUnitTester.java
@@ -2,5 +2,6 @@
 
 public interface EclipseJUnitTester {
 	void setPort(int port);
-	void setHost( String host);
+
+	void setHost(String host);
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/IndexProvider.java b/bundleplugin/src/main/java/aQute/bnd/service/IndexProvider.java
index 5454c2d..9805f8b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/IndexProvider.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/IndexProvider.java
@@ -1,12 +1,11 @@
 package aQute.bnd.service;
 
-import java.net.URL;
-import java.util.List;
-import java.util.Set;
+import java.net.*;
+import java.util.*;
 
 public interface IndexProvider {
 
-	List<URL> getIndexLocations() throws Exception;
+	List<URI> getIndexLocations() throws Exception;
 
 	Set<ResolutionPhase> getSupportedPhases();
 
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/MakePlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/MakePlugin.java
index 20a1849..2e564e5 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/MakePlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/MakePlugin.java
@@ -6,16 +6,19 @@
 
 public interface MakePlugin {
 
-    /**
-     * This plugin is called when Include-Resource detects a reference to a resource
-     * that it can not find in the file system.
-     * 
-     * @param builder   The current builder
-     * @param source    The source string (i.e. the place where bnd looked)
-     * @param arguments Any arguments on the clause in Include-Resource
-     * @return          A resource or null if no resource could be made
-     * @throws Exception
-     */
-    Resource make(Builder builder, String source, Map<String,String> arguments) throws Exception;
+	/**
+	 * This plugin is called when Include-Resource detects a reference to a
+	 * resource that it can not find in the file system.
+	 * 
+	 * @param builder
+	 *            The current builder
+	 * @param source
+	 *            The source string (i.e. the place where bnd looked)
+	 * @param arguments
+	 *            Any arguments on the clause in Include-Resource
+	 * @return A resource or null if no resource could be made
+	 * @throws Exception
+	 */
+	Resource make(Builder builder, String source, Map<String,String> arguments) throws Exception;
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/Plugin.java b/bundleplugin/src/main/java/aQute/bnd/service/Plugin.java
index 065fac8..6b5bfcf 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/Plugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/Plugin.java
@@ -8,24 +8,23 @@
  * An optional interface for plugins. If a plugin implements this interface then
  * it can receive the reminaing attributes and directives given in its clause as
  * well as the reporter to use.
- * 
  */
 public interface Plugin {
-    /**
-     * Give the plugin the remaining properties.
-     * 
-     * When a plugin is declared, the clause can contain extra properties.
-     * All the properties and directives are given to the plugin to use.
-     * 
-     * @param map attributes and directives for this plugin's clause
-     */
-    void setProperties(Map<String,String> map);
-    
-    /**
-     * Set the current reporter. This is called at init time. This plugin
-     * should report all errors and warnings to this reporter.
-     * 
-     * @param processor
-     */
-    void setReporter(Reporter processor);
+	/**
+	 * Give the plugin the remaining properties. When a plugin is declared, the
+	 * clause can contain extra properties. All the properties and directives
+	 * are given to the plugin to use.
+	 * 
+	 * @param map
+	 *            attributes and directives for this plugin's clause
+	 */
+	void setProperties(Map<String,String> map);
+
+	/**
+	 * Set the current reporter. This is called at init time. This plugin should
+	 * report all errors and warnings to this reporter.
+	 * 
+	 * @param processor
+	 */
+	void setReporter(Reporter processor);
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/Refreshable.java b/bundleplugin/src/main/java/aQute/bnd/service/Refreshable.java
index e5e62e9..aeac258 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/Refreshable.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/Refreshable.java
@@ -3,6 +3,7 @@
 import java.io.*;
 
 public interface Refreshable {
-    boolean refresh();
-    File getRoot();
+	boolean refresh();
+
+	File getRoot();
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/Registry.java b/bundleplugin/src/main/java/aQute/bnd/service/Registry.java
index 90fca36..a55c927 100755
--- a/bundleplugin/src/main/java/aQute/bnd/service/Registry.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/Registry.java
@@ -7,5 +7,6 @@
  */
 public interface Registry {
 	<T> List<T> getPlugins(Class<T> c);
+
 	<T> T getPlugin(Class<T> c);
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/RegistryPlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/RegistryPlugin.java
index 7a46849..8a80660 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/RegistryPlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/RegistryPlugin.java
@@ -1,6 +1,5 @@
 package aQute.bnd.service;
 
-
 /**
  * A plugin that wants a registry
  */
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/RemoteRepositoryPlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/RemoteRepositoryPlugin.java
index e441a4c..8110fab 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/RemoteRepositoryPlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/RemoteRepositoryPlugin.java
@@ -5,8 +5,11 @@
 
 public interface RemoteRepositoryPlugin extends RepositoryPlugin {
 	/**
-	 * Retrieve a resource handle from the repository. For all implementations of this interface, calling {@code getFile(bsn, range, strategy, props)}
-	 * should always return the same result as {@code getResource(bsn, range, strategy, props).request()}.
+	 * Retrieve a resource handle from the repository. For all implementations
+	 * of this interface, calling {@code getFile(bsn, range, strategy, props)}
+	 * should always return the same result as
+	 * {@code getResource(bsn, range, strategy, props).request()}.
+	 * 
 	 * @param bsn
 	 * @param range
 	 * @param strategy
@@ -14,7 +17,8 @@
 	 * @return
 	 * @throws Exception
 	 */
-	ResourceHandle getHandle(String bsn, String range, Strategy strategy, Map<String,String> properties) throws Exception;
-	
+	ResourceHandle getHandle(String bsn, String range, Strategy strategy, Map<String,String> properties)
+			throws Exception;
+
 	File getCacheDirectory();
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/RepositoryListenerPlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/RepositoryListenerPlugin.java
index 13899f7..92238ab 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/RepositoryListenerPlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/RepositoryListenerPlugin.java
@@ -5,9 +5,10 @@
 import aQute.lib.osgi.*;
 
 public interface RepositoryListenerPlugin {
-	
+
 	/**
 	 * Called when a bundle is added to a repository.
+	 * 
 	 * @param repository
 	 * @param jar
 	 * @param file
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/RepositoryPlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/RepositoryPlugin.java
index 91b0a7e..c190847 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/RepositoryPlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/RepositoryPlugin.java
@@ -24,7 +24,8 @@
 	 * @throws Exception
 	 *             when anything goes wrong
 	 */
-	@Deprecated File[] get(String bsn, String range) throws Exception;
+	@Deprecated
+	File[] get(String bsn, String range) throws Exception;
 
 	/**
 	 * Return a URL to a matching version of the given bundle.
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/ResourceHandle.java b/bundleplugin/src/main/java/aQute/bnd/service/ResourceHandle.java
index be7f79b..42abd9b 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/ResourceHandle.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/ResourceHandle.java
@@ -3,10 +3,14 @@
 import java.io.*;
 
 public interface ResourceHandle {
-	
-	public enum Location { local, remote_cached, remote }
-	
+
+	public enum Location {
+		local, remote_cached, remote
+	}
+
 	String getName();
+
 	Location getLocation();
+
 	File request() throws IOException;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/Scripter.java b/bundleplugin/src/main/java/aQute/bnd/service/Scripter.java
index 2e4e1d3..069590c 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/Scripter.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/Scripter.java
@@ -5,6 +5,6 @@
 
 public interface Scripter {
 
-	void eval(Map<String, Object> x, StringReader stringReader);
+	void eval(Map<String,Object> x, StringReader stringReader);
 
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/SignerPlugin.java b/bundleplugin/src/main/java/aQute/bnd/service/SignerPlugin.java
index aaef646..b503652 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/SignerPlugin.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/SignerPlugin.java
@@ -3,13 +3,15 @@
 import aQute.lib.osgi.*;
 
 public interface SignerPlugin {
-    /**
-     * Sign the current jar. The alias is the given certificate 
-     * keystore.
-     * 
-     * @param builder   The current builder that contains the jar to sign
-     * @param alias     The keystore certificate alias
-     * @throws Exception When anything goes wrong
-     */
-    void sign(Builder builder, String alias) throws Exception;
+	/**
+	 * Sign the current jar. The alias is the given certificate keystore.
+	 * 
+	 * @param builder
+	 *            The current builder that contains the jar to sign
+	 * @param alias
+	 *            The keystore certificate alias
+	 * @throws Exception
+	 *             When anything goes wrong
+	 */
+	void sign(Builder builder, String alias) throws Exception;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/action/Action.java b/bundleplugin/src/main/java/aQute/bnd/service/action/Action.java
index 5167827..c74903d 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/action/Action.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/action/Action.java
@@ -3,5 +3,5 @@
 import aQute.bnd.build.*;
 
 public interface Action {
-    void execute( Project project, String action) throws Exception;
+	void execute(Project project, String action) throws Exception;
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/action/NamedAction.java b/bundleplugin/src/main/java/aQute/bnd/service/action/NamedAction.java
index 5a1c697..7b0c29a 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/action/NamedAction.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/action/NamedAction.java
@@ -1,6 +1,5 @@
 package aQute.bnd.service.action;
 
-
 public interface NamedAction extends Action {
-    String getName();
+	String getName();
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/diff/Delta.java b/bundleplugin/src/main/java/aQute/bnd/service/diff/Delta.java
index eec4781..5d3aa12 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/diff/Delta.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/diff/Delta.java
@@ -3,7 +3,6 @@
 /**
  * The Delta provides information about the {@link Diff} object. It tells the
  * relation between the newer and older compared elements.
- * 
  */
 public enum Delta {
 
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/diff/Diff.java b/bundleplugin/src/main/java/aQute/bnd/service/diff/Diff.java
index 43bf4e5..bf23eee 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/diff/Diff.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/diff/Diff.java
@@ -6,18 +6,32 @@
 	interface Ignore {
 		boolean contains(Diff diff);
 	}
-	
+
+	class Data {
+
+		public Type		type;
+		public Delta	delta;
+		public String	name;
+		public Data[]	children;
+		public String	comment;
+	}
+
+	Data serialize();
+
 	Delta getDelta();
+
 	Delta getDelta(Ignore ignore);
 
 	Type getType();
+
 	String getName();
+
 	Tree getOlder();
+
 	Tree getNewer();
 
-	Collection<? extends Diff> getChildren();
-	
+	Collection< ? extends Diff> getChildren();
+
 	Diff get(String name);
-	
-	
+
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/diff/Differ.java b/bundleplugin/src/main/java/aQute/bnd/service/diff/Differ.java
index 869a237..6d60c82 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/diff/Differ.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/diff/Differ.java
@@ -6,7 +6,8 @@
  * Compare two Jars and report the differences.
  */
 public interface Differ {
-	Tree tree(Analyzer source ) throws Exception;
+	Tree tree(Analyzer source) throws Exception;
+
 	Tree tree(Jar source) throws Exception;
 
 	Tree deserialize(Tree.Data data) throws Exception;
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/diff/Tree.java b/bundleplugin/src/main/java/aQute/bnd/service/diff/Tree.java
index 7072ac1..0b61f86 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/diff/Tree.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/diff/Tree.java
@@ -1,6 +1,6 @@
 package aQute.bnd.service.diff;
 
-public interface Tree {
+public interface Tree extends Comparable<Tree>{
 
 	public class Data {
 		public String	name;
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/diff/Type.java b/bundleplugin/src/main/java/aQute/bnd/service/diff/Type.java
index d71b9f4..ec4c1b2 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/diff/Type.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/diff/Type.java
@@ -1,10 +1,10 @@
 package aQute.bnd.service.diff;
 
 public enum Type {
-	ACCESS, BUNDLE, API, MANIFEST, PACKAGE, CLASS, INTERFACE, ANNOTATION, ENUM, EXTENDS, IMPLEMENTS, FIELD, METHOD, ANNOTATED, PROPERTY, RESOURCE, CUSTOM, CLAUSE, HEADER, PARAMETER, CLASS_VERSION, RESOURCES, CONSTANT, RETURN, VERSION, DEPRECATED;
+	ACCESS, BUNDLE, API, MANIFEST, PACKAGE, CLASS, INTERFACE, ANNOTATION, ENUM, EXTENDS, IMPLEMENTS, FIELD, METHOD, ANNOTATED, PROPERTY, RESOURCE, CUSTOM, CLAUSE, HEADER, PARAMETER, CLASS_VERSION, RESOURCES, CONSTANT, RETURN, VERSION, DEPRECATED, REPO, PROGRAM, REVISION;
 
 	public boolean isInherited() {
 		// TODO Auto-generated method stub
 		return false;
-	} 
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/packageinfo b/bundleplugin/src/main/java/aQute/bnd/service/packageinfo
index 0ff7674..084a0d4 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/packageinfo
+++ b/bundleplugin/src/main/java/aQute/bnd/service/packageinfo
@@ -1 +1 @@
-version 1.45.0
+version 2.0.0
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/url/TaggedData.java b/bundleplugin/src/main/java/aQute/bnd/service/url/TaggedData.java
index 53332f4..fe81de8 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/url/TaggedData.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/url/TaggedData.java
@@ -1,18 +1,17 @@
 package aQute.bnd.service.url;
 
-import java.io.InputStream;
+import java.io.*;
 
 /**
  * Represents a data stream that has a tag associated with it; the primary
  * use-case is an HTTP response stream with an ETag header.
  * 
  * @author Neil Bartlett
- * 
  */
 public class TaggedData {
 
-	private final String tag;
-	private final InputStream inputStream;
+	private final String		tag;
+	private final InputStream	inputStream;
 
 	public TaggedData(String tag, InputStream inputStream) {
 		this.tag = tag;
diff --git a/bundleplugin/src/main/java/aQute/bnd/service/url/URLConnector.java b/bundleplugin/src/main/java/aQute/bnd/service/url/URLConnector.java
index e853509..5781288 100644
--- a/bundleplugin/src/main/java/aQute/bnd/service/url/URLConnector.java
+++ b/bundleplugin/src/main/java/aQute/bnd/service/url/URLConnector.java
@@ -1,8 +1,7 @@
 package aQute.bnd.service.url;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
+import java.io.*;
+import java.net.*;
 
 public interface URLConnector {
 
@@ -24,7 +23,6 @@
 	 *         {@link TaggedData#getTag()} method <strong>may</strong> return
 	 *         {@code null} if the resource has no tag.
 	 * @throws IOException
-	 * 
 	 * @since 1.1
 	 */
 	TaggedData connectTagged(URL url) throws IOException;
@@ -41,7 +39,6 @@
 	 * @return An instance of {@link TaggedData}, or {@code null} if the
 	 *         resource has not modified (i.e., if it has the same tag value).
 	 * @throws IOException
-	 * 
 	 * @since 1.1
 	 */
 	TaggedData connectTagged(URL url, String tag) throws IOException;
diff --git a/bundleplugin/src/main/java/aQute/bnd/settings/Settings.java b/bundleplugin/src/main/java/aQute/bnd/settings/Settings.java
index 78ed213..6b7ff90 100644
--- a/bundleplugin/src/main/java/aQute/bnd/settings/Settings.java
+++ b/bundleplugin/src/main/java/aQute/bnd/settings/Settings.java
@@ -37,7 +37,7 @@
 	}
 
 	private void generate() throws NoSuchAlgorithmException {
-		Pair<? extends PrivateKey, ? extends RSAPublicKey> pair = RSA.generate();
+		Pair< ? extends PrivateKey, ? extends RSAPublicKey> pair = RSA.generate();
 		prefs.put(KEY_PRIVATE, Crypto.toString(pair.a));
 		prefs.put(KEY_PUBLIC, Crypto.toString(pair.b));
 		prefs.putBoolean(KEY_SET, true);
diff --git a/bundleplugin/src/main/java/aQute/bnd/signing/JartoolSigner.java b/bundleplugin/src/main/java/aQute/bnd/signing/JartoolSigner.java
index d0073b5..b96bd41 100644
--- a/bundleplugin/src/main/java/aQute/bnd/signing/JartoolSigner.java
+++ b/bundleplugin/src/main/java/aQute/bnd/signing/JartoolSigner.java
@@ -11,134 +11,131 @@
 import aQute.libg.reporter.*;
 
 /**
- * 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> ] ( ',' ... )*
  * 
  * @author aqute
- * 
  */
 public class JartoolSigner implements Plugin, SignerPlugin {
-    String keystore;
-    String storetype;
-    String path = "jarsigner";
-    String storepass;
-    String keypass;
-    String sigFile;
-    String digestalg;
+	String	keystore;
+	String	storetype;
+	String	path	= "jarsigner";
+	String	storepass;
+	String	keypass;
+	String	sigFile;
+	String	digestalg;
 
-    public void setProperties(Map<String, String> map) {
-        if (map.containsKey("keystore"))
-            this.keystore = map.get("keystore");
-        if (map.containsKey("storetype"))
-            this.storetype = map.get("storetype");
-        if (map.containsKey("storepass"))
-            this.storepass = map.get("storepass");
-        if (map.containsKey("keypass"))
-            this.keypass = map.get("keypass");
-        if (map.containsKey("path"))
-            this.path = map.get("path");
-        if (map.containsKey("sigFile"))
-            this.sigFile = map.get("sigFile");
-        if (map.containsKey("digestalg"))
-            this.digestalg = map.get("digestalg");
-    }
+	public void setProperties(Map<String,String> map) {
+		if (map.containsKey("keystore"))
+			this.keystore = map.get("keystore");
+		if (map.containsKey("storetype"))
+			this.storetype = map.get("storetype");
+		if (map.containsKey("storepass"))
+			this.storepass = map.get("storepass");
+		if (map.containsKey("keypass"))
+			this.keypass = map.get("keypass");
+		if (map.containsKey("path"))
+			this.path = map.get("path");
+		if (map.containsKey("sigFile"))
+			this.sigFile = map.get("sigFile");
+		if (map.containsKey("digestalg"))
+			this.digestalg = map.get("digestalg");
+	}
 
-    public void setReporter(Reporter processor) {
-    }
+	public void setReporter(Reporter processor) {}
 
-    public void sign(Builder builder, String alias) throws Exception {    	    	
-    	File f = builder.getFile(keystore);
-    	if ( !f.isFile()) {
-    		builder.error("Invalid keystore %s", f.getAbsolutePath() );
-    		return;
-    	}
-    	
-        Jar jar = builder.getJar();
-        File tmp = File.createTempFile("signdjar", ".jar");
-        tmp.deleteOnExit();
+	public void sign(Builder builder, String alias) throws Exception {
+		File f = builder.getFile(keystore);
+		if (!f.isFile()) {
+			builder.error("Invalid keystore %s", f.getAbsolutePath());
+			return;
+		}
 
-        jar.write(tmp);
+		Jar jar = builder.getJar();
+		File tmp = File.createTempFile("signdjar", ".jar");
+		tmp.deleteOnExit();
 
-        Command command = new Command();
-        command.add(path);
-        if (keystore != null) {
-            command.add("-keystore");
-            command.add(f.getAbsolutePath());
-        }
+		jar.write(tmp);
 
-        if (storetype != null) {
-        	command.add("-storetype");
-        	command.add(storetype);
-        }
+		Command command = new Command();
+		command.add(path);
+		if (keystore != null) {
+			command.add("-keystore");
+			command.add(f.getAbsolutePath());
+		}
 
-        if (keypass != null) {
-        	command.add("-keypass");
-        	command.add(keypass);
-        }
+		if (storetype != null) {
+			command.add("-storetype");
+			command.add(storetype);
+		}
 
-        if (storepass != null) {
-        	command.add("-storepass");
-        	command.add(storepass);
-        }
+		if (keypass != null) {
+			command.add("-keypass");
+			command.add(keypass);
+		}
 
-        if (sigFile != null) {
-        	command.add("-sigFile");
-        	command.add(sigFile);
-        }
+		if (storepass != null) {
+			command.add("-storepass");
+			command.add(storepass);
+		}
 
-        if (digestalg != null) {
-        	command.add("-digestalg");
-        	command.add(digestalg);
-	    }
+		if (sigFile != null) {
+			command.add("-sigFile");
+			command.add(sigFile);
+		}
 
-        command.add(tmp.getAbsolutePath());
-        command.add(alias);
-        builder.trace("Jarsigner command: %s", command);
-        command.setTimeout(20, TimeUnit.SECONDS);
-        StringBuilder out = new StringBuilder();
-        StringBuilder err = new StringBuilder();
-        int exitValue = command.execute(System.in, out, err);
-        if (exitValue != 0) {
-            builder.error("Signing Jar out: %s\nerr: %s", out, err);
-        } else {
-            builder.trace("Signing Jar out: %s \nerr: %s", out, err);
-        }
+		if (digestalg != null) {
+			command.add("-digestalg");
+			command.add(digestalg);
+		}
 
-        Jar signed = new Jar(tmp);
-        builder.addClose(signed);
+		command.add(tmp.getAbsolutePath());
+		command.add(alias);
+		builder.trace("Jarsigner command: %s", command);
+		command.setTimeout(20, TimeUnit.SECONDS);
+		StringBuilder out = new StringBuilder();
+		StringBuilder err = new StringBuilder();
+		int exitValue = command.execute(out, err);
+		if (exitValue != 0) {
+			builder.error("Signing Jar out: %s\nerr: %s", out, err);
+		} else {
+			builder.trace("Signing Jar out: %s \nerr: %s", out, err);
+		}
 
-        Map<String, Resource> dir = signed.getDirectories().get("META-INF");
-        for (Entry<String, Resource> entry : dir.entrySet()) {
-            String path = entry.getKey();
-            if (path.matches(".*\\.(DSA|RSA|SF|MF)$")) {
-                jar.putResource(path, entry.getValue());
-            }
-        }
-        jar.setDoNotTouchManifest();
-    }
+		Jar signed = new Jar(tmp);
+		builder.addClose(signed);
 
-    StringBuilder collect(final InputStream in) throws Exception {
-        final StringBuilder sb = new StringBuilder();
-        
-        Thread tin = new Thread() {
-            public void run() {
-                try {
-                    BufferedReader rdr = new BufferedReader(new InputStreamReader(in, Constants.DEFAULT_CHARSET));
-                    String line = rdr.readLine();
-                    while (line != null) {
-                        sb.append(line);
-                        line = rdr.readLine();
-                    }
-                    rdr.close();
-                    in.close();
-                } catch (Exception e) {
-                    // Ignore any exceptions
-                }
-            }
-        };
-        tin.start();
-        return sb;
-    }
+		Map<String,Resource> dir = signed.getDirectories().get("META-INF");
+		for (Entry<String,Resource> entry : dir.entrySet()) {
+			String path = entry.getKey();
+			if (path.matches(".*\\.(DSA|RSA|SF|MF)$")) {
+				jar.putResource(path, entry.getValue());
+			}
+		}
+		jar.setDoNotTouchManifest();
+	}
+
+	StringBuilder collect(final InputStream in) throws Exception {
+		final StringBuilder sb = new StringBuilder();
+
+		Thread tin = new Thread() {
+			public void run() {
+				try {
+					BufferedReader rdr = new BufferedReader(new InputStreamReader(in, Constants.DEFAULT_CHARSET));
+					String line = rdr.readLine();
+					while (line != null) {
+						sb.append(line);
+						line = rdr.readLine();
+					}
+					rdr.close();
+					in.close();
+				}
+				catch (Exception e) {
+					// Ignore any exceptions
+				}
+			}
+		};
+		tin.start();
+		return sb;
+	}
 }
diff --git a/bundleplugin/src/main/java/aQute/bnd/signing/Signer.java b/bundleplugin/src/main/java/aQute/bnd/signing/Signer.java
index 1827cd6..7914df3 100644
--- a/bundleplugin/src/main/java/aQute/bnd/signing/Signer.java
+++ b/bundleplugin/src/main/java/aQute/bnd/signing/Signer.java
@@ -13,184 +13,176 @@
 
 /**
  * This class is used with the aQute.lib.osgi package, it signs jars with DSA
- * signature.
- * 
- * -sign: md5, sha1
+ * signature. -sign: md5, sha1
  */
 public class Signer extends Processor {
-    static Pattern  METAINFDIR   = Pattern.compile("META-INF/[^/]*");
-    String         digestNames[]    = new String[] { "MD5" };
-    File           keystoreFile  = new File("keystore");
-    String         password;
-    String         alias;
+	static Pattern	METAINFDIR		= Pattern.compile("META-INF/[^/]*");
+	String			digestNames[]	= new String[] {
+										"MD5"
+									};
+	File			keystoreFile	= new File("keystore");
+	String			password;
+	String			alias;
 
-    public void signJar(Jar jar) {
-        if (digestNames == null || digestNames.length == 0)
-            error("Need at least one digest algorithm name, none are specified");
+	public void signJar(Jar jar) {
+		if (digestNames == null || digestNames.length == 0)
+			error("Need at least one digest algorithm name, none are specified");
 
-        if (keystoreFile == null || !keystoreFile.getAbsoluteFile().exists()) {
-            error("No such keystore file: " + keystoreFile);
-            return;
-        }
+		if (keystoreFile == null || !keystoreFile.getAbsoluteFile().exists()) {
+			error("No such keystore file: " + keystoreFile);
+			return;
+		}
 
-        if (alias == null) {
-            error("Private key alias not set for signing");
-            return;
-        }
+		if (alias == null) {
+			error("Private key alias not set for signing");
+			return;
+		}
 
-        MessageDigest digestAlgorithms[] = new MessageDigest[digestNames.length];
+		MessageDigest digestAlgorithms[] = new MessageDigest[digestNames.length];
 
-        getAlgorithms(digestNames, digestAlgorithms);
+		getAlgorithms(digestNames, digestAlgorithms);
 
-        try {
-            Manifest manifest = jar.getManifest();
-            manifest.getMainAttributes().putValue("Signed-By", "Bnd");
+		try {
+			Manifest manifest = jar.getManifest();
+			manifest.getMainAttributes().putValue("Signed-By", "Bnd");
 
-            // Create a new manifest that contains the
-            // Name parts with the specified digests
+			// Create a new manifest that contains the
+			// Name parts with the specified digests
 
-            ByteArrayOutputStream o = new ByteArrayOutputStream();
-            manifest.write(o);
-            doManifest(jar, digestNames, digestAlgorithms, o);
-            o.flush();
-            byte newManifestBytes[] = o.toByteArray();
-            jar.putResource("META-INF/MANIFEST.MF", new EmbeddedResource(
-                    newManifestBytes, 0));
+			ByteArrayOutputStream o = new ByteArrayOutputStream();
+			manifest.write(o);
+			doManifest(jar, digestNames, digestAlgorithms, o);
+			o.flush();
+			byte newManifestBytes[] = o.toByteArray();
+			jar.putResource("META-INF/MANIFEST.MF", new EmbeddedResource(newManifestBytes, 0));
 
-            // Use the bytes from the new manifest to create
-            // a signature file
+			// Use the bytes from the new manifest to create
+			// a signature file
 
-            byte[] signatureFileBytes = doSignatureFile(digestNames,
-                    digestAlgorithms, newManifestBytes);
-            jar.putResource("META-INF/BND.SF", new EmbeddedResource(
-                    signatureFileBytes, 0));
+			byte[] signatureFileBytes = doSignatureFile(digestNames, digestAlgorithms, newManifestBytes);
+			jar.putResource("META-INF/BND.SF", new EmbeddedResource(signatureFileBytes, 0));
 
-            // Now we must create an RSA signature
-            // this requires the private key from the keystore
+			// Now we must create an RSA signature
+			// this requires the private key from the keystore
 
-            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
+			KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
 
-            KeyStore.PrivateKeyEntry privateKeyEntry = null;
+			KeyStore.PrivateKeyEntry privateKeyEntry = null;
 
-            java.io.FileInputStream keystoreInputStream = null;
-            try {
-            	keystoreInputStream = new java.io.FileInputStream(
-                        keystoreFile);
-                char[] pw = password == null ? new char[0]
-                        : password.toCharArray();
-                
-                keystore.load(keystoreInputStream, pw);
-                keystoreInputStream.close();
-                privateKeyEntry =  (PrivateKeyEntry) keystore.getEntry(
-                        alias, new KeyStore.PasswordProtection(pw));
-            } catch (Exception e) {
-                error("No able to load the private key from the give keystore("+keystoreFile.getAbsolutePath()+") with alias "+alias+" : "
-                        + e);
-                return;
-            } finally {
-            	IO.close(keystoreInputStream);
-            }
-            PrivateKey privateKey = privateKeyEntry.getPrivateKey();
+			java.io.FileInputStream keystoreInputStream = null;
+			try {
+				keystoreInputStream = new java.io.FileInputStream(keystoreFile);
+				char[] pw = password == null ? new char[0] : password.toCharArray();
 
-            Signature signature = Signature.getInstance("MD5withRSA");
-            signature.initSign(privateKey);
+				keystore.load(keystoreInputStream, pw);
+				keystoreInputStream.close();
+				privateKeyEntry = (PrivateKeyEntry) keystore.getEntry(alias, new KeyStore.PasswordProtection(pw));
+			}
+			catch (Exception e) {
+				error("No able to load the private key from the give keystore(" + keystoreFile.getAbsolutePath()
+						+ ") with alias " + alias + " : " + e);
+				return;
+			}
+			finally {
+				IO.close(keystoreInputStream);
+			}
+			PrivateKey privateKey = privateKeyEntry.getPrivateKey();
 
-            signature.update(signatureFileBytes);
+			Signature signature = Signature.getInstance("MD5withRSA");
+			signature.initSign(privateKey);
 
-            signature.sign();
+			signature.update(signatureFileBytes);
 
-            // TODO, place the SF in a PCKS#7 structure ...
-            // no standard class for this? The following
-            // is an idea but we will to have do ASN.1 BER
-            // encoding ...
+			signature.sign();
 
-         
-            
-            ByteArrayOutputStream tmpStream = new ByteArrayOutputStream();
-            jar.putResource("META-INF/BND.RSA", new EmbeddedResource(tmpStream
-                    .toByteArray(), 0));
-        } catch (Exception e) {
-            error("During signing: " + e);
-        }
-    }
+			// TODO, place the SF in a PCKS#7 structure ...
+			// no standard class for this? The following
+			// is an idea but we will to have do ASN.1 BER
+			// encoding ...
 
-    private byte[] doSignatureFile(String[] digestNames,
-            MessageDigest[] algorithms, byte[] manbytes) throws IOException {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        PrintWriter ps = IO.writer(out);
-        ps.print("Signature-Version: 1.0\r\n");
+			ByteArrayOutputStream tmpStream = new ByteArrayOutputStream();
+			jar.putResource("META-INF/BND.RSA", new EmbeddedResource(tmpStream.toByteArray(), 0));
+		}
+		catch (Exception e) {
+			error("During signing: " + e);
+		}
+	}
 
-        for (int a = 0; a < algorithms.length; a++) {
-            if (algorithms[a] != null) {
-                byte[] digest = algorithms[a].digest(manbytes);
-                ps.print(digestNames[a] + "-Digest-Manifest: ");
-                ps.print(new Base64(digest));
-                ps.print("\r\n");
-            }
-        }
-        return out.toByteArray();
-    }
+	private byte[] doSignatureFile(String[] digestNames, MessageDigest[] algorithms, byte[] manbytes)
+			throws IOException {
+		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		PrintWriter ps = IO.writer(out);
+		ps.print("Signature-Version: 1.0\r\n");
 
-    private void doManifest(Jar jar, String[] digestNames,
-            MessageDigest[] algorithms, OutputStream out) throws Exception {
+		for (int a = 0; a < algorithms.length; a++) {
+			if (algorithms[a] != null) {
+				byte[] digest = algorithms[a].digest(manbytes);
+				ps.print(digestNames[a] + "-Digest-Manifest: ");
+				ps.print(new Base64(digest));
+				ps.print("\r\n");
+			}
+		}
+		return out.toByteArray();
+	}
 
-        for (Map.Entry<String,Resource> entry : jar.getResources().entrySet()) {
-            String name = entry.getKey();
-            if (!METAINFDIR.matcher(name).matches()) {
-                out.write("\r\n".getBytes());
-                out.write("Name: ".getBytes());
-                out.write(name.getBytes("UTF-8"));
-                out.write("\r\n".getBytes());
+	private void doManifest(Jar jar, String[] digestNames, MessageDigest[] algorithms, OutputStream out)
+			throws Exception {
 
-                digest(algorithms, entry.getValue());
-                for (int a = 0; a < algorithms.length; a++) {
-                    if (algorithms[a] != null) {
-                        byte[] digest = algorithms[a].digest();
-                        String header = digestNames[a] + "-Digest: "
-                                + new Base64(digest) + "\r\n";
-                        out.write(header.getBytes());
-                    }
-                }
-            }
-        }
-    }
+		for (Map.Entry<String,Resource> entry : jar.getResources().entrySet()) {
+			String name = entry.getKey();
+			if (!METAINFDIR.matcher(name).matches()) {
+				out.write("\r\n".getBytes());
+				out.write("Name: ".getBytes());
+				out.write(name.getBytes("UTF-8"));
+				out.write("\r\n".getBytes());
 
-    private void digest(MessageDigest[] algorithms, Resource r)
-            throws Exception {
-        InputStream in = r.openInputStream();
-        byte[] data = new byte[1024];
-        int size = in.read(data);
-        while (size > 0) {
-            for (int a = 0; a < algorithms.length; a++) {
-                if (algorithms[a] != null) {
-                    algorithms[a].update(data, 0, size);
-                }
-            }
-            size = in.read(data);
-        }
-    }
+				digest(algorithms, entry.getValue());
+				for (int a = 0; a < algorithms.length; a++) {
+					if (algorithms[a] != null) {
+						byte[] digest = algorithms[a].digest();
+						String header = digestNames[a] + "-Digest: " + new Base64(digest) + "\r\n";
+						out.write(header.getBytes());
+					}
+				}
+			}
+		}
+	}
 
-    private void getAlgorithms(String[] digestNames, MessageDigest[] algorithms) {
-        for (int i = 0; i < algorithms.length; i++) {
-            String name = digestNames[i];
-            try {
-                algorithms[i] = MessageDigest.getInstance(name);
-            } catch (NoSuchAlgorithmException e) {
-                error("Specified digest algorithm " + digestNames[i]
-                        + ", but not such algorithm was found: " + e);
-            }
-        }
-    }
+	private void digest(MessageDigest[] algorithms, Resource r) throws Exception {
+		InputStream in = r.openInputStream();
+		byte[] data = new byte[1024];
+		int size = in.read(data);
+		while (size > 0) {
+			for (int a = 0; a < algorithms.length; a++) {
+				if (algorithms[a] != null) {
+					algorithms[a].update(data, 0, size);
+				}
+			}
+			size = in.read(data);
+		}
+	}
 
-    public void setPassword(String string) {
-        password = string;
-    }
+	private void getAlgorithms(String[] digestNames, MessageDigest[] algorithms) {
+		for (int i = 0; i < algorithms.length; i++) {
+			String name = digestNames[i];
+			try {
+				algorithms[i] = MessageDigest.getInstance(name);
+			}
+			catch (NoSuchAlgorithmException e) {
+				error("Specified digest algorithm " + digestNames[i] + ", but not such algorithm was found: " + e);
+			}
+		}
+	}
 
-    public void setKeystore(File keystore) {
-        this.keystoreFile = keystore;
-    }
+	public void setPassword(String string) {
+		password = string;
+	}
 
-    public void setAlias(String string) {
-        this.alias = string;
-    }
+	public void setKeystore(File keystore) {
+		this.keystoreFile = keystore;
+	}
+
+	public void setAlias(String string) {
+		this.alias = string;
+	}
 }