diff --git a/scr/pom.xml b/scr/pom.xml
index fb60390..9aa7d11 100644
--- a/scr/pom.xml
+++ b/scr/pom.xml
@@ -77,20 +77,20 @@
     <dependencies>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
+            <artifactId>osgi.core</artifactId>
             <version>6.0.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.annotation</artifactId>
-            <version>6.0.0</version>
+            <artifactId>osgi.annotation</artifactId>
+            <version>6.0.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.enterprise</artifactId>
-            <version>5.0.0</version>
+            <artifactId>osgi.cmpn</artifactId>
+            <version>6.0.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/scr/src/main/java/org/osgi/service/component/ComponentConstants.java b/scr/src/main/java/org/osgi/service/component/ComponentConstants.java
deleted file mode 100644
index de3a41a..0000000
--- a/scr/src/main/java/org/osgi/service/component/ComponentConstants.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2015). 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.component;
-
-import org.osgi.annotation.versioning.ProviderType;
-
-/**
- * Defines standard names for Service Component constants.
- * 
- * @author $Id: 624eb5610c2127d24ce76f16b3cc146cbcf6db57 $
- */
-@ProviderType
-public interface ComponentConstants {
-	/**
-	 * Manifest header specifying the XML documents within a bundle that contain
-	 * the bundle's Service Component descriptions.
-	 * <p>
-	 * The attribute value may be retrieved from the {@code Dictionary} object
-	 * returned by the {@code Bundle.getHeaders} method.
-	 */
-	public static final String	SERVICE_COMPONENT							= "Service-Component";
-
-	/**
-	 * A component property for a component configuration that contains the name
-	 * of the component as specified in the {@code name} attribute of the
-	 * {@code component} element. The value of this property must be of type
-	 * {@code String}.
-	 */
-	public final static String	COMPONENT_NAME								= "component.name";
-
-	/**
-	 * A component property that contains the generated id for a component
-	 * configuration. The value of this property must be of type {@code Long}.
-	 * 
-	 * <p>
-	 * The value of this property is assigned by Service Component Runtime when
-	 * a component configuration is created. Service Component Runtime assigns a
-	 * unique value that is larger than all previously assigned values since
-	 * Service Component Runtime was started. These values are NOT persistent
-	 * across restarts of Service Component Runtime.
-	 */
-	public final static String	COMPONENT_ID								= "component.id";
-
-	/**
-	 * A service registration property for a Component Factory that contains the
-	 * value of the {@code factory} attribute. The value of this property must
-	 * be of type {@code String}.
-	 */
-	public final static String	COMPONENT_FACTORY							= "component.factory";
-
-	/**
-	 * The suffix for reference target properties. These properties contain the
-	 * filter to select the target services for a reference. The value of this
-	 * property must be of type {@code String}.
-	 */
-	public final static String	REFERENCE_TARGET_SUFFIX						= ".target";
-
-	/**
-	 * The reason the component configuration was deactivated is unspecified.
-	 * 
-	 * @since 1.1
-	 */
-	public static final int		DEACTIVATION_REASON_UNSPECIFIED				= 0;
-
-	/**
-	 * The component configuration was deactivated because the component was
-	 * disabled.
-	 * 
-	 * @since 1.1
-	 */
-	public static final int		DEACTIVATION_REASON_DISABLED				= 1;
-
-	/**
-	 * The component configuration was deactivated because a reference became
-	 * unsatisfied.
-	 * 
-	 * @since 1.1
-	 */
-	public static final int		DEACTIVATION_REASON_REFERENCE				= 2;
-
-	/**
-	 * The component configuration was deactivated because its configuration was
-	 * changed.
-	 * 
-	 * @since 1.1
-	 */
-	public static final int		DEACTIVATION_REASON_CONFIGURATION_MODIFIED	= 3;
-
-	/**
-	 * The component configuration was deactivated because its configuration was
-	 * deleted.
-	 * 
-	 * @since 1.1
-	 */
-	public static final int		DEACTIVATION_REASON_CONFIGURATION_DELETED	= 4;
-
-	/**
-	 * The component configuration was deactivated because the component was
-	 * disposed.
-	 * 
-	 * @since 1.1
-	 */
-	public static final int		DEACTIVATION_REASON_DISPOSED				= 5;
-
-	/**
-	 * The component configuration was deactivated because the bundle was
-	 * stopped.
-	 * 
-	 * @since 1.1
-	 */
-	public static final int		DEACTIVATION_REASON_BUNDLE_STOPPED			= 6;
-
-	/**
-	 * Capability name for Service Component Runtime.
-	 * 
-	 * <p>
-	 * Used in {@code Provide-Capability} and {@code Require-Capability}
-	 * manifest headers with the {@code osgi.extender} namespace. For example:
-	 * 
-	 * <pre>
-	 * Require-Capability: osgi.extender;
-	 *  filter:="(&amp;(osgi.extender=osgi.component)(version&gt;=1.3)(!(version&gt;=2.0)))"
-	 * </pre>
-	 * 
-	 * @since 1.3
-	 */
-	public static final String	COMPONENT_CAPABILITY_NAME					= "osgi.component";
-}
diff --git a/scr/src/main/java/org/osgi/service/component/ComponentContext.java b/scr/src/main/java/org/osgi/service/component/ComponentContext.java
deleted file mode 100644
index 4e0c4a1..0000000
--- a/scr/src/main/java/org/osgi/service/component/ComponentContext.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2014). 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.component;
-
-import java.util.Dictionary;
-import org.osgi.annotation.versioning.ProviderType;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-/**
- * A Component Context object is used by a component instance to interact with
- * its execution context including locating services by reference name. Each
- * component instance has a unique Component Context.
- * 
- * <p>
- * A component instance may obtain its Component Context object through its
- * activate, modified, and deactivate methods.
- * 
- * @ThreadSafe
- * @author $Id: 5499691841bcfbb0d35222564785af1a5a530c7f $
- */
-@ProviderType
-public interface ComponentContext {
-	/**
-	 * Returns the component properties for this Component Context.
-	 * 
-	 * @return The properties for this Component Context. The Dictionary is read
-	 *         only and cannot be modified.
-	 */
-	public Dictionary<String, Object> getProperties();
-
-	/**
-	 * Returns the service object for the specified reference name.
-	 * 
-	 * <p>
-	 * If the cardinality of the reference is {@code 0..n} or {@code 1..n} and
-	 * multiple services are bound to the reference, the service with the
-	 * highest ranking (as specified in its {@code Constants.SERVICE_RANKING}
-	 * property) is returned. If there is a tie in ranking, the service with the
-	 * lowest service id (as specified in its {@code Constants.SERVICE_ID}
-	 * property); that is, the service that was registered first is returned.
-	 * 
-	 * @param name The name of a reference as specified in a {@code reference}
-	 *        element in this component's description.
-	 * @return A service object for the referenced service or {@code null} if
-	 *         the reference cardinality is {@code 0..1} or {@code 0..n} and no
-	 *         bound service is available.
-	 * @throws ComponentException If Service Component Runtime catches an
-	 *         exception while activating the bound service.
-	 */
-	public Object locateService(String name);
-
-	/**
-	 * Returns the service object for the specified reference name and
-	 * {@code ServiceReference}.
-	 * 
-	 * @param <S> Type of Service.
-	 * @param name The name of a reference as specified in a {@code reference}
-	 *        element in this component's description.
-	 * @param reference The {@code ServiceReference} to a bound service. This
-	 *        must be a {@code ServiceReference} provided to the component via
-	 *        the bind or unbind method for the specified reference name.
-	 * @return A service object for the referenced service or {@code null} if
-	 *         the specified {@code ServiceReference} is not a bound service for
-	 *         the specified reference name.
-	 * @throws ComponentException If Service Component Runtime catches an
-	 *         exception while activating the bound service.
-	 */
-	public <S> S locateService(String name, ServiceReference<S> reference);
-
-	/**
-	 * Returns the service objects for the specified reference name.
-	 * 
-	 * @param name The name of a reference as specified in a {@code reference}
-	 *        element in this component's description.
-	 * @return An array of service objects for the referenced service or
-	 *         {@code null} if the reference cardinality is {@code 0..1} or
-	 *         {@code 0..n} and no bound service is available. If the reference
-	 *         cardinality is {@code 0..1} or {@code 1..1} and a bound service
-	 *         is available, the array will have exactly one element.
-	 * @throws ComponentException If Service Component Runtime catches an
-	 *         exception while activating a bound service.
-	 */
-	public Object[] locateServices(String name);
-
-	/**
-	 * Returns the {@code BundleContext} of the bundle which contains this
-	 * component.
-	 * 
-	 * @return The {@code BundleContext} of the bundle containing this
-	 *         component.
-	 */
-	public BundleContext getBundleContext();
-
-	/**
-	 * If the component instance is registered as a service using the
-	 * {@code servicescope="bundle"} or {@code servicescope="prototype"}
-	 * attribute, then this method returns the bundle using the service provided
-	 * by the component instance.
-	 * <p>
-	 * This method will return {@code null} if:
-	 * <ul>
-	 * <li>The component instance is not a service, then no bundle can be using
-	 * it as a service.</li>
-	 * <li>The component instance is a service but did not specify the
-	 * {@code servicescope="bundle"} or {@code servicescope="prototype"}
-	 * attribute, then all bundles using the service provided by the component
-	 * instance will share the same component instance.</li>
-	 * <li>The service provided by the component instance is not currently being
-	 * used by any bundle.</li>
-	 * </ul>
-	 * 
-	 * @return The bundle using the component instance as a service or
-	 *         {@code null}.
-	 */
-	public Bundle getUsingBundle();
-
-	/**
-	 * Returns the Component Instance object for the component instance
-	 * associated with this Component Context.
-	 * 
-	 * @return The Component Instance object for the component instance.
-	 */
-	public ComponentInstance getComponentInstance();
-
-	/**
-	 * Enables the specified component name. The specified component name must
-	 * be in the same bundle as this component.
-	 * 
-	 * <p>
-	 * This method must return after changing the enabled state of the specified
-	 * component name. Any actions that result from this, such as activating or
-	 * deactivating a component configuration, must occur asynchronously to this
-	 * method call.
-	 * 
-	 * @param name The name of a component or {@code null} to indicate all
-	 *        components in the bundle.
-	 */
-	public void enableComponent(String name);
-
-	/**
-	 * Disables the specified component name. The specified component name must
-	 * be in the same bundle as this component.
-	 * 
-	 * <p>
-	 * This method must return after changing the enabled state of the specified
-	 * component name. Any actions that result from this, such as activating or
-	 * deactivating a component configuration, must occur asynchronously to this
-	 * method call.
-	 * 
-	 * @param name The name of a component.
-	 */
-	public void disableComponent(String name);
-
-	/**
-	 * If the component instance is registered as a service using the
-	 * {@code service} element, then this method returns the service reference
-	 * of the service provided by this component instance.
-	 * <p>
-	 * This method will return {@code null} if the component instance is not
-	 * registered as a service.
-	 * 
-	 * @return The {@code ServiceReference} object for the component instance or
-	 *         {@code null} if the component instance is not registered as a
-	 *         service.
-	 */
-	public ServiceReference<?> getServiceReference();
-}
diff --git a/scr/src/main/java/org/osgi/service/component/ComponentException.java b/scr/src/main/java/org/osgi/service/component/ComponentException.java
deleted file mode 100644
index 8b2aaab..0000000
--- a/scr/src/main/java/org/osgi/service/component/ComponentException.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2014). 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.component;
-
-/**
- * Unchecked exception which may be thrown by Service Component Runtime.
- * 
- * @author $Id: 6b47774608ff37a2076b9f58090509093314a67a $
- */
-public class ComponentException extends RuntimeException {
-	static final long	serialVersionUID	= -7438212656298726924L;
-
-	/**
-	 * Construct a new ComponentException with the specified message and cause.
-	 * 
-	 * @param message The message for the exception.
-	 * @param cause The cause of the exception. May be {@code null}.
-	 */
-	public ComponentException(String message, Throwable cause) {
-		super(message, cause);
-	}
-
-	/**
-	 * Construct a new ComponentException with the specified message.
-	 * 
-	 * @param message The message for the exception.
-	 */
-	public ComponentException(String message) {
-		super(message);
-	}
-
-	/**
-	 * Construct a new ComponentException with the specified cause.
-	 * 
-	 * @param cause The cause of the exception. May be {@code null}.
-	 */
-	public ComponentException(Throwable cause) {
-		super(cause);
-	}
-
-	/**
-	 * Returns the cause of this exception or {@code null} if no cause was set.
-	 * 
-	 * @return The cause of this exception or {@code null} if no cause was set.
-	 */
-	@Override
-	public Throwable getCause() {
-		return super.getCause();
-	}
-
-	/**
-	 * Initializes the cause of this exception to the specified value.
-	 * 
-	 * @param cause The cause of this exception.
-	 * @return This exception.
-	 * @throws IllegalArgumentException If the specified cause is this
-	 *         exception.
-	 * @throws IllegalStateException If the cause of this exception has already
-	 *         been set.
-	 */
-	@Override
-	public Throwable initCause(Throwable cause) {
-		return super.initCause(cause);
-	}
-}
diff --git a/scr/src/main/java/org/osgi/service/component/ComponentFactory.java b/scr/src/main/java/org/osgi/service/component/ComponentFactory.java
deleted file mode 100644
index ca74a7a..0000000
--- a/scr/src/main/java/org/osgi/service/component/ComponentFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2014). 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.component;
-
-import java.util.Dictionary;
-import org.osgi.annotation.versioning.ProviderType;
-
-/**
- * When a component is declared with the {@code factory} attribute on its
- * {@code component} element, Service Component Runtime will register a
- * Component Factory service to allow new component configurations to be created
- * and activated rather than automatically creating and activating component
- * configuration as necessary.
- * 
- * @ThreadSafe
- * @author $Id: a6422fc517a31533b1188d5ab9d9ee95a7a52c8a $
- */
-@ProviderType
-public interface ComponentFactory {
-	/**
-	 * Create and activate a new component configuration. Additional properties
-	 * may be provided for the component configuration.
-	 * 
-	 * @param properties Additional properties for the component configuration
-	 *        or {@code null} if there are no additional properties.
-	 * @return A {@code ComponentInstance} object encapsulating the component
-	 *         instance of the component configuration. The component
-	 *         configuration has been activated and, if the component specifies
-	 *         a {@code service} element, the component instance has been
-	 *         registered as a service.
-	 * @throws ComponentException If Service Component Runtime is unable to
-	 *         activate the component configuration.
-	 */
-	public ComponentInstance newInstance(Dictionary<String, ?> properties);
-}
diff --git a/scr/src/main/java/org/osgi/service/component/ComponentInstance.java b/scr/src/main/java/org/osgi/service/component/ComponentInstance.java
deleted file mode 100644
index c45e075..0000000
--- a/scr/src/main/java/org/osgi/service/component/ComponentInstance.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2004, 2013). 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.component;
-
-import org.osgi.annotation.versioning.ProviderType;
-
-/**
- * A ComponentInstance encapsulates a component instance of an activated
- * component configuration. ComponentInstances are created whenever a component
- * configuration is activated.
- * 
- * <p>
- * ComponentInstances are never reused. A new ComponentInstance object will be
- * created when the component configuration is activated again.
- * 
- * @ThreadSafe
- * @author $Id: 8078babdd771f18831a54bfaa407e4edd2781552 $
- */
-@ProviderType
-public interface ComponentInstance {
-	/**
-	 * Dispose of the component configuration for this component instance. The
-	 * component configuration will be deactivated. If the component
-	 * configuration has already been deactivated, this method does nothing.
-	 */
-	public void dispose();
-
-	/**
-	 * Returns the component instance of the activated component configuration.
-	 * 
-	 * @return The component instance or {@code null} if the component
-	 *         configuration has been deactivated.
-	 */
-	public Object getInstance();
-}
diff --git a/scr/src/main/java/org/osgi/service/component/ComponentServiceObjects.java b/scr/src/main/java/org/osgi/service/component/ComponentServiceObjects.java
deleted file mode 100644
index 62cabcb..0000000
--- a/scr/src/main/java/org/osgi/service/component/ComponentServiceObjects.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2012, 2014). 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.component;
-
-import org.osgi.annotation.versioning.ProviderType;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceObjects;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Allows multiple service objects for a service to be obtained.
- * 
- * <p>
- * A component instance can receive a {@code ComponentServiceObjects} object via
- * a reference that is typed {@code ComponentServiceObjects}.
- * 
- * <p>
- * For services with {@link Constants#SCOPE_PROTOTYPE prototype} scope, multiple
- * service objects for the service can be obtained. For services with
- * {@link Constants#SCOPE_SINGLETON singleton} or {@link Constants#SCOPE_BUNDLE
- * bundle} scope, only one, use-counted service object is available.
- * 
- * <p>
- * Any unreleased service objects obtained from this
- * {@code ComponentServiceObjects} object are automatically released by Service
- * Component Runtime when the service becomes unbound.
- * 
- * @param <S> Type of Service
- * @ThreadSafe
- * @since 1.3
- * @see ServiceObjects
- * @author $Id: 49fc5e86384324c73b412d8b733f715f8b55d4d6 $
- */
-@ProviderType
-public interface ComponentServiceObjects<S> {
-	/**
-	 * Returns a service object for the {@link #getServiceReference()
-	 * associated} service.
-	 * 
-	 * <p>
-	 * This method will always return {@code null} when the associated service
-	 * has been become unbound.
-	 * 
-	 * @return A service object for the associated service or {@code null} if
-	 *         the service is unbound, the customized service object returned by
-	 *         a {@code ServiceFactory} does not implement the classes under
-	 *         which it was registered or the {@code ServiceFactory} threw an
-	 *         exception.
-	 * @throws IllegalStateException If the associated service has been become
-	 *         unbound.
-	 * @see #ungetService(Object)
-	 */
-	public S getService();
-
-	/**
-	 * Releases a service object for the {@link #getServiceReference()
-	 * associated} service.
-	 * 
-	 * <p>
-	 * The specified service object must no longer be used and all references to
-	 * it should be destroyed after calling this method.
-	 * 
-	 * @param service A service object previously provided by this
-	 *        {@code ComponentServiceObjects} object.
-	 * @throws IllegalStateException If the associated service has been become
-	 *         unbound.
-	 * @throws IllegalArgumentException If the specified service object was not
-	 *         provided by this {@code ComponentServiceObjects} object.
-	 * @see #getService()
-	 */
-	public void ungetService(S service);
-
-	/**
-	 * Returns the {@link ServiceReference} for the service associated with this
-	 * {@code ComponentServiceObjects} object.
-	 * 
-	 * @return The {@link ServiceReference} for the service associated with this
-	 *         {@code ComponentServiceObjects} object.
-	 */
-	public ServiceReference<S> getServiceReference();
-}
diff --git a/scr/src/main/java/org/osgi/service/component/package-info.java b/scr/src/main/java/org/osgi/service/component/package-info.java
deleted file mode 100644
index 010a246..0000000
--- a/scr/src/main/java/org/osgi/service/component/package-info.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2010, 2013). 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.
- */
-
-/**
- * Service Component Package Version 1.3.
- *
- * <p>
- * Bundles wishing to use this package must list the package in the
- * Import-Package header of the bundle's manifest. This package has two types of
- * users: the consumers that use the API in this package and the providers that
- * implement the API in this package.
- *
- * <p>
- * Example import for consumers using the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.service.component; version="[1.3,2.0)"}
- * <p>
- * Example import for providers implementing the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.service.component; version="[1.3,1.4)"}
- *
- * @author $Id: 9c158e8fb0f0512b3fbfb759fc06ed54afc0d8b0 $
- */
-
-@Version("1.3")
-package org.osgi.service.component;
-
-import org.osgi.annotation.versioning.Version;
-
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/ServiceComponentRuntime.java b/scr/src/main/java/org/osgi/service/component/runtime/ServiceComponentRuntime.java
deleted file mode 100755
index d71024c..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/ServiceComponentRuntime.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2013, 2014). 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.component.runtime;
-
-import java.util.Collection;
-import org.osgi.annotation.versioning.ProviderType;
-import org.osgi.framework.Bundle;
-import org.osgi.service.component.ComponentContext;
-import org.osgi.service.component.runtime.dto.ComponentConfigurationDTO;
-import org.osgi.service.component.runtime.dto.ComponentDescriptionDTO;
-import org.osgi.util.promise.Promise;
-
-/**
- * The {@code ServiceComponentRuntime} service represents the Declarative
- * Services actor, known as Service Component Runtime (SCR), that manages the
- * service components and their life cycle. The {@code ServiceComponentRuntime}
- * service allows introspection of the components managed by Service Component
- * Runtime.
- * 
- * <p>
- * This service differentiates between a {@link ComponentDescriptionDTO} and a
- * {@link ComponentConfigurationDTO}. A {@link ComponentDescriptionDTO} is a
- * representation of a declared component description. A
- * {@link ComponentConfigurationDTO} is a representation of an actual instance
- * of a declared component description parameterized by component properties.
- * <p>
- * 
- * Access to this service requires the
- * {@code ServicePermission[ServiceComponentRuntime, GET]} permission. It is
- * intended that only administrative bundles should be granted this permission
- * to limit access to the potentially intrusive methods provided by this
- * service.
- * 
- * @ThreadSafe
- * @since 1.3
- * @author $Id: 59760dcd57f2162574cfd0c7f3a393825566e78f $
- */
-@ProviderType
-public interface ServiceComponentRuntime {
-
-	/**
-	 * Returns the component descriptions declared by the specified active
-	 * bundles.
-	 * 
-	 * <p>
-	 * Only component descriptions from active bundles are returned. If the
-	 * specified bundles have no declared components or are not active, an empty
-	 * collection is returned.
-	 * 
-	 * @param bundles The bundles whose declared component descriptions are to
-	 *        be returned. Specifying no bundles, or the equivalent of an empty
-	 *        {@code Bundle} array, will return the declared component
-	 *        descriptions from all active bundles.
-	 * @return The declared component descriptions of the specified active
-	 *         {@code bundles}. An empty collection is returned if there are no
-	 *         component descriptions for the specified active bundles.
-	 */
-	Collection<ComponentDescriptionDTO> getComponentDescriptionDTOs(Bundle... bundles);
-
-	/**
-	 * Returns the {@link ComponentDescriptionDTO} declared with the specified name
-	 * by the specified bundle.
-	 * 
-	 * <p>
-	 * Only component descriptions from active bundles are returned.
-	 * {@code null} if no such component is declared by the given {@code bundle}
-	 * or the bundle is not active.
-	 * 
-	 * @param bundle The bundle declaring the component description. Must not be
-	 *        {@code null}.
-	 * @param name The name of the component description. Must not be
-	 *        {@code null}.
-	 * @return The declared component description or {@code null} if the
-	 *         specified bundle is not active or does not declare a component
-	 *         description with the specified name.
-	 */
-	ComponentDescriptionDTO getComponentDescriptionDTO(Bundle bundle, String name);
-
-	/**
-	 * Returns the component configurations for the specified component
-	 * description.
-	 * 
-	 * @param description The component description. Must not be {@code null}.
-	 * @return A collection containing a snapshot of the current component
-	 *         configurations for the specified component description. An empty
-	 *         collection is returned if there are none.
-	 */
-	Collection<ComponentConfigurationDTO> getComponentConfigurationDTOs(ComponentDescriptionDTO description);
-
-	/**
-	 * Returns whether the specified component description is currently enabled.
-	 * 
-	 * <p>
-	 * The enabled state of a component description is initially set by the
-	 * {@link ComponentDescriptionDTO#defaultEnabled enabled} attribute of the
-	 * component description.
-	 * 
-	 * @param description The component description. Must not be {@code null}.
-	 * @return {@code true} if the specified component description is currently
-	 *         enabled. Otherwise, {@code false}.
-	 * @see #enableComponent(ComponentDescriptionDTO)
-	 * @see #disableComponent(ComponentDescriptionDTO)
-	 * @see ComponentContext#disableComponent(String)
-	 * @see ComponentContext#enableComponent(String)
-	 */
-	boolean isComponentEnabled(ComponentDescriptionDTO description);
-
-	/**
-	 * Enables the specified component description.
-	 * 
-	 * <p>
-	 * If the specified component description is currently enabled, this method
-	 * has no effect.
-	 * 
-	 * <p>
-	 * This method must return after changing the enabled state of the specified
-	 * component description. Any actions that result from this, such as
-	 * activating or deactivating a component configuration, must occur
-	 * asynchronously to this method call.
-	 * 
-	 * @param description The component description to enable. Must not be
-	 *        {@code null}.
-	 * @return A promise that will be resolved when the actions that result from
-	 *         changing the enabled state of the specified component have
-	 *         completed.
-	 * @see #isComponentEnabled(ComponentDescriptionDTO)
-	 */
-	Promise<Void> enableComponent(ComponentDescriptionDTO description);
-
-	/**
-	 * Disables the specified component description.
-	 * 
-	 * <p>
-	 * If the specified component description is currently disabled, this method
-	 * has no effect.
-	 * 
-	 * <p>
-	 * This method must return after changing the enabled state of the specified
-	 * component description. Any actions that result from this, such as
-	 * activating or deactivating a component configuration, must occur
-	 * asynchronously to this method call.
-	 * 
-	 * @param description The component description to disable. Must not be
-	 *        {@code null}.
-	 * @return A promise that will be resolved when the actions that result from
-	 *         changing the enabled state of the specified component have
-	 *         completed.
-	 * @see #isComponentEnabled(ComponentDescriptionDTO)
-	 */
-	Promise<Void> disableComponent(ComponentDescriptionDTO description);
-}
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/dto/ComponentConfigurationDTO.java b/scr/src/main/java/org/osgi/service/component/runtime/dto/ComponentConfigurationDTO.java
deleted file mode 100755
index dc3227d..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/dto/ComponentConfigurationDTO.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2013, 2014). 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.component.runtime.dto;
-
-import java.util.Map;
-import org.osgi.dto.DTO;
-import org.osgi.service.component.ComponentContext;
-
-/**
- * A representation of an actual instance of a declared component description
- * parameterized by component properties.
- * 
- * @since 1.3
- * @NotThreadSafe
- * @author $Id: a3e98bbac97a1d79805f9be0ed7f2ae811f112d0 $
- */
-public class ComponentConfigurationDTO extends DTO {
-	/**
-	 * The component configuration is unsatisfied due to a missing required
-	 * configuration.
-	 */
-	public static final int			UNSATISFIED_CONFIGURATION	= 1;
-
-	/**
-	 * The component configuration is unsatisfied due to an unsatisfied
-	 * reference.
-	 */
-	public static final int			UNSATISFIED_REFERENCE		= 2;
-
-	/**
-	 * The component configuration is satisfied.
-	 * 
-	 * <p>
-	 * Any {@link ComponentDescriptionDTO#serviceInterfaces services} declared
-	 * by the component description are registered.
-	 */
-	public static final int			SATISFIED					= 4;
-
-	/**
-	 * The component configuration is active.
-	 * 
-	 * <p>
-	 * This is the normal operational state of a component configuration.
-	 */
-	public static final int			ACTIVE						= 8;
-
-	/**
-	 * The representation of the component configuration's component
-	 * description.
-	 */
-	public ComponentDescriptionDTO	description;
-
-	/**
-	 * The current state of the component configuration.
-	 * 
-	 * <p>
-	 * This is one of {@link #UNSATISFIED_CONFIGURATION},
-	 * {@link #UNSATISFIED_REFERENCE}, {@link #SATISFIED} or {@link #ACTIVE}.
-	 */
-	public int							state;
-
-	/**
-	 * The id of the component configuration.
-	 * 
-	 * <p>
-	 * The id is a non-persistent, unique value assigned at runtime. The id is
-	 * also available as the {@code component.id} component property. The value
-	 * of this field is unspecified if the state of this component configuration
-	 * is unsatisfied.
-	 */
-	public long							id;
-
-	/**
-	 * The component properties for the component configuration.
-	 * 
-	 * @see ComponentContext#getProperties()
-	 */
-	public Map<String, Object>	properties;
-
-	/**
-	 * The satisfied references.
-	 * 
-	 * <p>
-	 * Each {@link SatisfiedReferenceDTO} in the array represents a satisfied
-	 * reference of the component configuration. The array must be empty if the
-	 * component configuration has no satisfied references.
-	 */
-	public SatisfiedReferenceDTO[]		satisfiedReferences;
-
-	/**
-	 * The unsatisfied references.
-	 * 
-	 * <p>
-	 * Each {@link UnsatisfiedReferenceDTO} in the array represents an
-	 * unsatisfied reference of the component configuration. The array must be
-	 * empty if the component configuration has no unsatisfied references.
-	 */
-	public UnsatisfiedReferenceDTO[]	unsatisfiedReferences;
-}
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/dto/ComponentDescriptionDTO.java b/scr/src/main/java/org/osgi/service/component/runtime/dto/ComponentDescriptionDTO.java
deleted file mode 100755
index 8e50ca3..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/dto/ComponentDescriptionDTO.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2013, 2014). 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.component.runtime.dto;
-
-import java.util.Map;
-import org.osgi.dto.DTO;
-import org.osgi.framework.dto.BundleDTO;
-
-/**
- * A representation of a declared component description.
- * 
- * @since 1.3
- * @NotThreadSafe
- * @author $Id: 9f098a6edef3359b4dbd21e1e58bbad01b89b995 $
- */
-public class ComponentDescriptionDTO extends DTO {
-	/**
-	 * The name of the component.
-	 * 
-	 * <p>
-	 * This is declared in the {@code name} attribute of the {@code component}
-	 * element. This must be the default name if the component description does
-	 * not declare a name.
-	 */
-	public String				name;
-
-	/**
-	 * The bundle declaring the component description.
-	 */
-	public BundleDTO			bundle;
-
-	/**
-	 * The component factory name.
-	 * 
-	 * <p>
-	 * This is declared in the {@code factory} attribute of the
-	 * {@code component} element. This must be {@code null} if the component
-	 * description is not declared as a component factory.
-	 */
-	public String				factory;
-
-	/**
-	 * The service scope.
-	 * 
-	 * <p>
-	 * This is declared in the {@code scope} attribute of the {@code service}
-	 * element. This must be {@code null} if the component description does not
-	 * declare any service interfaces.
-	 */
-	public String				scope;
-
-	/**
-	 * The fully qualified name of the implementation class.
-	 * 
-	 * <p>
-	 * This is declared in the {@code class} attribute of the
-	 * {@code implementation} element.
-	 */
-	public String				implementationClass;
-
-	/**
-	 * The initial enabled state.
-	 * 
-	 * <p>
-	 * This is declared in the {@code enabled} attribute of the
-	 * {@code component} element.
-	 */
-	public boolean				defaultEnabled;
-
-	/**
-	 * The immediate state.
-	 * 
-	 * <p>
-	 * This is declared in the {@code immediate} attribute of the
-	 * {@code component} element.
-	 */
-	public boolean				immediate;
-
-	/**
-	 * The fully qualified names of the service interfaces.
-	 * 
-	 * <p>
-	 * These are declared in the {@code interface} attribute of the
-	 * {@code provide} elements. The array must be empty if the component
-	 * description does not declare any service interfaces.
-	 */
-	public String[]				serviceInterfaces;
-
-	/**
-	 * The declared component properties.
-	 * 
-	 * <p>
-	 * These are declared in the {@code property} and {@code properties}
-	 * elements.
-	 */
-	public Map<String, Object>	properties;
-
-	/**
-	 * The referenced services.
-	 * 
-	 * <p>
-	 * These are declared in the {@code reference} elements. The array must be
-	 * empty if the component description does not declare references to any
-	 * services.
-	 */
-	public ReferenceDTO[]			references;
-
-	/**
-	 * The name of the activate method.
-	 * 
-	 * <p>
-	 * This is declared in the {@code activate} attribute of the
-	 * {@code component} element. This must be {@code null} if the component
-	 * description does not declare an activate method name.
-	 */
-	public String				activate;
-
-	/**
-	 * The name of the deactivate method.
-	 * 
-	 * <p>
-	 * This is declared in the {@code deactivate} attribute of the
-	 * {@code component} element. This must be {@code null} if the component
-	 * description does not declare a deactivate method name.
-	 */
-	public String				deactivate;
-
-	/**
-	 * The name of the modified method.
-	 * 
-	 * <p>
-	 * This is declared in the {@code modified} attribute of the
-	 * {@code component} element. This must be {@code null} if the component
-	 * description does not declare a modified method name.
-	 */
-	public String				modified;
-
-	/**
-	 * The configuration policy.
-	 * 
-	 * <p>
-	 * This is declared in the {@code configuration-policy} attribute of the
-	 * {@code component} element. This must be the default configuration policy
-	 * if the component description does not declare a configuration policy.
-	 */
-	public String				configurationPolicy;
-
-	/**
-	 * The configuration pids.
-	 * 
-	 * <p>
-	 * These are declared in the {@code configuration-pid} attribute of the
-	 * {@code component} element. This must contain the default configuration
-	 * pid if the component description does not declare a configuration pid.
-	 */
-	public String[]				configurationPid;
-}
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/dto/ReferenceDTO.java b/scr/src/main/java/org/osgi/service/component/runtime/dto/ReferenceDTO.java
deleted file mode 100755
index 8f7c5b1..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/dto/ReferenceDTO.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2013, 2015). 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.component.runtime.dto;
-
-import org.osgi.dto.DTO;
-
-/**
- * A representation of a declared reference to a service.
- * 
- * @since 1.3
- * @NotThreadSafe
- * @author $Id: fca2413271fcded16b4ebe3c6628fe8660e2575e $
- */
-public class ReferenceDTO extends DTO {
-
-	/**
-	 * The name of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code name} attribute of the {@code reference}
-	 * element. This must be the default name if the component description does
-	 * not declare a name for the reference.
-	 */
-	public String	name;
-
-	/**
-	 * The service interface of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code interface} attribute of the
-	 * {@code reference} element.
-	 */
-	public String	interfaceName;
-
-	/**
-	 * The cardinality of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code cardinality} attribute of the
-	 * {@code reference} element. This must be the default cardinality if the
-	 * component description does not declare a cardinality for the reference.
-	 */
-	public String	cardinality;
-
-	/**
-	 * The policy of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code policy} attribute of the {@code reference}
-	 * element. This must be the default policy if the component description
-	 * does not declare a policy for the reference.
-	 */
-	public String	policy;
-
-	/**
-	 * The policy option of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code policy-option} attribute of the
-	 * {@code reference} element. This must be the default policy option if the
-	 * component description does not declare a policy option for the reference.
-	 */
-	public String	policyOption;
-
-	/**
-	 * The target of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code target} attribute of the {@code reference}
-	 * element. This must be {@code null} if the component description does not
-	 * declare a target for the reference.
-	 */
-	public String	target;
-
-	/**
-	 * The name of the bind method of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code bind} attribute of the {@code reference}
-	 * element. This must be {@code null} if the component description does not
-	 * declare a bind method for the reference.
-	 */
-	public String	bind;
-
-	/**
-	 * The name of the unbind method of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code unbind} attribute of the {@code reference}
-	 * element. This must be {@code null} if the component description does not
-	 * declare an unbind method for the reference.
-	 */
-	public String	unbind;
-
-	/**
-	 * The name of the updated method of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code updated} attribute of the
-	 * {@code reference} element. This must be {@code null} if the component
-	 * description does not declare an updated method for the reference.
-	 */
-	public String	updated;
-
-	/**
-	 * The name of the field of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code field} attribute of the {@code reference}
-	 * element. This must be {@code null} if the component description does not
-	 * declare a field for the reference.
-	 */
-	public String	field;
-
-	/**
-	 * The field option of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code field-option} attribute of the
-	 * {@code reference} element. This must be {@code null} if the component
-	 * description does not declare a field for the reference.
-	 */
-	public String	fieldOption;
-
-	/**
-	 * The scope of the reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code scope} attribute of the {@code reference}
-	 * element. This must be the default scope if the component description does
-	 * not declare a scope for the reference.
-	 */
-	public String	scope;
-}
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/dto/SatisfiedReferenceDTO.java b/scr/src/main/java/org/osgi/service/component/runtime/dto/SatisfiedReferenceDTO.java
deleted file mode 100755
index 3bfc082..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/dto/SatisfiedReferenceDTO.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2013, 2014). 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.component.runtime.dto;
-
-import org.osgi.dto.DTO;
-import org.osgi.framework.dto.ServiceReferenceDTO;
-
-/**
- * A representation of a satisfied reference.
- * 
- * @since 1.3
- * @NotThreadSafe
- * @author $Id: 20de229ef78ffbfd603b62d4534721e2f2b17922 $
- */
-public class SatisfiedReferenceDTO extends DTO {
-	/**
-	 * The name of the declared reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code name} attribute of the {@code reference}
-	 * element of the component description.
-	 * 
-	 * @see ReferenceDTO#name
-	 */
-	public String					name;
-
-	/**
-	 * The target property of the satisfied reference.
-	 * 
-	 * <p>
-	 * This is the value of the {@link ComponentConfigurationDTO#properties
-	 * component property} whose name is the concatenation of the
-	 * {@link ReferenceDTO#name declared reference name} and
-	 * &quot;.target&quot;. This must be {@code null} if no target property is
-	 * set for the reference.
-	 */
-	public String					target;
-
-	/**
-	 * The bound services.
-	 * 
-	 * <p>
-	 * Each {@link ServiceReferenceDTO} in the array represents a service bound
-	 * to the satisfied reference. The array must be empty if there are no bound
-	 * services.
-	 */
-	public ServiceReferenceDTO[]	boundServices;
-}
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/dto/UnsatisfiedReferenceDTO.java b/scr/src/main/java/org/osgi/service/component/runtime/dto/UnsatisfiedReferenceDTO.java
deleted file mode 100644
index 870c5c3..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/dto/UnsatisfiedReferenceDTO.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2013, 2014). 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.component.runtime.dto;
-
-import org.osgi.dto.DTO;
-import org.osgi.framework.dto.ServiceReferenceDTO;
-
-/**
- * A representation of an unsatisfied reference.
- * 
- * @since 1.3
- * @NotThreadSafe
- * @author $Id: 20ce77a3dbc307be592c86bf7b5eddacfe77e21b $
- */
-public class UnsatisfiedReferenceDTO extends DTO {
-	/**
-	 * The name of the declared reference.
-	 * 
-	 * <p>
-	 * This is declared in the {@code name} attribute of the {@code reference}
-	 * element of the component description.
-	 * 
-	 * @see ReferenceDTO#name
-	 */
-	public String					name;
-
-	/**
-	 * The target property of the unsatisfied reference.
-	 * 
-	 * <p>
-	 * This is the value of the {@link ComponentConfigurationDTO#properties
-	 * component property} whose name is the concatenation of the
-	 * {@link ReferenceDTO#name declared reference name} and
-	 * &quot;.target&quot;. This must be {@code null} if no target property is
-	 * set for the reference.
-	 */
-	public String					target;
-
-	/**
-	 * The target services.
-	 * 
-	 * <p>
-	 * Each {@link ServiceReferenceDTO} in the array represents a target service
-	 * for the reference. The array must be empty if there are no target
-	 * services. The upper bound on the number of target services in the array
-	 * is the upper bound on the {@link ReferenceDTO#cardinality cardinality} of
-	 * the reference.
-	 */
-	public ServiceReferenceDTO[]	targetServices;
-}
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/dto/package-info.java b/scr/src/main/java/org/osgi/service/component/runtime/dto/package-info.java
deleted file mode 100644
index 75c3b78..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/dto/package-info.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.
- */
-
-/**
- * Service Component Runtime Data Transfer Objects Package Version 1.3.
- *
- * <p>
- * Bundles wishing to use this package must list the package in the
- * Import-Package header of the bundle's manifest. This package has two types of
- * users: the consumers that use the API in this package and the providers that
- * implement the API in this package.
- *
- * <p>
- * Example import for consumers using the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.service.component.runtime.dto; version="[1.3,2.0)"}
- * <p>
- * Example import for providers implementing the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.service.component.runtime.dto; version="[1.3,1.4)"}
- *
- * @author $Id: d7d82da09d67a3ce4274ad8554966c1952a2b4de $
- */
-
-@Version("1.3")
-package org.osgi.service.component.runtime.dto;
-
-import org.osgi.annotation.versioning.Version;
-
diff --git a/scr/src/main/java/org/osgi/service/component/runtime/package-info.java b/scr/src/main/java/org/osgi/service/component/runtime/package-info.java
deleted file mode 100644
index 1dd3488..0000000
--- a/scr/src/main/java/org/osgi/service/component/runtime/package-info.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2013). 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.
- */
-
-/**
- * Service Component Runtime Package Version 1.3.
- *
- * <p>
- * Bundles wishing to use this package must list the package in the
- * Import-Package header of the bundle's manifest. This package has two types of
- * users: the consumers that use the API in this package and the providers that
- * implement the API in this package.
- *
- * <p>
- * Example import for consumers using the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.service.component.runtime; version="[1.3,2.0)"}
- * <p>
- * Example import for providers implementing the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.service.component.runtime; version="[1.3,1.4)"}
- *
- * @author $Id: 3d4fa42ce33a4682cbaeee3f094b558e6ea6080f $
- */
-
-@Version("1.3")
-package org.osgi.service.component.runtime;
-
-import org.osgi.annotation.versioning.Version;
-
diff --git a/scr/src/main/java/org/osgi/util/function/Function.java b/scr/src/main/java/org/osgi/util/function/Function.java
deleted file mode 100644
index 313d772..0000000
--- a/scr/src/main/java/org/osgi/util/function/Function.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.function;
-
-import org.osgi.annotation.versioning.ConsumerType;
-
-/**
- * A function that accepts a single argument and produces a result.
- *
- * <p>
- * This is a functional interface and can be used as the assignment target for a
- * lambda expression or method reference.
- * 
- * @param <T> The type of the function input.
- * @param <R> The type of the function output.
- * 
- * @ThreadSafe
- * @author $Id: 5d812f75c0b4f88f01083189babb3ef7476b5ced $
- */
-@ConsumerType
-public interface Function<T, R> {
-	/**
-	 * Applies this function to the specified argument.
-	 * 
-	 * @param t The input to this function.
-	 * @return The output of this function.
-	 */
-	R apply(T t);
-}
diff --git a/scr/src/main/java/org/osgi/util/function/Predicate.java b/scr/src/main/java/org/osgi/util/function/Predicate.java
deleted file mode 100644
index 8b4c695..0000000
--- a/scr/src/main/java/org/osgi/util/function/Predicate.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.function;
-
-import org.osgi.annotation.versioning.ConsumerType;
-
-/**
- * A predicate that accepts a single argument and produces a boolean result.
- *
- * <p>
- * This is a functional interface and can be used as the assignment target for a
- * lambda expression or method reference.
- * 
- * @param <T> The type of the predicate input.
- * 
- * @ThreadSafe
- * @author $Id: 0c2c61f78bede4e2afc4278af4f5e4b873769347 $
- */
-@ConsumerType
-public interface Predicate<T> {
-	/**
-	 * Evaluates this predicate on the specified argument.
-	 * 
-	 * @param t The input to this predicate.
-	 * @return {@code true} if the specified argument is accepted by this
-	 *         predicate; {@code false} otherwise.
-	 */
-	boolean test(T t);
-}
diff --git a/scr/src/main/java/org/osgi/util/function/package-info.java b/scr/src/main/java/org/osgi/util/function/package-info.java
deleted file mode 100644
index 6dcf3b8..0000000
--- a/scr/src/main/java/org/osgi/util/function/package-info.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.
- */
-
-/**
- * Function Package Version 1.0.
- * 
- * <p>
- * Bundles wishing to use this package must list the package in the
- * Import-Package header of the bundle's manifest.
- * 
- * <p>
- * Example import for consumers using the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.util.function; version="[1.0,2.0)"}
- * <p>
- * Example import for providers implementing the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.util.function; version="[1.0,1.1)"}
- * 
- * @author $Id: 899d786b27012f55ed87b4c872a6ab2087a20a39 $
- */
-
-@Version("1.0")
-package org.osgi.util.function;
-
-import org.osgi.annotation.versioning.Version;
-
diff --git a/scr/src/main/java/org/osgi/util/promise/Deferred.java b/scr/src/main/java/org/osgi/util/promise/Deferred.java
deleted file mode 100644
index 29efdeb..0000000
--- a/scr/src/main/java/org/osgi/util/promise/Deferred.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.promise;
-
-import static org.osgi.util.promise.PromiseImpl.requireNonNull;
-
-/**
- * A Deferred Promise resolution.
- * 
- * <p>
- * Instances of this class can be used to create a {@link Promise} that can be
- * resolved in the future. The {@link #getPromise() associated} Promise can be
- * successfully resolved with {@link #resolve(Object)} or resolved with a
- * failure with {@link #fail(Throwable)}. It can also be resolved with the
- * resolution of another promise using {@link #resolveWith(Promise)}.
- * 
- * <p>
- * The associated Promise can be provided to any one, but the Deferred object
- * should be made available only to the party that will responsible for
- * resolving the Promise.
- * 
- * @param <T> The value type associated with the created Promise.
- * 
- * @Immutable
- * @author $Id: b12288b7edc994f615dc1305d6aeaeeb56208df7 $
- */
-public class Deferred<T> {
-	private final PromiseImpl<T>	promise;
-
-	/**
-	 * Create a new Deferred with an associated Promise.
-	 */
-	public Deferred() {
-		promise = new PromiseImpl<T>();
-	}
-
-	/**
-	 * Returns the Promise associated with this Deferred.
-	 * 
-	 * @return The Promise associated with this Deferred.
-	 */
-	public Promise<T> getPromise() {
-		return promise;
-	}
-
-	/**
-	 * Successfully resolve the Promise associated with this Deferred.
-	 * 
-	 * <p>
-	 * After the associated Promise is resolved with the specified value, all
-	 * registered {@link Promise#onResolve(Runnable) callbacks} are called and
-	 * any {@link Promise#then(Success, Failure) chained} Promises are resolved.
-	 * 
-	 * <p>
-	 * Resolving the associated Promise <i>happens-before</i> any registered
-	 * callback is called. That is, in a registered callback,
-	 * {@link Promise#isDone()} must return {@code true} and
-	 * {@link Promise#getValue()} and {@link Promise#getFailure()} must not
-	 * block.
-	 * 
-	 * @param value The value of the resolved Promise.
-	 * @throws IllegalStateException If the associated Promise was already
-	 *         resolved.
-	 */
-	public void resolve(T value) {
-		promise.resolve(value, null);
-	}
-
-	/**
-	 * Fail the Promise associated with this Deferred.
-	 * 
-	 * <p>
-	 * After the associated Promise is resolved with the specified failure, all
-	 * registered {@link Promise#onResolve(Runnable) callbacks} are called and
-	 * any {@link Promise#then(Success, Failure) chained} Promises are resolved.
-	 * 
-	 * <p>
-	 * Resolving the associated Promise <i>happens-before</i> any registered
-	 * callback is called. That is, in a registered callback,
-	 * {@link Promise#isDone()} must return {@code true} and
-	 * {@link Promise#getValue()} and {@link Promise#getFailure()} must not
-	 * block.
-	 * 
-	 * @param failure The failure of the resolved Promise. Must not be
-	 *        {@code null}.
-	 * @throws IllegalStateException If the associated Promise was already
-	 *         resolved.
-	 */
-	public void fail(Throwable failure) {
-		promise.resolve(null, requireNonNull(failure));
-	}
-
-	/**
-	 * Resolve the Promise associated with this Deferred with the specified
-	 * Promise.
-	 * 
-	 * <p>
-	 * If the specified Promise is successfully resolved, the associated Promise
-	 * is resolved with the value of the specified Promise. If the specified
-	 * Promise is resolved with a failure, the associated Promise is resolved
-	 * with the failure of the specified Promise.
-	 * 
-	 * <p>
-	 * After the associated Promise is resolved with the specified Promise, all
-	 * registered {@link Promise#onResolve(Runnable) callbacks} are called and
-	 * any {@link Promise#then(Success, Failure) chained} Promises are resolved.
-	 * 
-	 * <p>
-	 * Resolving the associated Promise <i>happens-before</i> any registered
-	 * callback is called. That is, in a registered callback,
-	 * {@link Promise#isDone()} must return {@code true} and
-	 * {@link Promise#getValue()} and {@link Promise#getFailure()} must not
-	 * block.
-	 * 
-	 * @param with A Promise whose value or failure will be used to resolve the
-	 *        associated Promise. Must not be {@code null}.
-	 * @return A Promise that is resolved only when the associated Promise is
-	 *         resolved by the specified Promise. The returned Promise will be
-	 *         successfully resolved, with the value {@code null}, if the
-	 *         associated Promise was resolved by the specified Promise. The
-	 *         returned Promise will be resolved with a failure of
-	 *         {@link IllegalStateException} if the associated Promise was
-	 *         already resolved when the specified Promise was resolved.
-	 */
-	public Promise<Void> resolveWith(Promise<? extends T> with) {
-		return promise.resolveWith(with);
-	}
-}
diff --git a/scr/src/main/java/org/osgi/util/promise/FailedPromisesException.java b/scr/src/main/java/org/osgi/util/promise/FailedPromisesException.java
deleted file mode 100644
index 6d9c472..0000000
--- a/scr/src/main/java/org/osgi/util/promise/FailedPromisesException.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.promise;
-
-import java.util.Collection;
-import java.util.Collections;
-
-/**
- * Promise failure exception for a collection of failed Promises.
- * 
- * @author $Id: 95546abe53fcca0c3daa3d2847a915fe94b9cef8 $
- */
-public class FailedPromisesException extends RuntimeException {
-	private static final long				serialVersionUID	= 1L;
-	private final Collection<Promise<?>>	failed;
-
-	/**
-	 * Create a new FailedPromisesException with the specified Promises.
-	 * 
-	 * @param failed A collection of Promises that have been resolved with a
-	 *        failure. Must not be {@code null}, must not be empty and all of
-	 *        the elements in the collection must not be {@code null}.
-	 * @param cause The cause of this exception. This is typically the failure
-	 *        of the first Promise in the specified collection.
-	 */
-	public FailedPromisesException(Collection<Promise<?>> failed, Throwable cause) {
-		super(cause);
-		this.failed = Collections.unmodifiableCollection(failed);
-	}
-
-	/**
-	 * Returns the collection of Promises that have been resolved with a
-	 * failure.
-	 * 
-	 * @return The collection of Promises that have been resolved with a
-	 *         failure. The returned collection is unmodifiable.
-	 */
-	public Collection<Promise<?>> getFailedPromises() {
-		return failed;
-	}
-}
diff --git a/scr/src/main/java/org/osgi/util/promise/Failure.java b/scr/src/main/java/org/osgi/util/promise/Failure.java
deleted file mode 100644
index ab93794..0000000
--- a/scr/src/main/java/org/osgi/util/promise/Failure.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.promise;
-
-import org.osgi.annotation.versioning.ConsumerType;
-
-/**
- * Failure callback for a Promise.
- * 
- * <p>
- * A Failure callback is registered with a {@link Promise} using the
- * {@link Promise#then(Success, Failure)} method and is called if the Promise is
- * resolved with a failure.
- * 
- * <p>
- * This is a functional interface and can be used as the assignment target for a
- * lambda expression or method reference.
- * 
- * @ThreadSafe
- * @author $Id: a4bd1ef9948a4abb9fc01a140bd9562be0beb9aa $
- */
-@ConsumerType
-public interface Failure {
-	/**
-	 * Failure callback for a Promise.
-	 * 
-	 * <p>
-	 * This method is called if the Promise with which it is registered resolves
-	 * with a failure.
-	 * 
-	 * <p>
-	 * In the remainder of this description we will refer to the Promise
-	 * returned by {@link Promise#then(Success, Failure)} when this Failure
-	 * callback was registered as the chained Promise.
-	 * 
-	 * <p>
-	 * If this methods completes normally, the chained Promise will be failed
-	 * with the same exception which failed the resolved Promise. If this method
-	 * throws an exception, the chained Promise will be failed with the thrown
-	 * exception.
-	 * 
-	 * @param resolved The failed resolved {@link Promise}.
-	 * @throws Exception The chained Promise will be failed with the thrown
-	 *         exception.
-	 */
-	void fail(Promise<?> resolved) throws Exception;
-}
diff --git a/scr/src/main/java/org/osgi/util/promise/Promise.java b/scr/src/main/java/org/osgi/util/promise/Promise.java
deleted file mode 100644
index 74e4b59..0000000
--- a/scr/src/main/java/org/osgi/util/promise/Promise.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.promise;
-
-import java.lang.reflect.InvocationTargetException;
-import org.osgi.annotation.versioning.ProviderType;
-import org.osgi.util.function.Function;
-import org.osgi.util.function.Predicate;
-
-/**
- * A Promise of a value.
- * 
- * <p>
- * A Promise represents a future value. It handles the interactions for
- * asynchronous processing. A {@link Deferred} object can be used to create a
- * Promise and later resolve the Promise. A Promise is used by the caller of an
- * asynchronous function to get the result or handle the error. The caller can
- * either get a callback when the Promise is resolved with a value or an error,
- * or the Promise can be used in chaining. In chaining, callbacks are provided
- * that receive the resolved Promise, and a new Promise is generated that
- * resolves based upon the result of a callback.
- * 
- * <p>
- * Both {@link #onResolve(Runnable) callbacks} and
- * {@link #then(Success, Failure) chaining} can be repeated any number of times,
- * even after the Promise has been resolved.
- * <p>
- * Example callback usage:
- * 
- * <pre>
- * final Promise&lt;String&gt; foo = foo();
- * foo.onResolve(new Runnable() {
- *   public void run() {
- *     System.out.println(foo.getValue());
- *   }
- * });
- * </pre>
- * 
- * Example chaining usage;
- * 
- * <pre>
- * Success&lt;String,String&gt; doubler = new Success&lt;String,String&gt;() {
- *   public Promise&lt;String&gt; call(Promise&lt;String&gt; p) throws Exception {
- *     return Promises.resolved(p.getValue()+p.getValue());
- *   }
- * };
- * final Promise&lt;String&gt; foo = foo().then(doubler).then(doubler);
- * foo.onResolve(new Runnable() {
- *   public void run() {
- *     System.out.println(foo.getValue());
- *   }
- * });
- * </pre>
- * 
- * @param <T> The value type associated with this Promise.
- * 
- * @ThreadSafe
- * @author $Id: 8a24f66339967ecdd03def57f31ac8c371a7f4cd $
- */
-@ProviderType
-public interface Promise<T> {
-
-	/**
-	 * Returns whether this Promise has been resolved.
-	 * 
-	 * <p>
-	 * This Promise may be successfully resolved or resolved with a failure.
-	 * 
-	 * @return {@code true} if this Promise was resolved either successfully or
-	 *         with a failure; {@code false} if this Promise is unresolved.
-	 */
-	boolean isDone();
-
-	/**
-	 * Returns the value of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is not {@link #isDone() resolved}, this method must block
-	 * and wait for this Promise to be resolved before completing.
-	 * 
-	 * <p>
-	 * If this Promise was successfully resolved, this method returns with the
-	 * value of this Promise. If this Promise was resolved with a failure, this
-	 * method must throw an {@code InvocationTargetException} with the
-	 * {@link #getFailure() failure exception} as the cause.
-	 * 
-	 * @return The value of this resolved Promise.
-	 * @throws InvocationTargetException If this Promise was resolved with a
-	 *         failure. The cause of the {@code InvocationTargetException} is
-	 *         the failure exception.
-	 * @throws InterruptedException If the current thread was interrupted while
-	 *         waiting.
-	 */
-	T getValue() throws InvocationTargetException, InterruptedException;
-
-	/**
-	 * Returns the failure of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is not {@link #isDone() resolved}, this method must block
-	 * and wait for this Promise to be resolved before completing.
-	 * 
-	 * <p>
-	 * If this Promise was resolved with a failure, this method returns with the
-	 * failure of this Promise. If this Promise was successfully resolved, this
-	 * method must return {@code null}.
-	 * 
-	 * @return The failure of this resolved Promise or {@code null} if this
-	 *         Promise was successfully resolved.
-	 * @throws InterruptedException If the current thread was interrupted while
-	 *         waiting.
-	 */
-	Throwable getFailure() throws InterruptedException;
-
-	/**
-	 * Register a callback to be called when this Promise is resolved.
-	 * 
-	 * <p>
-	 * The specified callback is called when this Promise is resolved either
-	 * successfully or with a failure.
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * <p>
-	 * Resolving this Promise <i>happens-before</i> any registered callback is
-	 * called. That is, in a registered callback, {@link #isDone()} must return
-	 * {@code true} and {@link #getValue()} and {@link #getFailure()} must not
-	 * block.
-	 * 
-	 * <p>
-	 * A callback may be called on a different thread than the thread which
-	 * registered the callback. So the callback must be thread safe but can rely
-	 * upon that the registration of the callback <i>happens-before</i> the
-	 * registered callback is called.
-	 * 
-	 * @param callback A callback to be called when this Promise is resolved.
-	 *        Must not be {@code null}.
-	 * @return This Promise.
-	 */
-	Promise<T> onResolve(Runnable callback);
-
-	/**
-	 * Chain a new Promise to this Promise with Success and Failure callbacks.
-	 * 
-	 * <p>
-	 * The specified {@link Success} callback is called when this Promise is
-	 * successfully resolved and the specified {@link Failure} callback is
-	 * called when this Promise is resolved with a failure.
-	 * 
-	 * <p>
-	 * This method returns a new Promise which is chained to this Promise. The
-	 * returned Promise must be resolved when this Promise is resolved after the
-	 * specified Success or Failure callback is executed. The result of the
-	 * executed callback must be used to resolve the returned Promise. Multiple
-	 * calls to this method can be used to create a chain of promises which are
-	 * resolved in sequence.
-	 * 
-	 * <p>
-	 * If this Promise is successfully resolved, the Success callback is
-	 * executed and the result Promise, if any, or thrown exception is used to
-	 * resolve the returned Promise from this method. If this Promise is
-	 * resolved with a failure, the Failure callback is executed and the
-	 * returned Promise from this method is failed.
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * <p>
-	 * Resolving this Promise <i>happens-before</i> any registered callback is
-	 * called. That is, in a registered callback, {@link #isDone()} must return
-	 * {@code true} and {@link #getValue()} and {@link #getFailure()} must not
-	 * block.
-	 * 
-	 * <p>
-	 * A callback may be called on a different thread than the thread which
-	 * registered the callback. So the callback must be thread safe but can rely
-	 * upon that the registration of the callback <i>happens-before</i> the
-	 * registered callback is called.
-	 * 
-	 * @param <R> The value type associated with the returned Promise.
-	 * @param success A Success callback to be called when this Promise is
-	 *        successfully resolved. May be {@code null} if no Success callback
-	 *        is required. In this case, the returned Promise must be resolved
-	 *        with the value {@code null} when this Promise is successfully
-	 *        resolved.
-	 * @param failure A Failure callback to be called when this Promise is
-	 *        resolved with a failure. May be {@code null} if no Failure
-	 *        callback is required.
-	 * @return A new Promise which is chained to this Promise. The returned
-	 *         Promise must be resolved when this Promise is resolved after the
-	 *         specified Success or Failure callback, if any, is executed.
-	 */
-	<R> Promise<R> then(Success<? super T, ? extends R> success, Failure failure);
-
-	/**
-	 * Chain a new Promise to this Promise with a Success callback.
-	 * 
-	 * <p>
-	 * This method performs the same function as calling
-	 * {@link #then(Success, Failure)} with the specified Success callback and
-	 * {@code null} for the Failure callback.
-	 * 
-	 * @param <R> The value type associated with the returned Promise.
-	 * @param success A Success callback to be called when this Promise is
-	 *        successfully resolved. May be {@code null} if no Success callback
-	 *        is required. In this case, the returned Promise must be resolved
-	 *        with the value {@code null} when this Promise is successfully
-	 *        resolved.
-	 * @return A new Promise which is chained to this Promise. The returned
-	 *         Promise must be resolved when this Promise is resolved after the
-	 *         specified Success, if any, is executed.
-	 * @see #then(Success, Failure)
-	 */
-	<R> Promise<R> then(Success<? super T, ? extends R> success);
-
-	/**
-	 * Filter the value of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is successfully resolved, the returned Promise will
-	 * either be resolved with the value of this Promise if the specified
-	 * Predicate accepts that value or failed with a
-	 * {@code NoSuchElementException} if the specified Predicate does not accept
-	 * that value. If the specified Predicate throws an exception, the returned
-	 * Promise will be failed with the exception.
-	 * 
-	 * <p>
-	 * If this Promise is resolved with a failure, the returned Promise will be
-	 * failed with that failure.
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * @param predicate The Predicate to evaluate the value of this Promise.
-	 *        Must not be {@code null}.
-	 * @return A Promise that filters the value of this Promise.
-	 */
-	Promise<T> filter(Predicate<? super T> predicate);
-
-	/**
-	 * Map the value of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is successfully resolved, the returned Promise will be
-	 * resolved with the value of specified Function as applied to the value of
-	 * this Promise. If the specified Function throws an exception, the returned
-	 * Promise will be failed with the exception.
-	 * 
-	 * <p>
-	 * If this Promise is resolved with a failure, the returned Promise will be
-	 * failed with that failure.
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * @param <R> The value type associated with the returned Promise.
-	 * @param mapper The Function that will map the value of this Promise to the
-	 *        value that will be used to resolve the returned Promise. Must not
-	 *        be {@code null}.
-	 * @return A Promise that returns the value of this Promise as mapped by the
-	 *         specified Function.
-	 */
-	<R> Promise<R> map(Function<? super T, ? extends R> mapper);
-
-	/**
-	 * FlatMap the value of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is successfully resolved, the returned Promise will be
-	 * resolved with the Promise from the specified Function as applied to the
-	 * value of this Promise. If the specified Function throws an exception, the
-	 * returned Promise will be failed with the exception.
-	 * 
-	 * <p>
-	 * If this Promise is resolved with a failure, the returned Promise will be
-	 * failed with that failure.
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * @param <R> The value type associated with the returned Promise.
-	 * @param mapper The Function that will flatMap the value of this Promise to
-	 *        a Promise that will be used to resolve the returned Promise. Must
-	 *        not be {@code null}.
-	 * @return A Promise that returns the value of this Promise as mapped by the
-	 *         specified Function.
-	 */
-	<R> Promise<R> flatMap(Function<? super T, Promise<? extends R>> mapper);
-
-	/**
-	 * Recover from a failure of this Promise with a recovery value.
-	 * 
-	 * <p>
-	 * If this Promise is successfully resolved, the returned Promise will be
-	 * resolved with the value of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is resolved with a failure, the specified Function is
-	 * applied to this Promise to produce a recovery value.
-	 * <ul>
-	 * <li>If the recovery value is not {@code null}, the returned Promise will
-	 * be resolved with the recovery value.</li>
-	 * <li>If the recovery value is {@code null}, the returned Promise will be
-	 * failed with the failure of this Promise.</li>
-	 * <li>If the specified Function throws an exception, the returned Promise
-	 * will be failed with that exception.</li>
-	 * </ul>
-	 * 
-	 * <p>
-	 * To recover from a failure of this Promise with a recovery value of
-	 * {@code null}, the {@link #recoverWith(Function)} method must be used. The
-	 * specified Function for {@link #recoverWith(Function)} can return
-	 * {@code Promises.resolved(null)} to supply the desired {@code null} value.
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * @param recovery If this Promise resolves with a failure, the specified
-	 *        Function is called to produce a recovery value to be used to
-	 *        resolve the returned Promise. Must not be {@code null}.
-	 * @return A Promise that resolves with the value of this Promise or
-	 *         recovers from the failure of this Promise.
-	 */
-	Promise<T> recover(Function<Promise<?>, ? extends T> recovery);
-
-	/**
-	 * Recover from a failure of this Promise with a recovery Promise.
-	 * 
-	 * <p>
-	 * If this Promise is successfully resolved, the returned Promise will be
-	 * resolved with the value of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is resolved with a failure, the specified Function is
-	 * applied to this Promise to produce a recovery Promise.
-	 * <ul>
-	 * <li>If the recovery Promise is not {@code null}, the returned Promise
-	 * will be resolved with the recovery Promise.</li>
-	 * <li>If the recovery Promise is {@code null}, the returned Promise will be
-	 * failed with the failure of this Promise.</li>
-	 * <li>If the specified Function throws an exception, the returned Promise
-	 * will be failed with that exception.</li>
-	 * </ul>
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * @param recovery If this Promise resolves with a failure, the specified
-	 *        Function is called to produce a recovery Promise to be used to
-	 *        resolve the returned Promise. Must not be {@code null}.
-	 * @return A Promise that resolves with the value of this Promise or
-	 *         recovers from the failure of this Promise.
-	 */
-	Promise<T> recoverWith(Function<Promise<?>, Promise<? extends T>> recovery);
-
-	/**
-	 * Fall back to the value of the specified Promise if this Promise fails.
-	 * 
-	 * <p>
-	 * If this Promise is successfully resolved, the returned Promise will be
-	 * resolved with the value of this Promise.
-	 * 
-	 * <p>
-	 * If this Promise is resolved with a failure, the successful result of the
-	 * specified Promise is used to resolve the returned Promise. If the
-	 * specified Promise is resolved with a failure, the returned Promise will
-	 * be failed with the failure of this Promise rather than the failure of the
-	 * specified Promise.
-	 * 
-	 * <p>
-	 * This method may be called at any time including before and after this
-	 * Promise has been resolved.
-	 * 
-	 * @param fallback The Promise whose value will be used to resolve the
-	 *        returned Promise if this Promise resolves with a failure. Must not
-	 *        be {@code null}.
-	 * @return A Promise that returns the value of this Promise or falls back to
-	 *         the value of the specified Promise.
-	 */
-	Promise<T> fallbackTo(Promise<? extends T> fallback);
-}
diff --git a/scr/src/main/java/org/osgi/util/promise/PromiseImpl.java b/scr/src/main/java/org/osgi/util/promise/PromiseImpl.java
deleted file mode 100644
index 1b01472..0000000
--- a/scr/src/main/java/org/osgi/util/promise/PromiseImpl.java
+++ /dev/null
@@ -1,615 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.promise;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CountDownLatch;
-import org.osgi.util.function.Function;
-import org.osgi.util.function.Predicate;
-
-/**
- * Promise implementation.
- * 
- * <p>
- * This class is not used directly by clients. Clients should use
- * {@link Deferred} to create a resolvable {@link Promise}.
- * 
- * @param <T> The result type associated with the Promise.
- * 
- * @ThreadSafe
- * @author $Id: d8b44a36f3eb797316b213118192fac213fa0c59 $
- */
-final class PromiseImpl<T> implements Promise<T> {
-	/**
-	 * A ConcurrentLinkedQueue to hold the callbacks for this Promise, so no
-	 * additional synchronization is required to write to or read from the
-	 * queue.
-	 */
-	private final ConcurrentLinkedQueue<Runnable>	callbacks;
-	/**
-	 * A CountDownLatch to manage the resolved state of this Promise.
-	 * 
-	 * <p>
-	 * This object is used as the synchronizing object to provide a critical
-	 * section in {@link #resolve(Object, Throwable)} so that only a single
-	 * thread can write the resolved state variables and open the latch.
-	 * 
-	 * <p>
-	 * The resolved state variables, {@link #value} and {@link #fail}, must only
-	 * be written when the latch is closed (getCount() != 0) and must only be
-	 * read when the latch is open (getCount() == 0). The latch state must
-	 * always be checked before writing or reading since the resolved state
-	 * variables' memory consistency is guarded by the latch.
-	 */
-	private final CountDownLatch					resolved;
-	/**
-	 * The value of this Promise if successfully resolved.
-	 * 
-	 * @GuardedBy("resolved")
-	 * @see #resolved
-	 */
-	private T										value;
-	/**
-	 * The failure of this Promise if resolved with a failure or {@code null} if
-	 * successfully resolved.
-	 * 
-	 * @GuardedBy("resolved")
-	 * @see #resolved
-	 */
-	private Throwable								fail;
-
-	/**
-	 * Initialize this Promise.
-	 */
-	PromiseImpl() {
-		callbacks = new ConcurrentLinkedQueue<Runnable>();
-		resolved = new CountDownLatch(1);
-	}
-
-	/**
-	 * Initialize and resolve this Promise.
-	 * 
-	 * @param v The value of this resolved Promise.
-	 * @param f The failure of this resolved Promise.
-	 */
-	PromiseImpl(T v, Throwable f) {
-		value = v;
-		fail = f;
-		callbacks = new ConcurrentLinkedQueue<Runnable>();
-		resolved = new CountDownLatch(0);
-	}
-
-	/**
-	 * Resolve this Promise.
-	 * 
-	 * @param v The value of this Promise.
-	 * @param f The failure of this Promise.
-	 */
-	void resolve(T v, Throwable f) {
-		// critical section: only one resolver at a time
-		synchronized (resolved) {
-			if (resolved.getCount() == 0) {
-				throw new IllegalStateException("Already resolved");
-			}
-			/*
-			 * The resolved state variables must be set before opening the
-			 * latch. This safely publishes them to be read by other threads
-			 * that must verify the latch is open before reading.
-			 */
-			value = v;
-			fail = f;
-			resolved.countDown();
-		}
-		notifyCallbacks(); // call any registered callbacks
-	}
-
-	/**
-	 * Call any registered callbacks if this Promise is resolved.
-	 */
-	private void notifyCallbacks() {
-		if (resolved.getCount() != 0) {
-			return; // return if not resolved
-		}
-
-		/*
-		 * Note: multiple threads can be in this method removing callbacks from
-		 * the queue and calling them, so the order in which callbacks are
-		 * called cannot be specified.
-		 */
-		for (Runnable callback = callbacks.poll(); callback != null; callback = callbacks.poll()) {
-			try {
-				callback.run();
-			} catch (Throwable t) {
-				Logger.logCallbackException(t);
-			}
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public boolean isDone() {
-		return resolved.getCount() == 0;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public T getValue() throws InvocationTargetException, InterruptedException {
-		resolved.await();
-		if (fail == null) {
-			return value;
-		}
-		throw new InvocationTargetException(fail);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Throwable getFailure() throws InterruptedException {
-		resolved.await();
-		return fail;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Promise<T> onResolve(Runnable callback) {
-		callbacks.offer(callback);
-		notifyCallbacks(); // call any registered callbacks
-		return this;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public <R> Promise<R> then(Success<? super T, ? extends R> success, Failure failure) {
-		PromiseImpl<R> chained = new PromiseImpl<R>();
-		onResolve(new Then<R>(chained, success, failure));
-		return chained;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public <R> Promise<R> then(Success<? super T, ? extends R> success) {
-		return then(success, null);
-	}
-
-	/**
-	 * A callback used to chain promises for the {@link #then(Success, Failure)}
-	 * method.
-	 * 
-	 * @Immutable
-	 */
-	private final class Then<R> implements Runnable {
-		private final PromiseImpl<R>			chained;
-		private final Success<T, ? extends R>	success;
-		private final Failure					failure;
-
-		@SuppressWarnings("unchecked")
-		Then(PromiseImpl<R> chained, Success<? super T, ? extends R> success, Failure failure) {
-			this.chained = chained;
-			this.success = (Success<T, ? extends R>) success;
-			this.failure = failure;
-		}
-
-		public void run() {
-			Throwable f;
-			final boolean interrupted = Thread.interrupted();
-			try {
-				f = getFailure();
-			} catch (Throwable e) {
-				f = e; // propagate new exception
-			} finally {
-				if (interrupted) { // restore interrupt status
-					Thread.currentThread().interrupt();
-				}
-			}
-			if (f != null) {
-				if (failure != null) {
-					try {
-						failure.fail(PromiseImpl.this);
-					} catch (Throwable e) {
-						f = e; // propagate new exception
-					}
-				}
-				// fail chained
-				chained.resolve(null, f);
-				return;
-			}
-			Promise<? extends R> returned = null;
-			if (success != null) {
-				try {
-					returned = success.call(PromiseImpl.this);
-				} catch (Throwable e) {
-					chained.resolve(null, e);
-					return;
-				}
-			}
-			if (returned == null) {
-				// resolve chained with null value
-				chained.resolve(null, null);
-			} else {
-				// resolve chained when returned promise is resolved
-				returned.onResolve(new Chain<R>(chained, returned));
-			}
-		}
-	}
-
-	/**
-	 * A callback used to resolve the chained Promise when the Promise promise
-	 * is resolved.
-	 * 
-	 * @Immutable
-	 */
-	private final static class Chain<R> implements Runnable {
-		private final PromiseImpl<R>		chained;
-		private final Promise<? extends R>	promise;
-		private final Throwable				failure;
-
-		Chain(PromiseImpl<R> chained, Promise<? extends R> promise) {
-			this.chained = chained;
-			this.promise = promise;
-			this.failure = null;
-		}
-
-		Chain(PromiseImpl<R> chained, Promise<? extends R> promise, Throwable failure) {
-			this.chained = chained;
-			this.promise = promise;
-			this.failure = failure;
-		}
-
-		public void run() {
-			R value = null;
-			Throwable f;
-			final boolean interrupted = Thread.interrupted();
-			try {
-				f = promise.getFailure();
-				if (f == null) {
-					value = promise.getValue();
-				} else if (failure != null) {
-					f = failure;
-				}
-			} catch (Throwable e) {
-				f = e; // propagate new exception
-			} finally {
-				if (interrupted) { // restore interrupt status
-					Thread.currentThread().interrupt();
-				}
-			}
-			chained.resolve(value, f);
-		}
-	}
-
-	/**
-	 * Resolve this Promise with the specified Promise.
-	 * 
-	 * <p>
-	 * If the specified Promise is successfully resolved, this Promise is
-	 * resolved with the value of the specified Promise. If the specified
-	 * Promise is resolved with a failure, this Promise is resolved with the
-	 * failure of the specified Promise.
-	 * 
-	 * @param with A Promise whose value or failure will be used to resolve this
-	 *        Promise. Must not be {@code null}.
-	 * @return A Promise that is resolved only when this Promise is resolved by
-	 *         the specified Promise. The returned Promise will be successfully
-	 *         resolved, with the value {@code null}, if this Promise was
-	 *         resolved by the specified Promise. The returned Promise will be
-	 *         resolved with a failure of {@link IllegalStateException} if this
-	 *         Promise was already resolved when the specified Promise was
-	 *         resolved.
-	 */
-	Promise<Void> resolveWith(Promise<? extends T> with) {
-		PromiseImpl<Void> chained = new PromiseImpl<Void>();
-		ResolveWith resolveWith = new ResolveWith(chained);
-		with.then(resolveWith, resolveWith);
-		return chained;
-	}
-
-	/**
-	 * A callback used to resolve this Promise with another Promise for the
-	 * {@link PromiseImpl#resolveWith(Promise)} method.
-	 * 
-	 * @Immutable
-	 */
-	private final class ResolveWith implements Success<T, Void>, Failure {
-		private final PromiseImpl<Void>	chained;
-
-		ResolveWith(PromiseImpl<Void> chained) {
-			this.chained = chained;
-		}
-
-		public Promise<Void> call(Promise<T> with) throws Exception {
-			try {
-				resolve(with.getValue(), null);
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return null;
-			}
-			chained.resolve(null, null);
-			return null;
-		}
-
-		public void fail(Promise<?> with) throws Exception {
-			try {
-				resolve(null, with.getFailure());
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return;
-			}
-			chained.resolve(null, null);
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Promise<T> filter(Predicate<? super T> predicate) {
-		return then(new Filter<T>(predicate));
-	}
-
-	/**
-	 * A callback used by the {@link PromiseImpl#filter(Predicate)} method.
-	 * 
-	 * @Immutable
-	 */
-	private static final class Filter<T> implements Success<T, T> {
-		private final Predicate<? super T>	predicate;
-
-		Filter(Predicate<? super T> predicate) {
-			this.predicate = requireNonNull(predicate);
-		}
-
-		public Promise<T> call(Promise<T> resolved) throws Exception {
-			if (predicate.test(resolved.getValue())) {
-				return resolved;
-			}
-			throw new NoSuchElementException();
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public <R> Promise<R> map(Function<? super T, ? extends R> mapper) {
-		return then(new Map<T, R>(mapper));
-	}
-
-	/**
-	 * A callback used by the {@link PromiseImpl#map(Function)} method.
-	 * 
-	 * @Immutable
-	 */
-	private static final class Map<T, R> implements Success<T, R> {
-		private final Function<? super T, ? extends R>	mapper;
-
-		Map(Function<? super T, ? extends R> mapper) {
-			this.mapper = requireNonNull(mapper);
-		}
-
-		public Promise<R> call(Promise<T> resolved) throws Exception {
-			return new PromiseImpl<R>(mapper.apply(resolved.getValue()), null);
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public <R> Promise<R> flatMap(Function<? super T, Promise<? extends R>> mapper) {
-		return then(new FlatMap<T, R>(mapper));
-	}
-
-	/**
-	 * A callback used by the {@link PromiseImpl#flatMap(Function)} method.
-	 * 
-	 * @Immutable
-	 */
-	private static final class FlatMap<T, R> implements Success<T, R> {
-		private final Function<? super T, Promise<? extends R>>	mapper;
-
-		FlatMap(Function<? super T, Promise<? extends R>> mapper) {
-			this.mapper = requireNonNull(mapper);
-		}
-
-		@SuppressWarnings("unchecked")
-		public Promise<R> call(Promise<T> resolved) throws Exception {
-			return (Promise<R>) mapper.apply(resolved.getValue());
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Promise<T> recover(Function<Promise<?>, ? extends T> recovery) {
-		PromiseImpl<T> chained = new PromiseImpl<T>();
-		Recover<T> recover = new Recover<T>(chained, recovery);
-		then(recover, recover);
-		return chained;
-	}
-
-	/**
-	 * A callback used by the {@link PromiseImpl#recover(Function)} method.
-	 * 
-	 * @Immutable
-	 */
-	private static final class Recover<T> implements Success<T, Void>, Failure {
-		private final PromiseImpl<T>					chained;
-		private final Function<Promise<?>, ? extends T>	recovery;
-
-		Recover(PromiseImpl<T> chained, Function<Promise<?>, ? extends T> recovery) {
-			this.chained = chained;
-			this.recovery = requireNonNull(recovery);
-		}
-
-		public Promise<Void> call(Promise<T> resolved) throws Exception {
-			T value;
-			try {
-				value = resolved.getValue();
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return null;
-			}
-			chained.resolve(value, null);
-			return null;
-		}
-
-		public void fail(Promise<?> resolved) throws Exception {
-			T recovered;
-			Throwable failure;
-			try {
-				recovered = recovery.apply(resolved);
-				failure = resolved.getFailure();
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return;
-			}
-			if (recovered == null) {
-				chained.resolve(null, failure);
-			} else {
-				chained.resolve(recovered, null);
-			}
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Promise<T> recoverWith(Function<Promise<?>, Promise<? extends T>> recovery) {
-		PromiseImpl<T> chained = new PromiseImpl<T>();
-		RecoverWith<T> recoverWith = new RecoverWith<T>(chained, recovery);
-		then(recoverWith, recoverWith);
-		return chained;
-	}
-
-	/**
-	 * A callback used by the {@link PromiseImpl#recoverWith(Function)} method.
-	 * 
-	 * @Immutable
-	 */
-	private static final class RecoverWith<T> implements Success<T, Void>, Failure {
-		private final PromiseImpl<T>								chained;
-		private final Function<Promise<?>, Promise<? extends T>>	recovery;
-
-		RecoverWith(PromiseImpl<T> chained, Function<Promise<?>, Promise<? extends T>> recovery) {
-			this.chained = chained;
-			this.recovery = requireNonNull(recovery);
-		}
-
-		public Promise<Void> call(Promise<T> resolved) throws Exception {
-			T value;
-			try {
-				value = resolved.getValue();
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return null;
-			}
-			chained.resolve(value, null);
-			return null;
-		}
-
-		public void fail(Promise<?> resolved) throws Exception {
-			Promise<? extends T> recovered;
-			Throwable failure;
-			try {
-				recovered = recovery.apply(resolved);
-				failure = resolved.getFailure();
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return;
-			}
-			if (recovered == null) {
-				chained.resolve(null, failure);
-			} else {
-				recovered.onResolve(new Chain<T>(chained, recovered));
-			}
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Promise<T> fallbackTo(Promise<? extends T> fallback) {
-		PromiseImpl<T> chained = new PromiseImpl<T>();
-		FallbackTo<T> fallbackTo = new FallbackTo<T>(chained, fallback);
-		then(fallbackTo, fallbackTo);
-		return chained;
-	}
-
-	/**
-	 * A callback used by the {@link PromiseImpl#fallbackTo(Promise)} method.
-	 * 
-	 * @Immutable
-	 */
-	private static final class FallbackTo<T> implements Success<T, Void>, Failure {
-		private final PromiseImpl<T>		chained;
-		private final Promise<? extends T>	fallback;
-
-		FallbackTo(PromiseImpl<T> chained, Promise<? extends T> fallback) {
-			this.chained = chained;
-			this.fallback = requireNonNull(fallback);
-		}
-
-		public Promise<Void> call(Promise<T> resolved) throws Exception {
-			T value;
-			try {
-				value = resolved.getValue();
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return null;
-			}
-			chained.resolve(value, null);
-			return null;
-		}
-
-		public void fail(Promise<?> resolved) throws Exception {
-			Throwable failure;
-			try {
-				failure = resolved.getFailure();
-			} catch (Throwable e) {
-				chained.resolve(null, e);
-				return;
-			}
-			fallback.onResolve(new Chain<T>(chained, fallback, failure));
-		}
-	}
-
-	static <V> V requireNonNull(V value) {
-		if (value != null) {
-			return value;
-		}
-		throw new NullPointerException();
-	}
-
-	/**
-	 * Use the lazy initialization holder class idiom to delay creating a Logger
-	 * until we actually need it.
-	 */
-	private static final class Logger {
-		private final static java.util.logging.Logger	LOGGER;
-		static {
-			LOGGER = java.util.logging.Logger.getLogger(PromiseImpl.class.getName());
-		}
-
-		static void logCallbackException(Throwable t) {
-			LOGGER.log(java.util.logging.Level.WARNING, "Exception from Promise callback", t);
-		}
-	}
-}
diff --git a/scr/src/main/java/org/osgi/util/promise/Promises.java b/scr/src/main/java/org/osgi/util/promise/Promises.java
deleted file mode 100644
index 4be25c0..0000000
--- a/scr/src/main/java/org/osgi/util/promise/Promises.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.promise;
-
-import static org.osgi.util.promise.PromiseImpl.requireNonNull;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Static helper methods for {@link Promise}s.
- * 
- * @ThreadSafe
- * @author $Id: 6ad9c7cca5a98dbddd87db8417df51bf6e008922 $
- */
-public class Promises {
-	private Promises() {
-		// disallow object creation
-	}
-
-	/**
-	 * Create a new Promise that has been resolved with the specified value.
-	 * 
-	 * @param <T> The value type associated with the returned Promise.
-	 * @param value The value of the resolved Promise.
-	 * @return A new Promise that has been resolved with the specified value.
-	 */
-	public static <T> Promise<T> resolved(T value) {
-		return new PromiseImpl<T>(value, null);
-	}
-
-	/**
-	 * Create a new Promise that has been resolved with the specified failure.
-	 * 
-	 * @param <T> The value type associated with the returned Promise.
-	 * @param failure The failure of the resolved Promise. Must not be
-	 *        {@code null}.
-	 * @return A new Promise that has been resolved with the specified failure.
-	 */
-	public static <T> Promise<T> failed(Throwable failure) {
-		return new PromiseImpl<T>(null, requireNonNull(failure));
-	}
-
-	/**
-	 * Create a new Promise that is a latch on the resolution of the specified
-	 * Promises.
-	 * 
-	 * <p>
-	 * The new Promise acts as a gate and must be resolved after all of the
-	 * specified Promises are resolved.
-	 * 
-	 * @param <T> The value type of the List value associated with the returned
-	 *        Promise.
-	 * @param <S> A subtype of the value type of the List value associated with
-	 *        the returned Promise.
-	 * @param promises The Promises which must be resolved before the returned
-	 *        Promise must be resolved. Must not be {@code null} and all of the
-	 *        elements in the collection must not be {@code null}.
-	 * @return A Promise that is resolved only when all the specified Promises
-	 *         are resolved. The returned Promise will be successfully resolved,
-	 *         with a List of the values in the order of the specified Promises,
-	 *         if all the specified Promises are successfully resolved. The List
-	 *         in the returned Promise is the property of the caller and is
-	 *         modifiable. The returned Promise will be resolved with a failure
-	 *         of {@link FailedPromisesException} if any of the specified
-	 *         Promises are resolved with a failure. The failure
-	 *         {@link FailedPromisesException} must contain all of the specified
-	 *         Promises which resolved with a failure.
-	 */
-	public static <T, S extends T> Promise<List<T>> all(Collection<Promise<S>> promises) {
-		if (promises.isEmpty()) {
-			List<T> result = new ArrayList<T>();
-			return resolved(result);
-		}
-		/* make a copy and capture the ordering */
-		List<Promise<? extends T>> list = new ArrayList<Promise<? extends T>>(promises);
-		PromiseImpl<List<T>> chained = new PromiseImpl<List<T>>();
-		All<T> all = new All<T>(chained, list);
-		for (Promise<? extends T> promise : list) {
-			promise.onResolve(all);
-		}
-		return chained;
-	}
-
-	/**
-	 * Create a new Promise that is a latch on the resolution of the specified
-	 * Promises.
-	 * 
-	 * <p>
-	 * The new Promise acts as a gate and must be resolved after all of the
-	 * specified Promises are resolved.
-	 * 
-	 * @param <T> The value type associated with the specified Promises.
-	 * @param promises The Promises which must be resolved before the returned
-	 *        Promise must be resolved. Must not be {@code null} and all of the
-	 *        arguments must not be {@code null}.
-	 * @return A Promise that is resolved only when all the specified Promises
-	 *         are resolved. The returned Promise will be successfully resolved,
-	 *         with a List of the values in the order of the specified Promises,
-	 *         if all the specified Promises are successfully resolved. The List
-	 *         in the returned Promise is the property of the caller and is
-	 *         modifiable. The returned Promise will be resolved with a failure
-	 *         of {@link FailedPromisesException} if any of the specified
-	 *         Promises are resolved with a failure. The failure
-	 *         {@link FailedPromisesException} must contain all of the specified
-	 *         Promises which resolved with a failure.
-	 */
-	public static <T> Promise<List<T>> all(Promise<? extends T>... promises) {
-		@SuppressWarnings("unchecked")
-		List<Promise<T>> list = Arrays.asList((Promise<T>[]) promises);
-		return all(list);
-	}
-
-	/**
-	 * A callback used to resolve a Promise when the specified list of Promises
-	 * are resolved for the {@link Promises#all(Collection)} method.
-	 * 
-	 * @ThreadSafe
-	 */
-	private static final class All<T> implements Runnable {
-		private final PromiseImpl<List<T>>			chained;
-		private final List<Promise<? extends T>>	promises;
-		private final AtomicInteger					promiseCount;
-
-		All(PromiseImpl<List<T>> chained, List<Promise<? extends T>> promises) {
-			this.chained = chained;
-			this.promises = promises;
-			this.promiseCount = new AtomicInteger(promises.size());
-		}
-
-		public void run() {
-			if (promiseCount.decrementAndGet() != 0) {
-				return;
-			}
-			List<T> result = new ArrayList<T>(promises.size());
-			List<Promise<?>> failed = new ArrayList<Promise<?>>(promises.size());
-			Throwable cause = null;
-			for (Promise<? extends T> promise : promises) {
-				Throwable failure;
-				T value;
-				try {
-					failure = promise.getFailure();
-					value = (failure != null) ? null : promise.getValue();
-				} catch (Throwable e) {
-					chained.resolve(null, e);
-					return;
-				}
-				if (failure != null) {
-					failed.add(promise);
-					if (cause == null) {
-						cause = failure;
-					}
-				} else {
-					result.add(value);
-				}
-			}
-			if (failed.isEmpty()) {
-				chained.resolve(result, null);
-			} else {
-				chained.resolve(null, new FailedPromisesException(failed, cause));
-			}
-		}
-	}
-}
diff --git a/scr/src/main/java/org/osgi/util/promise/Success.java b/scr/src/main/java/org/osgi/util/promise/Success.java
deleted file mode 100644
index 7f47c4e..0000000
--- a/scr/src/main/java/org/osgi/util/promise/Success.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.util.promise;
-
-import org.osgi.annotation.versioning.ConsumerType;
-
-/**
- * Success callback for a Promise.
- * 
- * <p>
- * A Success callback is registered with a {@link Promise} using the
- * {@link Promise#then(Success)} method and is called if the Promise is resolved
- * successfully.
- * 
- * <p>
- * This is a functional interface and can be used as the assignment target for a
- * lambda expression or method reference.
- * 
- * @param <T> The value type of the resolved Promise passed as input to this
- *        callback.
- * @param <R> The value type of the returned Promise from this callback.
- * 
- * @ThreadSafe
- * @author $Id: 58eef5ba732ef999d57a1feaaf1e5229356647e3 $
- */
-@ConsumerType
-public interface Success<T, R> {
-	/**
-	 * Success callback for a Promise.
-	 * 
-	 * <p>
-	 * This method is called if the Promise with which it is registered resolves
-	 * successfully.
-	 * 
-	 * <p>
-	 * In the remainder of this description we will refer to the Promise
-	 * returned by this method as the returned Promise and the Promise returned
-	 * by {@link Promise#then(Success)} when this Success callback was
-	 * registered as the chained Promise.
-	 * 
-	 * <p>
-	 * If the returned Promise is {@code null} then the chained Promise will
-	 * resolve immediately with a successful value of {@code null}. If the
-	 * returned Promise is not {@code null} then the chained Promise will be
-	 * resolved when the returned Promise is resolved.
-	 * 
-	 * @param resolved The successfully resolved {@link Promise}.
-	 * @return The Promise to use to resolve the chained Promise, or
-	 *         {@code null} if the chained Promise is to be resolved immediately
-	 *         with the value {@code null}.
-	 * @throws Exception The chained Promise will be failed with the thrown
-	 *         exception.
-	 */
-	Promise<R> call(Promise<T> resolved) throws Exception;
-}
diff --git a/scr/src/main/java/org/osgi/util/promise/package-info.java b/scr/src/main/java/org/osgi/util/promise/package-info.java
deleted file mode 100644
index 054282c..0000000
--- a/scr/src/main/java/org/osgi/util/promise/package-info.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) OSGi Alliance (2014). 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.
- */
-
-/**
- * Promise Package Version 1.0.
- * 
- * <p>
- * Bundles wishing to use this package must list the package in the
- * Import-Package header of the bundle's manifest.
- * 
- * <p>
- * Example import for consumers using the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.util.promise; version="[1.0,2.0)"}
- * <p>
- * Example import for providers implementing the API in this package:
- * <p>
- * {@code  Import-Package: org.osgi.util.promise; version="[1.0,1.1)"}
- * 
- * @author $Id: 5a3ec65d3b7e7ebdd2278d75675b8a808e6cb2bf $
- */
-
-@Version("1.0")
-package org.osgi.util.promise;
-
-import org.osgi.annotation.versioning.Version;
-
