diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/PropertyTag.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/PropertyTag.java
index 4fca54e..f5215fa 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/PropertyTag.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/PropertyTag.java
@@ -138,57 +138,81 @@
         // we now check all options
         if (values == null || values.length == 0 ) {
             long[] lValues = this.annotation.longValue();
-            if ( lValues.length == 0 ) {
+            if ( lValues == null || lValues.length == 0 ) {
                 double[] dValues = this.annotation.doubleValue();
-                if ( dValues.length == 0 ) {
+                if ( dValues == null || dValues.length == 0 ) {
                     float[] fValues = this.annotation.floatValue();
-                    if ( fValues.length == 0 ) {
+                    if ( fValues == null || fValues.length == 0 ) {
                         int[] iValues = this.annotation.intValue();
-                        if ( iValues.length == 0 ) {
+                        if ( iValues == null || iValues.length == 0 ) {
                             byte[] byteValues = this.annotation.byteValue();
-                            if ( byteValues.length == 0 ) {
+                            if ( byteValues == null || byteValues.length == 0 ) {
                                 char[] cValues = this.annotation.charValue();
-                                if ( cValues.length == 0 ) {
+                                if ( cValues == null || cValues.length == 0 ) {
                                     boolean[] boolValues = this.annotation.boolValue();
-                                    if ( boolValues.length == 0 ) {
+                                    if ( boolValues == null || boolValues.length == 0 ) {
                                         short[] sValues  = this.annotation.shortValue();
-                                        if ( boolValues.length != 0 ) {
-                                            values = Arrays.asList(sValues).toArray();
+                                        if ( sValues != null && sValues.length != 0 ) {
+                                            values = new Object[sValues.length];
+                                            for(int i=0;i<sValues.length;i++) {
+                                                values[i] = sValues[i];
+                                            }
                                             type = "Short";
                                         }
                                     } else {
-                                        values = Arrays.asList(boolValues).toArray();
+                                        values = new Object[boolValues.length];
+                                        for(int i=0;i<boolValues.length;i++) {
+                                            values[i] = boolValues[i];
+                                        }
                                         type = "Boolean";
                                     }
                                 } else {
-                                    values = Arrays.asList(cValues).toArray();
+                                    values = new Object[cValues.length];
+                                    for(int i=0;i<cValues.length;i++) {
+                                        values[i] = cValues[i];
+                                    }
                                     type = "Char";
                                 }
                             } else {
-                                values = Arrays.asList(byteValues).toArray();
+                                values = new Object[byteValues.length];
+                                for(int i=0;i<byteValues.length;i++) {
+                                    values[i] = byteValues[i];
+                                }
                                 type = "Byte";
                             }
                         } else {
-                            values = Arrays.asList(fValues).toArray();
+                            values = new Object[iValues.length];
+                            for(int i=0;i<iValues.length;i++) {
+                                values[i] = iValues[i];
+                            }
                             type = "Integer";
                         }
                     } else {
-                        values = Arrays.asList(fValues).toArray();
+                        values = new Object[fValues.length];
+                        for(int i=0;i<fValues.length;i++) {
+                            values[i] = fValues[i];
+                        }
                         type = "Float";
                     }
                 } else {
-                    values = Arrays.asList(dValues).toArray();
+                    values = new Object[dValues.length];
+                    for(int i=0;i<dValues.length;i++) {
+                        values[i] = dValues[i];
+                    }
                     type = "Double";
                 }
             } else {
-                values = Arrays.asList(lValues).toArray();
+                values = new Object[lValues.length];
+                for(int i=0;i<lValues.length;i++) {
+                    values[i] = lValues[i];
+                }
                 type = "Long";
             }
         } else {
             type = "String";
         }
 
-        if ( values != null ) {
+        if ( values != null && values.length > 0 ) {
             map.put(Constants.PROPERTY_TYPE, type);
             if (values.length == 1) {
                 map.put(Constants.PROPERTY_VALUE, values[0].toString());
diff --git a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/Util.java b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/Util.java
index 8ea1507..11f7b1e 100644
--- a/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/Util.java
+++ b/scrplugin/src/main/java/org/apache/felix/scrplugin/tags/annotation/defaulttag/Util.java
@@ -18,7 +18,7 @@
  */
 package org.apache.felix.scrplugin.tags.annotation.defaulttag;
 
-import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.felix.scrplugin.tags.*;
@@ -69,19 +69,25 @@
         }
     }
 
-    public static String[] getStringValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as string values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of string values or null.
+     */
+    public static String[] getStringValues(Annotation annotation, JavaClassDescription desc, String name)
+    {
         final Object obj = annotation.getNamedParameter(name);
         if ( obj != null ) {
-            List<String> list;
-            if (obj instanceof String) {
-                list = new ArrayList<String>();
-                list.add((String)obj);
+            if (obj instanceof String)
+            {
+                return new String[] {stripQuotes(desc, obj.toString())};
             }
-            else {
-                list = (List<String>)obj;
-            }
+            final List<String> list = (List<String>)obj;
             String[] values = new String[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = stripQuotes(desc, list.get(i));
             }
             return values;
@@ -89,19 +95,26 @@
         return null;
     }
 
-    public static long[] getLongValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as long values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of long values or null.
+     */
+    public static long[] getLongValues(Annotation annotation, JavaClassDescription desc, String name)
+    {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Long> list;
-            if (obj instanceof Long) {
-                list = new ArrayList<Long>();
-                list.add((Long)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new long[] {Long.valueOf(stripQuotes(desc, obj.toString()))};
             }
-            else {
-                list = (List<Long>)obj;
-            }
+            final List<Long> list = (List<Long>)obj;
             long[] values = new long[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
@@ -109,19 +122,26 @@
         return null;
     }
 
-    public static int[] getIntValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as long values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of long values or null.
+     */
+    public static int[] getIntValues(Annotation annotation, JavaClassDescription desc, String name)
+    {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Integer> list;
-            if (obj instanceof Integer) {
-                list = new ArrayList<Integer>();
-                list.add((Integer)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new int[] {Integer.valueOf(stripQuotes(desc, obj.toString()))};
             }
-            else {
-                list = (List<Integer>)obj;
-            }
+            final List<Integer> list = (List<Integer>)obj;
             int[] values = new int[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
@@ -129,19 +149,26 @@
         return null;
     }
 
-    public static float[] getFloatValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as float values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of float values or null.
+     */
+    public static float[] getFloatValues(Annotation annotation, JavaClassDescription desc, String name)
+    {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Float> list;
-            if (obj instanceof Float) {
-                list = new ArrayList<Float>();
-                list.add((Float)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new float[] {Float.valueOf(stripQuotes(desc, obj.toString()))};
             }
-            else {
-                list = (List<Float>)obj;
-            }
+            final List<Float> list = (List<Float>)obj;
             float[] values = new float[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
@@ -149,19 +176,26 @@
         return null;
     }
 
-    public static double[] getDoubleValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as double values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of double values or null.
+     */
+    public static double[] getDoubleValues(Annotation annotation, JavaClassDescription desc, String name)
+    {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Double> list;
-            if (obj instanceof Double) {
-                list = new ArrayList<Double>();
-                list.add((Double)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new double[] {Double.valueOf(stripQuotes(desc, obj.toString()))};
             }
-            else {
-                list = (List<Double>)obj;
-            }
+            final List<Double> list = (List<Double>)obj;
             double[] values = new double[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
@@ -169,19 +203,25 @@
         return null;
     }
 
+    /**
+     * Helper method to get the values of an annotation as char values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of char values or null.
+     */
     public static char[] getCharValues(Annotation annotation, JavaClassDescription desc, String name) {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Character> list;
-            if (obj instanceof Character) {
-                list = new ArrayList<Character>();
-                list.add((Character)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new char[] {Character.valueOf(stripQuotes(desc, obj.toString()).charAt(0))};
             }
-            else {
-                list = (List<Character>)obj;
-            }
+            final List<Character> list = (List<Character>)obj;
             char[] values = new char[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
@@ -189,19 +229,26 @@
         return null;
     }
 
-    public static short[] getShortValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as short values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of short values or null.
+     */
+   public static short[] getShortValues(Annotation annotation, JavaClassDescription desc, String name)
+   {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Short> list;
-            if (obj instanceof Short) {
-                list = new ArrayList<Short>();
-                list.add((Short)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new short[] {Short.valueOf(stripQuotes(desc, obj.toString()))};
             }
-            else {
-                list = (List<Short>)obj;
-            }
+            final List<Short> list = (List<Short>)obj;
             short[] values = new short[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
@@ -209,19 +256,26 @@
         return null;
     }
 
-    public static byte[] getByteValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as byte values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of byte values or null.
+     */
+   public static byte[] getByteValues(Annotation annotation, JavaClassDescription desc, String name)
+   {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Byte> list;
-            if (obj instanceof Byte) {
-                list = new ArrayList<Byte>();
-                list.add((Byte)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new byte[] {Byte.valueOf(stripQuotes(desc, obj.toString()))};
             }
-            else {
-                list = (List<Byte>)obj;
-            }
+            final List<Byte> list = (List<Byte>)obj;
             byte[] values = new byte[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
@@ -229,19 +283,26 @@
         return null;
     }
 
-    public static boolean[] getBooleanValues(Annotation annotation, JavaClassDescription desc, String name) {
+    /**
+     * Helper method to get the values of an annotation as boolean values.
+     * @param annotation The annotation.
+     * @param desc The java class description.
+     * @param name The attribute name from the annotation.
+     * @return The array of boolean values or null.
+     */
+    public static boolean[] getBooleanValues(Annotation annotation, JavaClassDescription desc, String name)
+    {
         final Object obj = annotation.getNamedParameter(name);
-        if ( obj != null ) {
-            List<Boolean> list;
-            if (obj instanceof Boolean) {
-                list = new ArrayList<Boolean>();
-                list.add((Boolean)obj);
+        if ( obj != null )
+        {
+            if ( !(obj instanceof Collection<?>))
+            {
+                return new boolean[] {Boolean.valueOf(stripQuotes(desc, obj.toString()))};
             }
-            else {
-                list = (List<Boolean>)obj;
-            }
+            final List<Boolean> list = (List<Boolean>)obj;
             boolean[] values = new boolean[list.size()];
-            for (int i=0; i<values.length; i++) {
+            for (int i=0; i<values.length; i++)
+            {
                 values[i] = list.get(i);
             }
             return values;
