diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java
index d54272f..6268f8a 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Closure.java
@@ -487,7 +487,9 @@
             {
                 int i = name.charAt(0) - '0';
                 if (i > 0)
+                {
                     return parms.get(i - 1);
+                }
             }
         }
         return session.get(name);
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Command.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Command.java
index cf75e2d..2488697 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Command.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Command.java
@@ -40,5 +40,4 @@
     {
         return method(session, target, function, arguments);
     }
-
-}
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandProxy.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandProxy.java
index 3a5ba99..18f8505 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandProxy.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandProxy.java
@@ -27,7 +27,6 @@
 
 public class CommandProxy extends Reflective implements Function
 {
-
     BundleContext context;
     ServiceReference reference;
     String function;
@@ -59,4 +58,4 @@
             context.ungetService(reference);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandSessionImpl.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandSessionImpl.java
index 4c478ce..d1b76cc 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandSessionImpl.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandSessionImpl.java
@@ -34,9 +34,7 @@
 {
     public static final String VARIABLES = ".variables";
     public static final String COMMANDS = ".commands";
-
     private static final String COLUMN = "%-20s %s\n";
-
     InputStream in;
     PrintStream out;
     PrintStream err;
@@ -226,13 +224,13 @@
                 {
                     StringBuilder sb = new StringBuilder();
                     Collection<?> c = (Collection<?>) target;
-					sb.append("[");
+                    sb.append("[");
                     for (Object o : c)
                     {
-						if (sb.length() > 1) 
-						{
-							sb.append(", ");
-						}
+                        if (sb.length() > 1)
+                        {
+                            sb.append(", ");
+                        }
                         sb.append(format(o, level + 1, this));
                     }
                     sb.append("]");
@@ -275,13 +273,13 @@
                 {
                     StringBuilder sb = new StringBuilder();
                     Map<?, ?> c = (Map<?, ?>) target;
-					sb.append("[");
+                    sb.append("[");
                     for (Map.Entry<?, ?> entry : c.entrySet())
                     {
-						if (sb.length() > 1) 
-						{
-							sb.append(", ");
-						}
+                        if (sb.length() > 1)
+                        {
+                            sb.append(", ");
+                        }
                         sb.append(format(entry, level + 1, this));
                     }
                     sb.append("]");
@@ -355,5 +353,4 @@
             return "<can not format " + result + ":" + e;
         }
     }
-
-}
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandShellImpl.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandShellImpl.java
index efd6471..13a1665 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandShellImpl.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/CommandShellImpl.java
@@ -47,7 +47,6 @@
 
     public CommandSession createSession(InputStream in, PrintStream out, PrintStream err)
     {
-
         return new CommandSessionImpl(this, in, out, err);
     }
 
@@ -220,5 +219,4 @@
         }
         return null;
     }
-
-}
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java
index 4ac1921..6c915ce 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Parser.java
@@ -122,8 +122,8 @@
                     current += 4;
                     break;
                 default:
-                    // We just take the next character literally
-                    // but have the escaped flag set, important for {},[] etc
+                // We just take the next character literally
+                // but have the escaped flag set, important for {},[] etc
             }
         }
         if (!increment)
@@ -422,7 +422,7 @@
         }
         throw new IllegalArgumentException(
             "Reference to variable does not match syntax of a variable: "
-                + context(start));
+            + context(start));
     }
 
     public String toString()
@@ -439,4 +439,4 @@
         }
         return sb.toString();
     }
-}
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Pipe.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Pipe.java
index f0ec922..d25c085 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Pipe.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Pipe.java
@@ -130,4 +130,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Reflective.java b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Reflective.java
index 2478d58..be335fb 100644
--- a/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Reflective.java
+++ b/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/shell/Reflective.java
@@ -24,345 +24,448 @@
 
 import org.osgi.service.command.*;
 
