diff --git a/configadmin/pom.xml b/configadmin/pom.xml
index a6e05e0..8dd9426 100644
--- a/configadmin/pom.xml
+++ b/configadmin/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.felix</groupId>
         <artifactId>felix-parent</artifactId>
-        <version>2</version>
+        <version>2.1</version>
         <relativePath>../pom/pom.xml</relativePath>
     </parent>
 
@@ -74,8 +74,6 @@
         <bundle.file.name>
             ${bundle.build.name}/${project.build.finalName}.jar
         </bundle.file.name>
-
-		<api-package-version>1.0</api-package-version>
     </properties>
 
 
@@ -83,16 +81,24 @@
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
-            <version>4.0.0</version>
+            <version>4.1.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
-            <version>4.2.0</version>
+            <version>4.3.0</version>
             <scope>provided</scope>
         </dependency>
-        
+
+        <!-- BND export annotations -->        
+        <dependency>
+            <groupId>biz.aQute</groupId>
+            <artifactId>bndlib</artifactId>
+            <version>1.50.0</version>
+            <scope>provided</scope>
+        </dependency>
+
         <!-- Integration Testing with Pax Exam -->
         <dependency>
             <groupId>junit</groupId>
@@ -147,19 +153,17 @@
                             org.apache.felix.cm.impl.ConfigurationManager
                         </Bundle-Activator>
                         <Export-Package>
+                            <!-- just list, version from package-info classes -->
                             org.apache.felix.cm;
-                            org.apache.felix.cm.file;version=${api-package-version};provide:=true,
-                            org.osgi.service.cm;version=1.4;-split-package:=merge-first;provide:=true
+                            org.apache.felix.cm.file,
+                            org.osgi.service.cm;provide:=true
                         </Export-Package>
                         <Private-Package>
                             org.apache.felix.cm.impl,
                             org.osgi.util.tracker
                         </Private-Package>
-                        <Import-Package>
-                            org.osgi.service.cm;version="[1.4,1.5)",
-                            *
-                        </Import-Package>
                         <DynamicImport-Package>
+                            <!-- overwrite version from compendium bundle -->
                             org.osgi.service.log;version="1.3"
                         </DynamicImport-Package>
 						<Export-Service>
@@ -178,7 +182,6 @@
                     </instructions>
                 </configuration>
             </plugin>
-            <!-- Make sure to not use non Java 1.3 API -->
             <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>animal-sniffer-maven-plugin</artifactId>
@@ -186,7 +189,7 @@
                 <configuration>
                     <signature>
                         <groupId>org.codehaus.mojo.signature</groupId>
-                        <artifactId>java13-sun</artifactId>
+                        <artifactId>java15</artifactId>
                         <version>1.0</version>
                     </signature>
                 </configuration>
@@ -199,40 +202,13 @@
                     </execution>
                 </executions>
             </plugin>
