diff --git a/resolver/pom.xml b/resolver/pom.xml
index 5a756d2..1c8cd58 100644
--- a/resolver/pom.xml
+++ b/resolver/pom.xml
@@ -20,7 +20,7 @@
   <parent>
     <groupId>org.apache.felix</groupId>
     <artifactId>felix-parent</artifactId>
-    <version>2.1</version>
+    <version>3</version>
     <relativePath>../pom/pom.xml</relativePath>
   </parent>
   <modelVersion>4.0.0</modelVersion>
@@ -55,24 +55,20 @@
       <scope>test</scope>
     </dependency>
   </dependencies>
+  <properties>
+    <felix.java.version>5</felix.java.version>
+  </properties>
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <target>1.5</target>
-          <source>1.5</source>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
-        <version>2.3.7</version>
+        <version>2.5.4</version>
         <extensions>true</extensions>
         <configuration>
           <instructions>
             <_sources>true</_sources>
+            <_sourcepath>${build.sourceDirectory}</_sourcepath>
             <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
             <Bundle-Activator>
               org.apache.felix.resolver.Activator
diff --git a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
index 481f0fb..9a98d33 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/ResolverImpl.java
@@ -1002,7 +1002,7 @@
 //            else
             {
                 String s = candSourceCap.getDirectives().get(Namespace.CAPABILITY_USES_DIRECTIVE);
-                if (s != null && !s.isEmpty())
+                if (s != null && s.length() > 0)
                 {
                     // Parse these uses directive.
                     uses = session.getUsesCache().get(s);
@@ -1710,7 +1710,7 @@
                 // uses constraints so they are included for consistency
                 // checking.
                 String uses = sourceCap.getDirectives().get(Namespace.CAPABILITY_USES_DIRECTIVE);
-                if ((uses != null) && !uses.isEmpty())
+                if ((uses != null) && uses.length() > 0)
                 {
                     sources.put(sourceCap, Collections.singleton(sourceCap));
                 }
diff --git a/resolver/src/main/java/org/apache/felix/resolver/util/ArrayMap.java b/resolver/src/main/java/org/apache/felix/resolver/util/ArrayMap.java
index 86bef20..b4a559c 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/util/ArrayMap.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/util/ArrayMap.java
@@ -19,7 +19,6 @@
 package org.apache.felix.resolver.util;
 
 import java.util.*;
-import java.util.function.Function;
 
 @SuppressWarnings("NullableProblems")
 public class ArrayMap<K, V> extends AbstractMap<K, V> {
@@ -92,23 +91,6 @@
         throw new UnsupportedOperationException();
     }
 
-    @SuppressWarnings("unchecked")
-    public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
-        for (int i = 0, l = size << 1; i < l; i += 2) {
-            if (key.equals(table[i])) {
-                return (V) table[i + 1];
-            }
-        }
-        if (size << 1 == table.length) {
-            Object[] n = new Object[table.length << 1];
-            System.arraycopy(table, 0, n, 0, table.length);
-            table = n;
-        }
-        int i = size++ << 1;
-        table[i++] = key;
-        return (V) (table[i] = mappingFunction.apply(key));
-    }
-
     @Override
     public Collection<V> values() {
         if (values == null) {
diff --git a/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteList.java b/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteList.java
index 4af5dfa..b11e15b 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteList.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteList.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.resolver.util;
 
+import java.lang.reflect.Array;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
@@ -52,7 +53,7 @@
 
     @SuppressWarnings("unchecked")
     public E set(int index, E element) {
-        data = Arrays.copyOf(data, data.length);
+        data = CopyOnWriteSet.copyOf(data, data.length);
         E prev = (E) data[index];
         data[index] = element;
         return prev;
@@ -123,7 +124,7 @@
         int size = data.length;
         if (a.length < size)
             // Make a new array of a's runtime type, but my contents:
-            return (T[]) Arrays.copyOf(data, size, a.getClass());
+            return (T[]) CopyOnWriteSet.copyOf(data, size, a.getClass());
         System.arraycopy(data, 0, a, 0, size);
         if (a.length > size)
             a[size] = null;
@@ -191,7 +192,7 @@
             }
         }
         if (modified) {
-            data = Arrays.copyOf(d, idx);
+            data = CopyOnWriteSet.copyOf(d, idx);
         }
         return modified;
     }
diff --git a/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteSet.java b/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteSet.java
index b007b14..92419f3 100644
--- a/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteSet.java
+++ b/resolver/src/main/java/org/apache/felix/resolver/util/CopyOnWriteSet.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.resolver.util;
 
+import java.lang.reflect.Array;
 import java.util.AbstractSet;
 import java.util.Arrays;
 import java.util.Collection;
@@ -102,7 +103,7 @@
         int size = data.length;
         if (a.length < size)
             // Make a new array of a's runtime type, but my contents:
-            return (T[]) Arrays.copyOf(data, size, a.getClass());
+            return (T[]) copyOf(data, size, a.getClass());
         System.arraycopy(data, 0, a, 0, size);
         if (a.length > size)
             a[size] = null;
@@ -211,7 +212,7 @@
                 cs[added++] = e;
         }
         if (added > 0) {
-            Object[] newElements = Arrays.copyOf(elements, len + added);
+            Object[] newElements = copyOf(elements, len + added);
             System.arraycopy(cs, 0, newElements, len, added);
             data = newElements;
             return true;
@@ -231,4 +232,20 @@
         throw new UnsupportedOperationException();
     }
 
+    @SuppressWarnings("unchecked")
+    public static <T> T[] copyOf(T[] original, int newLength) {
+        return (T[]) copyOf(original, newLength, original.getClass());
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
+        T[] copy;
+        if ((Object) newType == Object[].class) {
+            copy = (T[]) new Object[newLength];
+        } else {
+            copy = (T[]) Array.newInstance(newType.getComponentType(), newLength);
+        }
+        System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
+        return copy;
+    }
 }