-public class Reflective {
-	public final static Object NO_MATCH = new Object();
-	public final static Set<String> KEYWORDS = new HashSet<String>(Arrays
-			.asList(new String[] { "abstract", "continue", "for", "new",
-					"switch", "assert", "default", "goto", "package",
-					"synchronized", "boolean", "do", "if", "private", "this",
-					"break", "double", "implements", "protected", "throw",
-					"byte", "else", "import", "public", "throws", "case",
-					"enum", "instanceof", "return", "transient", "catch",
-					"extends", "int", "short", "try", "char", "final",
-					"interface", "static", "void", "class", "finally", "long",
-					"strictfp", "volatile", "const", "float", "native",
-					"super", "while" }));
-	public final static String MAIN = "_main";
+public class Reflective
+{
+    public final static Object NO_MATCH = new Object();
+    public final static Set<String> KEYWORDS = new HashSet<String>(Arrays.asList(new String[]
+        {
+            "abstract", "continue", "for", "new",
+            "switch", "assert", "default", "goto", "package",
+            "synchronized", "boolean", "do", "if", "private", "this",
+            "break", "double", "implements", "protected", "throw",
+            "byte", "else", "import", "public", "throws", "case",
+            "enum", "instanceof", "return", "transient", "catch",
+            "extends", "int", "short", "try", "char", "final",
+            "interface", "static", "void", "class", "finally", "long",
+            "strictfp", "volatile", "const", "float", "native",
+            "super", "while"
+        }));
+    public final static String MAIN = "_main";
 
-	public Object method(CommandSession session, Object target, String name,
-			List<Object> args) throws IllegalArgumentException,
-			IllegalAccessException, InvocationTargetException, Exception {
-		Method[] methods = target.getClass().getMethods();
-		name = name.toLowerCase();
+    public Object method(
+        CommandSession session, Object target, String name, List<Object> args)
+        throws IllegalArgumentException, IllegalAccessException,
+            InvocationTargetException, Exception
+    {
+        Method[] methods = target.getClass().getMethods();
+        name = name.toLowerCase();
 
-		String get = "get" + name;
-		String is = "is" + name;
-		String set = "set" + name;
+        String get = "get" + name;
+        String is = "is" + name;
+        String set = "set" + name;
 
-		if (KEYWORDS.contains(name)) {
-			name = "_" + name;
-		}
+        if (KEYWORDS.contains(name))
+        {
+            name = "_" + name;
+        }
 
-		if (target instanceof Class) {
-			Method[] staticMethods = ((Class<?>) target).getMethods();
-			for (Method m : staticMethods) {
-				String mname = m.getName().toLowerCase();
-				if (mname.equals(name) || mname.equals(get)
-						|| mname.equals(set) || mname.equals(is)
-						|| mname.equals(MAIN)) {
-					methods = staticMethods;
-					break;
-				}
-			}
-		}
+        if (target instanceof Class)
+        {
+            Method[] staticMethods = ((Class<?>) target).getMethods();
+            for (Method m : staticMethods)
+            {
+                String mname = m.getName().toLowerCase();
+                if (mname.equals(name)
+                    || mname.equals(get)
+                    || mname.equals(set)
+                    || mname.equals(is)
+                    || mname.equals(MAIN))
+                {
+                    methods = staticMethods;
+                    break;
+                }
+            }
+        }
 
-		Method bestMethod = null;
-		Object[] bestArgs = null;
-		int match = -1;
-		ArrayList<Class<?>[]> possibleTypes = new ArrayList<Class<?>[]>();
+        Method bestMethod = null;
+        Object[] bestArgs = null;
+        int match = -1;
+        ArrayList<Class<?>[]> possibleTypes = new ArrayList<Class<?>[]>();
 
-		for (Method m : methods) {
-			String mname = m.getName().toLowerCase();
-			if (mname.equals(name) || mname.equals(get) || mname.equals(set)
-					|| mname.equals(is) || mname.equals(MAIN)) {
-				Class<?>[] types = m.getParameterTypes();
-				ArrayList<Object> xargs = new ArrayList<Object>(args);
+        for (Method m : methods)
+        {
+            String mname = m.getName().toLowerCase();
+            if (mname.equals(name)
+                || mname.equals(get)
+                || mname.equals(set)
+                || mname.equals(is)
+                || mname.equals(MAIN))
+            {
+                Class<?>[] types = m.getParameterTypes();
+                ArrayList<Object> xargs = new ArrayList<Object>(args);
 
-				// pass command name as argv[0] to main, so it can handle
-				// multiple commands
-				if (mname.equals(MAIN)) {
-					xargs.add(0, name);
-				}
+                // pass command name as argv[0] to main, so it can handle
+                // multiple commands
+                if (mname.equals(MAIN))
+                {
+                    xargs.add(0, name);
+                }
 
-				// Check if the command takes a session
-				if (types.length > 0
-						&& CommandSession.class.isAssignableFrom(types[0])) {
-					xargs.add(0, session);
-				}
+                // Check if the command takes a session
+                if ((types.length > 0)
+                    && CommandSession.class.isAssignableFrom(types[0]))
+                {
+                    xargs.add(0, session);
+                }
 
-				Object[] parms = new Object[types.length];
-				// if (types.length >= args.size() ) {
-				int local = coerce(session, target, m, types, parms, xargs);
-				if ((local >= xargs.size()) && (local >= types.length)) { // derek
-																			// -
-																			// stop
-																			// no-args
-					boolean exact = (local == xargs.size() && local == types.length);
-					if (exact || local > match) {
-						bestMethod = m;
-						bestArgs = parms;
-						match = local;
-					}
-					if (exact) {
-						break;
-					}
-				} else {
-					possibleTypes.add(types);
-				}
-				// }
-				// if (match == -1 && types.length == 1
-				// && types[0] == Object[].class) {
-				// bestMethod = m;
-				// Object value = args.toArray();
-				// bestArgs = new Object[] { value };
-				// }
-			}
-		}
+                Object[] parms = new Object[types.length];
+                // if (types.length >= args.size() ) {
+                int local = coerce(session, target, m, types, parms, xargs);
+                if ((local >= xargs.size()) && (local >= types.length))
+                { // derek
+                    // -
+                    // stop
+                    // no-args
+                    boolean exact = ((local == xargs.size()) && (local == types.length));
+                    if (exact || (local > match))
+                    {
+                        bestMethod = m;
+                        bestArgs = parms;
+                        match = local;
+                    }
+                    if (exact)
+                    {
+                        break;
+                    }
+                }
+                else
+                {
+                    possibleTypes.add(types);
+                }
+                // }
+                // if (match == -1 && types.length == 1
+                // && types[0] == Object[].class) {
+                // bestMethod = m;
+                // Object value = args.toArray();
+                // bestArgs = new Object[] { value };
+                // }
+            }
+        }
 
-		if (bestMethod != null) {
-			bestMethod.setAccessible(true);
-			// derek: BUGFIX catch InvocationTargetException
-			// return bestMethod.invoke(target, bestArgs);
-			try {
-				return bestMethod.invoke(target, bestArgs);
-			} catch (InvocationTargetException e) {
-				Throwable cause = e.getCause();
-				if (cause instanceof Exception) {
-					throw (Exception) cause;
-				}
-				throw e;
-			}
-		} else {
-			// throw new IllegalArgumentException("Cannot find command:" + name
-			// + " with args:" + args);
-			// { derek
-			ArrayList<String> list = new ArrayList<String>();
-			for (Class<?>[] types : possibleTypes) {
-				StringBuilder buf = new StringBuilder();
-				buf.append('(');
-				for (Class<?> type : types) {
-					if (buf.length() > 1) {
-						buf.append(", ");
-					}
-					buf.append(type.getSimpleName());
-				}
-				buf.append(')');
-				list.add(buf.toString());
-			}
+        if (bestMethod != null)
+        {
+            bestMethod.setAccessible(true);
+            // derek: BUGFIX catch InvocationTargetException
+            // return bestMethod.invoke(target, bestArgs);
+            try
+            {
+                return bestMethod.invoke(target, bestArgs);
+            }
+            catch (InvocationTargetException e)
+            {
+                Throwable cause = e.getCause();
+                if (cause instanceof Exception)
+                {
+                    throw (Exception) cause;
+                }
+                throw e;
+            }
+        }
+        else
+        {
+            // throw new IllegalArgumentException("Cannot find command:" + name
+            // + " with args:" + args);
+            // { derek
+            ArrayList<String> list = new ArrayList<String>();
+            for (Class<?>[] types : possibleTypes)
+            {
+                StringBuilder buf = new StringBuilder();
+                buf.append('(');
+                for (Class<?> type : types)
+                {
+                    if (buf.length() > 1)
+                    {
+                        buf.append(", ");
+                    }
+                    buf.append(type.getSimpleName());
+                }
+                buf.append(')');
+                list.add(buf.toString());
+            }
 
-			throw new IllegalArgumentException(String.format(
-					"Cannot coerce %s%s to any of %s", name, args, list));
-			// } derek
-		}
-	}
+            throw new IllegalArgumentException(
+                String.format("Cannot coerce %s%s to any of %s", name, args, list));
+            // } derek
+        }
+    }
 
-	/**
-	 * Complex routein to convert the arguments given from the command line to
-	 * the arguments of the method call. First, an attempt is made to convert
-	 * each argument. If this fails, a check is made to see if varargs can be
-	 * applied. This happens when the last method argument is an array.
-	 * 
-	 * @param session
-	 * @param target
-	 * @param m
-	 * @param types
-	 * @param out
-	 * @param in
-	 * @return
-	 * @throws Exception
-	 */
-	@SuppressWarnings("unchecked")
-    private int coerce(CommandSession session, Object target, Method m,
-			Class<?> types[], Object out[], List<Object> in) throws Exception {
-		Annotation[][] pas = m.getParameterAnnotations();
+    /**
+     * Complex routein to convert the arguments given from the command line to
+     * the arguments of the method call. First, an attempt is made to convert
+     * each argument. If this fails, a check is made to see if varargs can be
+     * applied. This happens when the last method argument is an array.
+     *
+     * @param session
+     * @param target
+     * @param m
+     * @param types
+     * @param out
+     * @param in
+     * @return
+     * @throws Exception
+     */
+    @SuppressWarnings("unchecked")
+    private int coerce(
+        CommandSession session, Object target, Method m,
+        Class<?> types[], Object out[], List<Object> in)
+        throws Exception
+    {
+        Annotation[][] pas = m.getParameterAnnotations();
 
         int start = 0;
-		for (int argIndex = 0; argIndex < pas.length; argIndex++) {
-			Annotation as[] = pas[argIndex];
-			for (int a = 0; a < as.length; a++) {
-                if (as[a] instanceof Option) {
-					Option o = (Option) as[a];
-					out[argIndex] = coerce(session, target, types[argIndex], o
-							.dflt());
+        for (int argIndex = 0; argIndex < pas.length; argIndex++)
+        {
+            Annotation as[] = pas[argIndex];
+            for (int a = 0; a < as.length; a++)
+            {
+                if (as[a] instanceof Option)
+                {
+                    Option o = (Option) as[a];
+                    out[argIndex] = coerce(session, target, types[argIndex], o.dflt());
                     start = argIndex + 1;
-                } else if (as[a] instanceof Flag) {
-					out[argIndex] = coerce(session, target, types[argIndex],
-							false);
+                }
+                else if (as[a] instanceof Flag)
+                {
+                    out[argIndex] = coerce(session, target, types[argIndex],
+                        false);
                     start = argIndex + 1;
-				}
-			}
-		}
+                }
+            }
+        }
 
-		in = new ArrayList(in);
-		for (Iterator<Object> i = in.iterator(); i.hasNext();) {
-			Object item = i.next();
-			if (item instanceof String) {
-				String option = (String) item;
-				if (option.startsWith("-")) {
-					for (int argIndex = 0; argIndex < pas.length; argIndex++) {
-						Annotation as[] = pas[argIndex];
-						for (int a = 0; a < as.length; a++) {
-                            if (as[a] instanceof Option) {
-								Option o = (Option) as[a];
-								if (o.name().equals(option)) {
-									i.remove();
-									assert i.hasNext();
-									Object value = i.next();
-									i.remove();
-									out[argIndex] = coerce(session, target,
-											types[argIndex], value);
-								}
-                            } else if (as[a] instanceof Flag) {
-								Flag o = (Flag) as[a];
-								if (o.name().equals(option)) {
-									i.remove();
-									out[argIndex] = coerce(session, target,
-											types[argIndex], true);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
+        in = new ArrayList(in);
+        for (Iterator<Object> itArgs = in.iterator(); itArgs.hasNext();)
+        {
+            Object item = itArgs.next();
+            if (item instanceof String)
+            {
+                String option = (String) item;
+                if (option.startsWith("-"))
+                {
+                    for (int argIndex = 0; argIndex < pas.length; argIndex++)
+                    {
+                        Annotation as[] = pas[argIndex];
+                        for (int a = 0; a < as.length; a++)
+                        {
+                            if (as[a] instanceof Option)
+                            {
+                                Option o = (Option) as[a];
+                                if (o.name().equals(option))
+                                {
+                                    itArgs.remove();
+                                    assert itArgs.hasNext();
+                                    Object value = itArgs.next();
+                                    itArgs.remove();
+                                    out[argIndex] = coerce(session, target,
+                                        types[argIndex], value);
+                                }
+                            }
+                            else if (as[a] instanceof Flag)
+                            {
+                                Flag o = (Flag) as[a];
+                                if (o.name().equals(option))
+                                {
+                                    itArgs.remove();
+                                    out[argIndex] = coerce(session, target,
+                                        types[argIndex], true);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
 
-		int i = start;
-		while (i < out.length) {
-			out[i] = null;
-			try {
-				// Try to convert one argument
-				// derek: add empty array as extra argument
-				// out[i] = coerce(session, target, types[i], in.get(i));
-				if (in.size() == 0) {
-					out[i] = NO_MATCH;
-				} else {
-					out[i] = coerce(session, target, types[i], in.get(0));
-                    if (out[i] != NO_MATCH) {
+        int i = start;
+        while (i < out.length)
+        {
+            out[i] = null;
+            try
+            {
+                // Try to convert one argument
+                // derek: add empty array as extra argument
+                // out[i] = coerce(session, target, types[i], in.get(i));
+                if (in.size() == 0)
+                {
+                    out[i] = NO_MATCH;
+                }
+                else
+                {
+                    out[i] = coerce(session, target, types[i], in.get(0));
+                    if (out[i] != NO_MATCH)
+                    {
                         in.remove(0);
                     }
-				}
+                }
 
-				if (out[i] == NO_MATCH) {
-					// Failed
-					// No match, check for varargs
-					if (types[i].isArray() && i == types.length - 1) {
-						// Try to parse the remaining arguments in an array
-						Class<?> component = types[i].getComponentType();
-						Object components = Array.newInstance(component, in.size());
-						int n = i;
-						while (in.size() > 0) {
-							Object t = coerce(session, target, component, in.remove(0));
-							if (t == NO_MATCH) {
-								return -1;
-							}
-							Array.set(components, i - n, t);
-							i++;
-						}
-						out[n] = components;
-						// Is last element, so we will quite hereafter
-						// return n;
-						if (in.size() == 0) {
-							++i;
-						}
-						return i; // derek - return number of args converted
-					}
-					return -1;
-				}
-				i++;
-			} catch (Exception e) {
-				System.err.println("Reflective:" + e);
-				e.printStackTrace();
+                if (out[i] == NO_MATCH)
+                {
+                    // Failed
+                    // No match, check for varargs
+                    if (types[i].isArray() && (i == types.length - 1))
+                    {
+                        // Try to parse the remaining arguments in an array
+                        Class<?> component = types[i].getComponentType();
+                        Object components = Array.newInstance(component, in.size());
+                        int n = i;
+                        while (in.size() > 0)
+                        {
+                            Object t = coerce(session, target, component, in.remove(0));
+                            if (t == NO_MATCH)
+                            {
+                                return -1;
+                            }
+                            Array.set(components, i - n, t);
+                            i++;
+                        }
+                        out[n] = components;
+                        // Is last element, so we will quite hereafter
+                        // return n;
+                        if (in.size() == 0)
+                        {
+                            ++i;
+                        }
+                        return i; // derek - return number of args converted
+                    }
+                    return -1;
+                }
+                i++;
+            }
+            catch (Exception e)
+            {
+                System.err.println("Reflective:" + e);
+                e.printStackTrace();
 
-				// should get rid of those exceptions, but requires
-				// reg ex matching to see if it throws an exception.
-				// dont know what is better
-				return -1;
-			}
-		}
-		return i;
-	}
+                // should get rid of those exceptions, but requires
+                // reg ex matching to see if it throws an exception.
+                // dont know what is better
+                return -1;
+            }
+        }
+        return i;
+    }
 
-	Object coerce(CommandSession session, Object target, Class<?> type,
-			Object arg) throws Exception {
-		if (arg == null) {
-			return null;
-		}
+    Object coerce(CommandSession session, Object target, Class<?> type,
+        Object arg) throws Exception
+    {
+        if (arg == null)
+        {
+            return null;
+        }
 
-		if (type.isAssignableFrom(arg.getClass())) {
-			return arg;
-		}
+        if (type.isAssignableFrom(arg.getClass()))
+        {
+            return arg;
+        }
 
-		Object converted = session.convert(type, arg);
-		if (converted != null) {
-			return converted;
-		}
+        Object converted = session.convert(type, arg);
+        if (converted != null)
+        {
+            return converted;
+        }
 
-		String string = arg.toString();
-		if (type.isAssignableFrom(String.class)) {
-			return string;
-		}
+        String string = arg.toString();
+        if (type.isAssignableFrom(String.class))
+        {
+            return string;
+        }
 
-		if (type.isArray()) {
-			// Must handle array types
-			return NO_MATCH;
-		} else {
-			if (!type.isPrimitive()) {
-				try {
-					return type.getConstructor(String.class)
-							.newInstance(string);
-				} catch (Exception e) {
-					return NO_MATCH;
-				}
-			}
-		}
+        if (type.isArray())
+        {
+            // Must handle array types
+            return NO_MATCH;
+        }
+        else
+        {
+            if (!type.isPrimitive())
+            {
+                try
+                {
+                    return type.getConstructor(String.class).newInstance(string);
+                }
+                catch (Exception e)
+                {
+                    return NO_MATCH;
+                }
+            }
+        }
 
-		try {
-			if (type == boolean.class) {
-				return new Boolean(string);
-			} else {
-				if (type == byte.class) {
-					return new Byte(string);
-				} else {
-					if (type == char.class) {
-						if (string.length() == 1) {
-							return string.charAt(0);
-						}
-					} else {
-						if (type == short.class) {
-							return new Short(string);
-						} else {
-							if (type == int.class) {
-								return new Integer(string);
-							} else {
-								if (type == float.class) {
-									return new Float(string);
-								} else {
-									if (type == double.class) {
-										return new Double(string);
-									} else {
-										if (type == long.class) {
-											return new Long(string);
-										}
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		} catch (NumberFormatException e) {
-		}
+        try
+        {
+            if (type == boolean.class)
+            {
+                return new Boolean(string);
+            }
+            else
+            {
+                if (type == byte.class)
+                {
+                    return new Byte(string);
+                }
+                else
+                {
+                    if (type == char.class)
+                    {
+                        if (string.length() == 1)
+                        {
+                            return string.charAt(0);
+                        }
+                    }
+                    else
+                    {
+                        if (type == short.class)
+                        {
+                            return new Short(string);
+                        }
+                        else
+                        {
+                            if (type == int.class)
+                            {
+                                return new Integer(string);
+                            }
+                            else
+                            {
+                                if (type == float.class)
+                                {
+                                    return new Float(string);
+                                }
+                                else
+                                {
+                                    if (type == double.class)
+                                    {
+                                        return new Double(string);
+                                    }
+                                    else
+                                    {
+                                        if (type == long.class)
+                                        {
+                                            return new Long(string);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        catch (NumberFormatException e)
+        {
+        }
 
-		return NO_MATCH;
-	}
+        return NO_MATCH;
+    }
 
-	public static boolean hasCommand(Object target, String function) {
-		Method[] methods = target.getClass().getMethods();
-		for (Method m : methods) {
-			if (m.getName().equals(function)) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
+    public static boolean hasCommand(Object target, String function)
+    {
+        Method[] methods = target.getClass().getMethods();
+        for (Method m : methods)
+        {
+            if (m.getName().equals(function))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/osgi/service/command/Flag.java b/gogo/runtime/src/main/java/org/osgi/service/command/Flag.java
index 9b340ab..905e906 100644
--- a/gogo/runtime/src/main/java/org/osgi/service/command/Flag.java
+++ b/gogo/runtime/src/main/java/org/osgi/service/command/Flag.java
@@ -25,6 +25,7 @@
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.PARAMETER})
-public @interface Flag {
-	String name();
-}
+public @interface Flag
+{
+    String name();
+}
\ No newline at end of file
diff --git a/gogo/runtime/src/main/java/org/osgi/service/command/Option.java b/gogo/runtime/src/main/java/org/osgi/service/command/Option.java
index 328d981..985c6fa 100644
--- a/gogo/runtime/src/main/java/org/osgi/service/command/Option.java
+++ b/gogo/runtime/src/main/java/org/osgi/service/command/Option.java
@@ -25,7 +25,8 @@
 
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.PARAMETER})
-public @interface Option {
-	String name();
-	String dflt();
-}
\ No newline at end of file
+public @interface Option
+{
+    String name();
+    String dflt();
+}