-            <!--
-                configure default compilation for Java 1.3 and integration
-                test compilation for Java 5 (since integration tests use
-                Java Annotations for Pax Exam)
-            -->
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>test-compile-java5</id>
-                        <goals>
-                            <goal>testCompile</goal>
-                        </goals>
-                        <configuration>
-                            <source>1.5</source>
-                            <target>1.5</target>
-                            <testExcludes>
-                                <testExclude>**/cm/*</testExclude>
-                                <testExclude>**/cm/file/*</testExclude>
-                                <testExclude>**/cm/impl/**</testExclude>
-                            </testExcludes>
-                            <testIncludes>
-                                <testInclude>**/integration/**</testInclude>
-                            </testIncludes>
-                        </configuration>
-                    </execution>
-                </executions>
                 <configuration>
-                    <testExcludes>
-                        <testExclude>**/integration/**</testExclude>
-                    </testExcludes>
+                    <source>1.5</source>
+                    <target>1.5</target>
                 </configuration>
             </plugin>
-
             <!--
                 Exclude Integration tests in (default) unit tests and
                 conversely enable integration tests for integration testing
diff --git a/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES b/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES
index 659f29e..114cc1e 100644
--- a/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES
+++ b/configadmin/src/main/appended-resources/META-INF/DEPENDENCIES
@@ -2,14 +2,14 @@
 
 This product includes software developed at
 The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
+Copyright (c) OSGi Alliance (2000, 2012).
 Licensed under the Apache License 2.0. 
 
 II. Used Third-Party Software
 
 This product uses software developed at
 The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
+Copyright (c) OSGi Alliance (2000, 2012).
 Licensed under the Apache License 2.0. 
 
 This product uses software developed at
diff --git a/configadmin/src/main/appended-resources/META-INF/NOTICE b/configadmin/src/main/appended-resources/META-INF/NOTICE
index 46c62c4..c87a187 100644
--- a/configadmin/src/main/appended-resources/META-INF/NOTICE
+++ b/configadmin/src/main/appended-resources/META-INF/NOTICE
@@ -1,4 +1,4 @@
 This product includes software developed at
 The OSGi Alliance (http://www.osgi.org/).
-Copyright (c) OSGi Alliance (2000, 2009).
+Copyright (c) OSGi Alliance (2000, 2012).
 Licensed under the Apache License 2.0.
\ No newline at end of file
diff --git a/configadmin/src/main/java/org/apache/felix/cm/file/package-info.java b/configadmin/src/main/java/org/apache/felix/cm/file/package-info.java
new file mode 100644
index 0000000..1cb467b
--- /dev/null
+++ b/configadmin/src/main/java/org/apache/felix/cm/file/package-info.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+@Version("1.0")
+@Export(optional = "provide:=true")
+package org.apache.felix.cm.file;
+
+
+import aQute.bnd.annotation.Export;
+import aQute.bnd.annotation.Version;
+
+
diff --git a/configadmin/src/main/java/org/apache/felix/cm/package-info.java b/configadmin/src/main/java/org/apache/felix/cm/package-info.java
new file mode 100644
index 0000000..32888b3
--- /dev/null
+++ b/configadmin/src/main/java/org/apache/felix/cm/package-info.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+@Version("1.0")
+@Export(optional = "provide:=true")
+package org.apache.felix.cm;
+
+
+import aQute.bnd.annotation.Export;
+import aQute.bnd.annotation.Version;
+
+
diff --git a/configadmin/src/main/java/org/osgi/framework/ServiceReference.java b/configadmin/src/main/java/org/osgi/framework/ServiceReference.java
new file mode 100644
index 0000000..156e30b
--- /dev/null
+++ b/configadmin/src/main/java/org/osgi/framework/ServiceReference.java
@@ -0,0 +1,180 @@
+/*
+ * $Header: /cvshome/build/org.osgi.framework/src/org/osgi/framework/ServiceReference.java,v 1.20 2007/02/21 16:49:05 hargrave Exp $
+ *
+ * Copyright (c) OSGi Alliance (2000, 2007). All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.osgi.framework;
+
+/**
+ * A reference to a service.
+ *
+ * <p>
+ * The Framework returns <code>ServiceReference</code> objects from the
+ * <code>BundleContext.getServiceReference</code> and
+ * <code>BundleContext.getServiceReferences</code> methods.
+ * <p>
+ * A <code>ServiceReference</code> object may be shared between bundles and
+ * can be used to examine the properties of the service and to get the service
+ * object.
+ * <p>
+ * Every service registered in the Framework has a unique
+ * <code>ServiceRegistration</code> object and may have multiple, distinct
+ * <code>ServiceReference</code> objects referring to it.
+ * <code>ServiceReference</code> objects associated with a
+ * <code>ServiceRegistration</code> object have the same <code>hashCode</code>
+ * and are considered equal (more specifically, their <code>equals()</code>
+ * method will return <code>true</code> when compared).
+ * <p>
+ * If the same service object is registered multiple times,
+ * <code>ServiceReference</code> objects associated with different
+ * <code>ServiceRegistration</code> objects are not equal.
+ *
+ * @see BundleContext#getServiceReference
+ * @see BundleContext#getServiceReferences
+ * @see BundleContext#getService
+ * @ThreadSafe
+ * @version $Revision: 1.20 $
+ */
+
+public interface ServiceReference<T> extends Comparable {
+    /**
+     * Returns the property value to which the specified property key is mapped
+     * in the properties <code>Dictionary</code> object of the service
+     * referenced by this <code>ServiceReference</code> object.
+     *
+     * <p>
+     * Property keys are case-insensitive.
+     *
+     * <p>
+     * This method must continue to return property values after the service has
+     * been unregistered. This is so references to unregistered services (for
+     * example, <code>ServiceReference</code> objects stored in the log) can
+     * still be interrogated.
+     *
+     * @param key The property key.
+     * @return The property value to which the key is mapped; <code>null</code>
+     *         if there is no property named after the key.
+     */
+    public Object getProperty(String key);
+
+    /**
+     * Returns an array of the keys in the properties <code>Dictionary</code>
+     * object of the service referenced by this <code>ServiceReference</code>
+     * object.
+     *
+     * <p>
+     * This method will continue to return the keys after the service has been
+     * unregistered. This is so references to unregistered services (for
+     * example, <code>ServiceReference</code> objects stored in the log) can
+     * still be interrogated.
+     *
+     * <p>
+     * This method is <i>case-preserving </i>; this means that every key in the
+     * returned array must have the same case as the corresponding key in the
+     * properties <code>Dictionary</code> that was passed to the
+     * {@link BundleContext#registerService(String[],Object,java.util.Dictionary)}
+     * or {@link ServiceRegistration#setProperties} methods.
+     *
+     * @return An array of property keys.
+     */
+    public String[] getPropertyKeys();
+
+    /**
+     * Returns the bundle that registered the service referenced by this
+     * <code>ServiceReference</code> object.
+     *
+     * <p>
+     * This method must return <code>null</code> when the service has been
+     * unregistered. This can be used to determine if the service has been
+     * unregistered.
+     *
+     * @return The bundle that registered the service referenced by this
+     *         <code>ServiceReference</code> object; <code>null</code> if
+     *         that service has already been unregistered.
+     * @see BundleContext#registerService(String[],Object,java.util.Dictionary)
+     */
+    public Bundle getBundle();
+
+    /**
+     * Returns the bundles that are using the service referenced by this
+     * <code>ServiceReference</code> object. Specifically, this method returns
+     * the bundles whose usage count for that service is greater than zero.
+     *
+     * @return An array of bundles whose usage count for the service referenced
+     *         by this <code>ServiceReference</code> object is greater than
+     *         zero; <code>null</code> if no bundles are currently using that
+     *         service.
+     *
+     * @since 1.1
+     */
+    public Bundle[] getUsingBundles();
+
+    /**
+     * Tests if the bundle that registered the service referenced by this
+     * <code>ServiceReference</code> and the specified bundle use the same
+     * source for the package of the specified class name.
+     * <p>
+     * This method performs the following checks:
+     * <ol>
+     * <li>Get the package name from the specified class name.</li>
+     * <li>For the bundle that registered the service referenced by this
+     * <code>ServiceReference</code> (registrant bundle); find the source for
+     * the package. If no source is found then return <code>true</code> if the
+     * registrant bundle is equal to the specified bundle; otherwise return
+     * <code>false</code>.</li>
+     * <li>If the package source of the registrant bundle is equal to the
+     * package source of the specified bundle then return <code>true</code>;
+     * otherwise return <code>false</code>.</li>
+     * </ol>
+     *
+     * @param bundle The <code>Bundle</code> object to check.
+     * @param className The class name to check.
+     * @return <code>true</code> if the bundle which registered the service
+     *         referenced by this <code>ServiceReference</code> and the
+     *         specified bundle use the same source for the package of the
+     *         specified class name. Otherwise <code>false</code> is returned.
+     *
+     * @since 1.3
+     */
+    public boolean isAssignableTo(Bundle bundle, String className);
+
+    /**
+     * Compares this <code>ServiceReference</code> with the specified
+     * <code>ServiceReference</code> for order.
+     *
+     * <p>
+     * If this <code>ServiceReference</code> and the specified
+     * <code>ServiceReference</code> have the same
+     * {@link Constants#SERVICE_ID service id} they are equal. This
+     * <code>ServiceReference</code> is less than the specified
+     * <code>ServiceReference</code> if it has a lower
+     * {@link Constants#SERVICE_RANKING service ranking} and greater if it has a
+     * higher service ranking. Otherwise, if this <code>ServiceReference</code>
+     * and the specified <code>ServiceReference</code> have the same
+     * {@link Constants#SERVICE_RANKING service ranking}, this
+     * <code>ServiceReference</code> is less than the specified
+     * <code>ServiceReference</code> if it has a higher
+     * {@link Constants#SERVICE_ID service id} and greater if it has a lower
+     * service id.
+     *
+     * @param reference The <code>ServiceReference</code> to be compared.
+     * @return Returns a negative integer, zero, or a positive integer if this
+     *         <code>ServiceReference</code> is less than, equal to, or
+     *         greater than the specified <code>ServiceReference</code>.
+     * @since 1.4
+     */
+    public int compareTo(Object reference);
+}
diff --git a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationEvent.java b/configadmin/src/main/java/org/osgi/service/cm/ConfigurationEvent.java
deleted file mode 100644
index c215ad4..0000000
--- a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationEvent.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2011). All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.osgi.service.cm;
-
-import org.osgi.framework.ServiceReference;
-
-/**
- * A Configuration Event.
- *
- * <p>
- * {@code ConfigurationEvent} objects are delivered to all registered
- * {@code ConfigurationListener} service objects. ConfigurationEvents must be
- * asynchronously delivered in chronological order with respect to each
- * listener.
- *
- * <p>
- * A type code is used to identify the type of event. The following event types
- * are defined:
- * <ul>
- * <li>{@link #CM_UPDATED}</li>
- * <li>{@link #CM_DELETED}</li>
- * <li>{@link #CM_LOCATION_CHANGED}</li>
- * </ul>
- * Additional event types may be defined in the future.
- *
- * <p>
- * Security Considerations. {@code ConfigurationEvent} objects do not provide
- * {@code Configuration} objects, so no sensitive configuration information is
- * available from the event. If the listener wants to locate the
- * {@code Configuration} object for the specified pid, it must use
- * {@code ConfigurationAdmin}.
- *
- * @see ConfigurationListener
- * @Immutable
- * @version $Id: 1493c281dfd9387837e6399b9b815cdc8dc43453 $
- * @since 1.2
- */
-public class ConfigurationEvent {
-    /**
-     * A {@code Configuration} has been updated.
-     *
-     * <p>
-     * This {@code ConfigurationEvent} type that indicates that a
-     * {@code Configuration} object has been updated with new properties.
-     *
-     * An event is fired when a call to {@link Configuration#update(Dictionary)}
-     * successfully changes a configuration.
-     */
-    public static final int         CM_UPDATED  = 1;
-    /**
-     * A {@code Configuration} has been deleted.
-     *
-     * <p>
-     * This {@code ConfigurationEvent} type that indicates that a
-     * {@code Configuration} object has been deleted.
-     *
-     * An event is fired when a call to {@link Configuration#delete()}
-     * successfully deletes a configuration.
-     */
-    public static final int         CM_DELETED  = 2;
-
-    /**
-     * The location of a {@code Configuration} has been changed.
-     *
-     * <p>
-     * This {@code ConfigurationEvent} type that indicates that the location of
-     * a {@code Configuration} object has been changed.
-     *
-     * An event is fired when a call to
-     * {@link Configuration#setBundleLocation(String)} successfully changes the
-     * location.
-     *
-     * @since 1.4
-     */
-    public static final int         CM_LOCATION_CHANGED = 3;
-    /**
-     * Type of this event.
-     *
-     * @see #getType()
-     */
-    private final int               type;
-    /**
-     * The factory pid associated with this event.
-     */
-    private final String            factoryPid;
-    /**
-     * The pid associated with this event.
-     */
-    private final String            pid;
-    /**
-     * The ConfigurationAdmin service which created this event.
-     */
-    private final ServiceReference  reference;
-
-    /**
-     * Constructs a {@code ConfigurationEvent} object from the given
-     * {@code ServiceReference} object, event type, and pids.
-     *
-     * @param reference The {@code ServiceReference} object of the Configuration
-     *        Admin service that created this event.
-     * @param type The event type. See {@link #getType()}.
-     * @param factoryPid The factory pid of the associated configuration if the
-     *        target of the configuration is a ManagedServiceFactory. Otherwise
-     *        {@code null} if the target of the configuration is a
-     *        ManagedService.
-     * @param pid The pid of the associated configuration.
-     */
-    public ConfigurationEvent(ServiceReference reference,
-            int type,
-            String factoryPid, String pid) {
-        this.reference = reference;
-        this.type = type;
-        this.factoryPid = factoryPid;
-        this.pid = pid;
-        if ((reference == null) || (pid == null)) {
-            throw new NullPointerException("reference and pid must not be null");
-        }
-    }
-
-    /**
-     * Returns the factory pid of the associated configuration.
-     *
-     * @return Returns the factory pid of the associated configuration if the
-     *         target of the configuration is a ManagedServiceFactory. Otherwise
-     *         {@code null} if the target of the configuration is a
-     *         ManagedService.
-     */
-    public String getFactoryPid() {
-        return factoryPid;
-    }
-
-    /**
-     * Returns the pid of the associated configuration.
-     *
-     * @return Returns the pid of the associated configuration.
-     */
-    public String getPid() {
-        return pid;
-    }
-
-    /**
-     * Return the type of this event.
-     * <p>
-     * The type values are:
-     * <ul>
-     * <li>{@link #CM_UPDATED}</li>
-     * <li>{@link #CM_DELETED}</li>
-     * <li>{@link #CM_LOCATION_CHANGED}</li>
-     * </ul>
-     *
-     * @return The type of this event.
-     */
-    public int getType() {
-        return type;
-    }
-
-    /**
-     * Return the {@code ServiceReference} object of the Configuration
-     * Admin service that created this event.
-     *
-     * @return The {@code ServiceReference} object for the Configuration
-     *         Admin service that created this event.
-     */
-    public ServiceReference getReference() {
-        return reference;
-    }
-}
diff --git a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationPermission.java b/configadmin/src/main/java/org/osgi/service/cm/ConfigurationPermission.java
deleted file mode 100644
index fb3eb4e..0000000
--- a/configadmin/src/main/java/org/osgi/service/cm/ConfigurationPermission.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2011). All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.osgi.service.cm;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.ObjectStreamField;
-import java.security.BasicPermission;
-import java.security.Permission;
-import java.security.PermissionCollection;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Indicates a bundle's authority to configure bundles or be updated by
- * Configuration Admin.
- *
- * @ThreadSafe
- * @version $Id: 0d700c494f2dc2bbe05165bf5c79fe185c9f0a4a $
- * @since 1.2
- */
-
-public final class ConfigurationPermission extends BasicPermission {
-    static final long               serialVersionUID    = 5716868734811965383L;
-    /**
-     * Provides permission to create new configurations for other bundles as
-     * well as manipulate them. The action string {@value #CONFIGURE}.
-     */
-    public final static String      CONFIGURE           = "configure";
-
-    /**
-     * The permission to be updated, that is, act as a Managed Service or
-     * Managed Service Factory. The action string {@value #TARGET}.
-     *
-     * @since 1.4
-     */
-    public final static String      TARGET              = "target";
-
-    private final static int        ACTION_CONFIGURE    = 0x00000001;
-    private final static int        ACTION_TARGET       = 0x00000002;
-    private final static int        ACTION_ALL          = ACTION_CONFIGURE
-                                                                | ACTION_TARGET;
-    final static int                ACTION_NONE         = 0;
-
-    /**
-     * The actions mask.
-     */
-    transient int                   action_mask;
-
-    /**
-     * The actions in canonical form.
-     *
-     * @serial
-     */
-    private volatile String         actions             = null;
-
-    /**
-     * Parsed name if it includes wildcards: "*"
-     */
-    private transient List substrings;
-
-    /**
-     * Create a new ConfigurationPermission.
-     *
-     * @param name Name of the permission. Wildcards ({@code '*'}) are allowed
-     *        in the name. During {@link #implies(Permission)}, the name is
-     *        matched to the requested permission using the substring matching
-     *        rules used by {@link Filter}s.
-     * @param actions Comma separated list of {@link #CONFIGURE},
-     *        {@link #TARGET}.
-     */
-
-    public ConfigurationPermission(String name, String actions) {
-        this(name, parseActions(actions));
-    }
-
-    /**
-     * Package private constructor used by ConfigurationPermissionCollection.
-     *
-     * @param name location string
-     * @param mask action mask
-     */
-    ConfigurationPermission(String name, int mask) {
-        super(name);
-        setTransients(mask);
-    }
-
-    /**
-     * Called by constructors and when deserialized.
-     *
-     * @param mask action mask
-     */
-    private void setTransients(int mask) {
-        if ((mask == ACTION_NONE) || ((mask & ACTION_ALL) != mask)) {
-            throw new IllegalArgumentException("invalid action string");
-        }
-        action_mask = mask;
-        substrings = parseSubstring(getName());
-    }
-
-    /**
-     * Parse action string into action mask.
-     *
-     * @param actions Action string.
-     * @return action mask.
-     */
-    private static int parseActions(String actions) {
-        boolean seencomma = false;
-
-        int mask = ACTION_NONE;
-
-        if (actions == null) {
-            return mask;
-        }
-
-        char[] a = actions.toCharArray();
-
-        int i = a.length - 1;
-        if (i < 0)
-            return mask;
-
-        while (i != -1) {
-            char c;
-
-            // skip whitespace
-            while ((i != -1)
-                    && ((c = a[i]) == ' ' || c == '\r' || c == '\n'
-                            || c == '\f' || c == '\t'))
-                i--;
-
-            // check for the known strings
-            int matchlen;
-
-            if (i >= 5 && (a[i - 5] == 't' || a[i - 5] == 'T')
-                    && (a[i - 4] == 'a' || a[i - 4] == 'A')
-                    && (a[i - 3] == 'r' || a[i - 3] == 'R')
-                    && (a[i - 2] == 'g' || a[i - 2] == 'G')
-                    && (a[i - 1] == 'e' || a[i - 1] == 'E')
-                    && (a[i] == 't' || a[i] == 'T')) {
-                matchlen = 6;
-                mask |= ACTION_TARGET;
-
-            }
-            else
-                if (i >= 8 && (a[i - 8] == 'c' || a[i - 8] == 'C')
-                        && (a[i - 7] == 'o' || a[i - 7] == 'O')
-                        && (a[i - 6] == 'n' || a[i - 6] == 'N')
-                        && (a[i - 5] == 'f' || a[i - 5] == 'F')
-                        && (a[i - 4] == 'i' || a[i - 4] == 'I')
-                        && (a[i - 3] == 'g' || a[i - 3] == 'G')
-                        && (a[i - 2] == 'u' || a[i - 2] == 'U')
-                        && (a[i - 1] == 'r' || a[i - 1] == 'R')
-                        && (a[i] == 'e' || a[i] == 'E')) {
-                    matchlen = 9;
-                    mask |= ACTION_CONFIGURE;
-
-                }
-                else {
-                    // parse error
-                    throw new IllegalArgumentException("invalid actions: "
-                            + actions);
-                }
-
-            // make sure we didn't just match the tail of a word
-            // like "ackbarftarget". Also, skip to the comma.
-            seencomma = false;
-            while (i >= matchlen && !seencomma) {
-                switch (a[i - matchlen]) {
-                    case ',' :
-                        seencomma = true;
-                        /* FALLTHROUGH */
-                    case ' ' :
-                    case '\r' :
-                    case '\n' :
-                    case '\f' :
-                    case '\t' :
-                        break;
-                    default :
-                        throw new IllegalArgumentException(
-                                "invalid permission: " + actions);
-                }
-                i--;
-            }
-
-            // point i at the location of the comma minus one (or -1).
-            i -= matchlen;
-        }
-
-        if (seencomma) {
-            throw new IllegalArgumentException("invalid actions: " + actions);
-        }
-
-        return mask;
-    }
-
-    /**
-     * Parse the name for wildcard processing.
-     *
-     * @param name The name of the permission.
-     * @return {@code null} is the name has no wildcards or a
-     *         {@code List<String>} where element is a substring to match or
-     *         null for {@code '*'}.
-     */
-    private static List parseSubstring(String name) {
-        if (name.indexOf('*') < 0) {
-            return null;
-        }
-        char[] chars = name.toCharArray();
-        StringBuffer sb = new StringBuffer(chars.length);
-
-        List sub = new ArrayList(10);
-
-        for (int pos = 0; pos < chars.length; pos++) {
-            char c = chars[pos];
-
-            switch (c) {
-                case '*' : {
-                    if (sb.length() > 0) {
-                        sub.add(sb.toString());
-                    }
-                    sb.setLength(0);
-                    sub.add(null);
-                    break;
-                }
-
-                case '\\' : {
-                    pos++;
-                    if (pos < chars.length) {
-                        c = chars[pos];
-                    }
-                    /* fall through into default */
-                }
-
-                default : {
-                    sb.append(c);
-                    break;
-                }
-            }
-        }
-        if (sb.length() > 0) {
-            sub.add(sb.toString());
-        }
-
-        int size = sub.size();
-
-        if (size == 0) {
-            return null;
-        }
-
-        if (size == 1) {
-            if (sub.get(0) != null) {
-                return null;
-            }
-        }
-        return sub;
-    }
-
-    /**
-     * Determines if a {@code ConfigurationPermission} object "implies" the
-     * specified permission.
-     *
-     * @param p The target permission to check.
-     * @return {@code true} if the specified permission is implied by this
-     *         object; {@code false} otherwise.
-     */
-
-    public boolean implies(Permission p) {
-        if (!(p instanceof ConfigurationPermission)) {
-            return false;
-        }
-        ConfigurationPermission requested = (ConfigurationPermission) p;
-        return implies0(requested, ACTION_NONE);
-    }
-
-    /**
-     * Internal implies method. Used by the implies and the permission
-     * collection implies methods.
-     *
-     * @param requested The requested ConfigurationPermission which has already
-     *        be validated as a proper argument.
-     * @param effective The effective actions with which to start.
-     * @return {@code true} if the specified permission is implied by this
-     *         object; {@code false} otherwise.
-     */
-    boolean implies0(ConfigurationPermission requested, int effective) {
-        /* check actions first - much faster */
-        effective |= action_mask;
-        final int desired = requested.action_mask;
-        if ((effective & desired) != desired) {
-            return false;
-        }
-        String requestedName = requested.getName();
-        if (substrings == null) {
-            return getName().equals(requestedName);
-        }
-        for (int i = 0, pos = 0, size = substrings.size(); i < size; i++) {
-            String substr = (String) substrings.get(i);
-
-            if (i + 1 < size) /* if this is not that last substr */{
-                if (substr == null) /* * */{
-                    String substr2 = (String) substrings.get(i + 1);
-
-                    if (substr2 == null) /* ** */
-                        continue; /* ignore first star */
-                    /* xxx */
-                    int index = requestedName.indexOf(substr2, pos);
-                    if (index == -1) {
-                        return false;
-                    }
-
-                    pos = index + substr2.length();
-                    if (i + 2 < size) // if there are more
-                        // substrings, increment
-                        // over the string we just
-                        // matched; otherwise need
-                        // to do the last substr
-                        // check
-                        i++;
-                }
-                else /* xxx */{
-                    int len = substr.length();
-                    if (requestedName.regionMatches(pos, substr, 0, len)) {
-                        pos += len;
-                    }
-                    else {
-                        return false;
-                    }
-                }
-            }
-            else /* last substr */{
-                if (substr == null) /* * */{
-                    return true;
-                }
-                /* xxx */
-                return requestedName.endsWith(substr);
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Determines the equality of two {@code ConfigurationPermission} objects.
-     * <p>
-     * Two {@code ConfigurationPermission} objects are equal.
-     *
-     * @param obj The object being compared for equality with this object.
-     * @return {@code true} if {@code obj} is equivalent to this
-     *         {@code ConfigurationPermission}; {@code false} otherwise.
-     */
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof ConfigurationPermission)) {
-            return false;
-        }
-
-        ConfigurationPermission cp = (ConfigurationPermission) obj;
-
-        return (action_mask == cp.action_mask)
-                && getName().equals(cp.getName());
-    }
-
-    /**
-     * Returns the hash code value for this object.
-     *
-     * @return Hash code value for this object.
-     */
-
-    public int hashCode() {
-        int h = 31 * 17 + getName().hashCode();
-        h = 31 * h + getActions().hashCode();
-        return h;
-    }
-
-    /**
-     * Returns the canonical string representation of the
-     * {@code ConfigurationPermission} actions.
-     *
-     * <p>
-     * Always returns present {@code ConfigurationPermission} actions in the
-     * following order: {@value #CONFIGURE}, {@value #TARGET}
-     *
-     * @return Canonical string representation of the
-     *         {@code ConfigurationPermission} actions.
-     */
-    public String getActions() {
-        String result = actions;
-        if (result == null) {
-            StringBuffer sb = new StringBuffer();
-            boolean comma = false;
-
-            int mask = action_mask;
-            if ((mask & ACTION_CONFIGURE) == ACTION_CONFIGURE) {
-                sb.append(CONFIGURE);
-                comma = true;
-            }
-
-            if ((mask & ACTION_TARGET) == ACTION_TARGET) {
-                if (comma)
-                    sb.append(',');
-                sb.append(TARGET);
-            }
-
-            actions = result = sb.toString();
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns a new {@code PermissionCollection} object suitable for storing
-     * {@code ConfigurationPermission}s.
-     *
-     * @return A new {@code PermissionCollection} object.
-     */
-    public PermissionCollection newPermissionCollection() {
-        return new ConfigurationPermissionCollection();
-    }
-
-    /**
-     * WriteObject is called to save the state of this permission object to a
-     * stream. The actions are serialized, and the superclass takes care of the
-     * name.
-     */
-    private synchronized void writeObject(java.io.ObjectOutputStream s)
-            throws IOException {
-        // Write out the actions. The superclass takes care of the name
-        // call getActions to make sure actions field is initialized
-        if (actions == null)
-            getActions();
-        s.defaultWriteObject();
-    }
-
-    /**
-     * readObject is called to restore the state of this permission from a
-     * stream.
-     */
-    private synchronized void readObject(java.io.ObjectInputStream s)
-            throws IOException, ClassNotFoundException {
-        // Read in the data, then initialize the transients
-        s.defaultReadObject();
-        setTransients(parseActions(actions));
-    }
-}
-
-/**
- * Stores a set of {@code ConfigurationPermission} permissions.
- *
- * @see java.security.Permission
- * @see java.security.Permissions
- * @see java.security.PermissionCollection
- */
-final class ConfigurationPermissionCollection extends PermissionCollection {
-    static final long                               serialVersionUID    = -6917638867081695839L;
-    /**
-     * Collection of permissions.
-     *
-     * @serial
-     * @GuardedBy this
-     */
-    private Map    permissions;
-
-    /**
-     * Boolean saying if "*" is in the collection.
-     *
-     * @serial
-     * @GuardedBy this
-     */
-    private boolean                                 all_allowed;
-
-    /**
-     * Creates an empty {@code ConfigurationPermissionCollection} object.
-     *
-     */
-    public ConfigurationPermissionCollection() {
-        permissions = new HashMap();
-        all_allowed = false;
-    }
-
-    /**
-     * Adds the specified permission to the
-     * {@code ConfigurationPermissionCollection}. The key for the hash is the
-     * interface name of the service.
-     *
-     * @param permission The {@code Permission} object to add.
-     *
-     * @exception IllegalArgumentException If the permission is not an
-     *            {@code ConfigurationPermission}.
-     *
-     * @exception SecurityException If this ConfigurationPermissionCollection
-     *            object has been marked read-only.
-     */
-
-    public void add(Permission permission) {
-        if (!(permission instanceof ConfigurationPermission)) {
-            throw new IllegalArgumentException("invalid permission: "
-                    + permission);
-        }
-
-        if (isReadOnly())
-            throw new SecurityException("attempt to add a Permission to a "
-                    + "readonly PermissionCollection");
-
-        final ConfigurationPermission cp = (ConfigurationPermission) permission;
-        final String name = cp.getName();
-        synchronized (this) {
-            Map pc = permissions;
-            final ConfigurationPermission existing = (ConfigurationPermission) pc.get(name);
-            if (existing != null) {
-                final int oldMask = existing.action_mask;
-                final int newMask = cp.action_mask;
-                if (oldMask != newMask) {
-                    pc.put(name, new ConfigurationPermission(name, oldMask
-                            | newMask));
-                }
-            }
-            else {
-                pc.put(name, cp);
-            }
-
-            if (!all_allowed) {
-                if (name.equals("*")) {
-                    all_allowed = true;
-                }
-            }
-        }
-    }
-
-    /**
-     * Determines if the specified permissions implies the permissions expressed
-     * in {@code permission}.
-     *
-     * @param permission The Permission object to compare with this
-     *        {@code ConfigurationPermission} object.
-     * @return {@code true} if {@code permission} is a proper subset of a
-     *         permission in the set; {@code false} otherwise.
-     */
-    public boolean implies(Permission permission) {
-        if (!(permission instanceof ConfigurationPermission)) {
-            return false;
-        }
-        final ConfigurationPermission requested = (ConfigurationPermission) permission;
-        int effective = ConfigurationPermission.ACTION_NONE;
-
-        Collection perms;
-        synchronized (this) {
-            Map pc = permissions;
-            /* short circuit if the "*" Permission was added */
-            if (all_allowed) {
-                ConfigurationPermission cp = (ConfigurationPermission) pc.get("*");
-                if (cp != null) {
-                    effective |= cp.action_mask;
-                    final int desired = requested.action_mask;
-                    if ((effective & desired) == desired) {
-                        return true;
-                    }
-                }
-            }
-            perms = pc.values();
-        }
-        /* iterate one by one over permissions */
-        for (Iterator permI = perms.iterator(); permI.hasNext(); ) {
-            ConfigurationPermission perm = (ConfigurationPermission) permI.next();
-            if (perm.implies0(requested, effective)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Returns an enumeration of all {@code ConfigurationPermission} objects in
-     * the container.
-     *
-     * @return Enumeration of all {@code ConfigurationPermission} objects.
-     */
-    public synchronized Enumeration elements() {
-        List all = new ArrayList(permissions.values());
-        return Collections.enumeration(all);
-    }
-
-    /* serialization logic */
-    private static final ObjectStreamField[]    serialPersistentFields  = {
-            new ObjectStreamField("hasElement", Boolean.TYPE),
-            new ObjectStreamField("permissions", HashMap.class),
-            new ObjectStreamField("all_allowed", Boolean.TYPE)          };
-
-    private synchronized void writeObject(ObjectOutputStream out)
-            throws IOException {
-        ObjectOutputStream.PutField pfields = out.putFields();
-        pfields.put("hasElement", false);
-        pfields.put("permissions", permissions);
-        pfields.put("all_allowed", all_allowed);
-        out.writeFields();
-    }
-
-    private synchronized void readObject(java.io.ObjectInputStream in)
-            throws IOException, ClassNotFoundException {
-        ObjectInputStream.GetField gfields = in.readFields();
-        boolean hasElement = gfields.get("hasElement", false);
-        if (hasElement) { // old format
-            permissions = new HashMap();
-            permissions.put("*", new ConfigurationPermission("*",
-                    ConfigurationPermission.CONFIGURE));
-            all_allowed = true;
-        }
-        else {
-            permissions = (HashMap) gfields
-                    .get("permissions",
-                            new HashMap());
-            all_allowed = gfields.get("all_allowed", false);
-        }
-    }
-}
diff --git a/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java b/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java
index d1ef4e7..6273d90 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/MockBundle.java
@@ -195,4 +195,18 @@
 
     }
 
+
+    public void start( int options ) throws BundleException
+    {
+        // TODO Auto-generated method stub
+
+    }
+
+
+    public void stop( int options ) throws BundleException
+    {
+        // TODO Auto-generated method stub
+
+    }
+
 }
diff --git a/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java b/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java
index fcd61da..1fe4d10 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/impl/RankingComparatorTest.java
@@ -252,6 +252,12 @@
         }
 
 
+        public int compareTo( Object reference )
+        {
+            return 0;
+        }
+
+
         public String toString()
         {
             return "ServiceReference " + getProperty( Constants.SERVICE_ID );
diff --git a/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java b/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java
index 50563f8..e1a4892 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java
@@ -23,6 +23,7 @@
 import java.io.StringWriter;
 import java.util.Dictionary;
 import java.util.HashSet;
+import java.util.Hashtable;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
@@ -266,7 +267,7 @@
                 {
                     // Create factory configuration
                     org.osgi.service.cm.Configuration conf = cm.createFactoryConfiguration( _FACTORYPID, null );
-                    Properties props = new Properties();
+                    Hashtable<String, Object> props = new Hashtable<String, Object>();
                     props.put( "foo", "bar" );
                     conf.update( props );
 
@@ -279,7 +280,7 @@
                     // Update factory configuration many times
                     for ( int i = 0; i < UPDATE_LOOP; i++ )
                     {
-                        props = new Properties();
+                        props = new Hashtable<String, Object>();
                         props.put( "foo", "bar" + i );
                         props.put( "number", new Long( UPDATE_LOOP - i ) );
                         conf.update( props );
diff --git a/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java b/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java
index 2bf4bd0..ea7deef 100644
--- a/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java
+++ b/configadmin/src/test/java/org/apache/felix/cm/integration/FELIX2813_ConfigurationAdminStartupTest.java
@@ -21,9 +21,8 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Hashtable;
 import java.util.List;
-import java.util.Properties;
-
 import junit.framework.TestCase;
 
 import org.junit.Test;
@@ -130,7 +129,7 @@
             try
             {
                 org.osgi.service.cm.Configuration config = ca.getConfiguration( "test" );
-                Properties props = new Properties();
+                Hashtable<String, Object> props = new Hashtable<String, Object>();
                 props.put( "abc", "123" );
                 config.update( props );
             }
