Update OSGi APIs for R7

Change-Id: Id406562887a18b3afb377f0b8cfa38dddefd837f
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.osgi.services/.classpath b/bundles/org.eclipse.osgi.services/.classpath
index 09b9f31..7ecc55a 100644
--- a/bundles/org.eclipse.osgi.services/.classpath
+++ b/bundles/org.eclipse.osgi.services/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src">
 		<attributes>
diff --git a/bundles/org.eclipse.osgi.services/.settings/.api_filters b/bundles/org.eclipse.osgi.services/.settings/.api_filters
index 5799d57..fc3708d 100644
--- a/bundles/org.eclipse.osgi.services/.settings/.api_filters
+++ b/bundles/org.eclipse.osgi.services/.settings/.api_filters
@@ -36,4 +36,19 @@
             </message_arguments>
         </filter>
     </resource>
+    <resource path="src/org/osgi/service/metatype/MetaTypeService.java" type="org.osgi.service.metatype.MetaTypeService">
+        <filter id="403767336">
+            <message_arguments>
+                <message_argument value="org.osgi.service.metatype.MetaTypeService"/>
+                <message_argument value="METATYPE_SPECIFICATION_VERSION"/>
+            </message_arguments>
+        </filter>
+        <filter id="1209008130">
+            <message_arguments>
+                <message_argument value="1.4"/>
+                <message_argument value="3.7"/>
+                <message_argument value="METATYPE_SPECIFICATION_VERSION"/>
+            </message_arguments>
+        </filter>
+    </resource>
 </component>
diff --git a/bundles/org.eclipse.osgi.services/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.osgi.services/.settings/org.eclipse.jdt.core.prefs
index ee22cd4..0b08c18 100644
--- a/bundles/org.eclipse.osgi.services/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.osgi.services/.settings/org.eclipse.jdt.core.prefs
@@ -13,9 +13,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.compliance=1.7
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -113,6 +113,6 @@
 org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.source=1.7
 org.eclipse.jdt.core.incompatibleJDKLevel=ignore
 org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.osgi.services/META-INF/MANIFEST.MF b/bundles/org.eclipse.osgi.services/META-INF/MANIFEST.MF
index a14ee70..81d5091 100644
--- a/bundles/org.eclipse.osgi.services/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.osgi.services/META-INF/MANIFEST.MF
@@ -21,7 +21,7 @@
  org.osgi.service.http.runtime.dto;version="1.0";uses:="org.osgi.dto,org.osgi.framework.dto",
  org.osgi.service.http.whiteboard;version="1.0",
  org.osgi.service.log;version="1.4";uses:="org.osgi.framework",
- org.osgi.service.metatype;version="1.3";uses:="org.osgi.framework",
+ org.osgi.service.metatype;version="1.4";uses:="org.osgi.framework",
  org.osgi.service.provisioning;version="1.2",
  org.osgi.service.upnp;version="1.2",
  org.osgi.service.useradmin;version="1.1";uses:="org.osgi.framework",
@@ -40,7 +40,7 @@
  org.osgi.service.event;version="[1.3,1.4)",
  org.osgi.service.http;version="[1.2,1.3)",
  org.osgi.service.log;version="[1.4,1.5)",
- org.osgi.service.metatype;version="[1.3,1.4)",
+ org.osgi.service.metatype;version="[1.4,1.5)",
  org.osgi.service.provisioning;version="[1.2,1.3)",
  org.osgi.service.upnp;version="[1.2,1.3)",
  org.osgi.service.useradmin;version="[1.1,1.2)",
@@ -49,4 +49,4 @@
  org.osgi.util.promise;version="[1.0,2.0)"
 DynamicImport-Package: javax.servlet,
  javax.servlet.http
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Driver.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Driver.java
index db46dfa..d15f3a2 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Driver.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Driver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2000, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2000, 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.
@@ -71,7 +71,7 @@
 	 * @throws java.lang.Exception if this Driver service cannot examine the
 	 *         Device service
 	 */
-	public int match(ServiceReference reference) throws Exception;
+	public int match(ServiceReference<?> reference) throws Exception;
 
 	/**
 	 * Attaches this Driver service to the Device service represented by the
@@ -104,5 +104,5 @@
 	 * @throws java.lang.Exception if the driver cannot attach to the given
 	 *         device and does not know of a more suitable driver
 	 */
-	public String attach(ServiceReference reference) throws Exception;
+	public String attach(ServiceReference<?> reference) throws Exception;
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverLocator.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverLocator.java
index fdbe1a5..78eb7d0 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverLocator.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverLocator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2000, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2000, 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.
@@ -48,7 +48,7 @@
 	 *         {@code null} if this Driver Locator service does not know of any
 	 *         such drivers
 	 */
-	public String[] findDrivers(Dictionary props);
+	public String[] findDrivers(Dictionary<String, ?> props);
 
 	/**
 	 * Get an {@code InputStream} from which the driver bundle providing a
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverSelector.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverSelector.java
index 179ecc7..41d24b1 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverSelector.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/DriverSelector.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2001, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2001, 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.
@@ -50,5 +50,5 @@
 	 * @return index into the array of {@code Match} objects, or
 	 *         {@code SELECT_NONE} if no Driver service should be attached
 	 */
-	public int select(ServiceReference reference, Match[] matches);
+	public int select(ServiceReference<?> reference, Match[] matches);
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Match.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Match.java
index d162518..e1218a1 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Match.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/Match.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2001, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2001, 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.
@@ -35,7 +35,7 @@
 	 * 
 	 * @return {@code ServiceReference} object to a Driver service.
 	 */
-	public ServiceReference getDriver();
+	public ServiceReference<?> getDriver();
 
 	/**
 	 * Return the match value of this object.
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/package-info.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/package-info.java
index 92de050..78617d0 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/package-info.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2012). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -32,9 +32,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.service.device; version="[1.1,1.2)"}
  * 
- * @version 1.1
  * @author $Id$
  */
 
+@Version("1.1")
 package org.osgi.service.device;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/packageinfo b/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/packageinfo
deleted file mode 100644
index 3987f9c..0000000
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/device/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.1
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventConstants.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventConstants.java
index d002775..b934520 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventConstants.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventConstants.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2005, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2005, 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.
@@ -237,7 +237,7 @@
 	 * This constant was released with an incorrectly spelled name. It has been
 	 * replaced by {@link #EXCEPTION_CLASS}
 	 * 
-	 * @deprecated As of 1.1, replaced by EXCEPTION_CLASS
+	 * @deprecated As of 1.1. Replaced by {@link #EXCEPTION_CLASS}.
 	 */
 	public static final String	EXECPTION_CLASS				= "exception.class";
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventProperties.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventProperties.java
index 548895a..1ecc2e9 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventProperties.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/EventProperties.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 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.
@@ -109,6 +109,7 @@
 	 * 
 	 * @throws UnsupportedOperationException if called.
 	 */
+	@Override
 	public void clear() {
 		properties.clear();
 	}
@@ -119,6 +120,7 @@
 	 * @param name The property name.
 	 * @return {@code true} If the property is present, {@code false} otherwise.
 	 */
+	@Override
 	public boolean containsKey(Object name) {
 		return properties.containsKey(name);
 	}
@@ -129,6 +131,7 @@
 	 * @param value The property value.
 	 * @return {@code true} If the value is present, {@code false} otherwise.
 	 */
+	@Override
 	public boolean containsValue(Object value) {
 		return properties.containsValue(value);
 	}
@@ -138,6 +141,7 @@
 	 * 
 	 * @return A set containing the property name/value pairs.
 	 */
+	@Override
 	public Set<java.util.Map.Entry<String, Object>> entrySet() {
 		return properties.entrySet();
 	}
@@ -148,6 +152,7 @@
 	 * @param name The name of the specified property.
 	 * @return The value of the specified property.
 	 */
+	@Override
 	public Object get(Object name) {
 		return properties.get(name);
 	}
@@ -158,6 +163,7 @@
 	 * @return {@code true} If this properties is empty, {@code false}
 	 *         otherwise.
 	 */
+	@Override
 	public boolean isEmpty() {
 		return properties.isEmpty();
 	}
@@ -167,6 +173,7 @@
 	 * 
 	 * @return The names of the properties.
 	 */
+	@Override
 	public Set<String> keySet() {
 		return properties.keySet();
 	}
@@ -176,6 +183,7 @@
 	 * 
 	 * @throws UnsupportedOperationException if called.
 	 */
+	@Override
 	public Object put(String key, Object value) {
 		return properties.put(key, value);
 	}
@@ -185,6 +193,7 @@
 	 * 
 	 * @throws UnsupportedOperationException if called.
 	 */
+	@Override
 	public void putAll(Map<? extends String, ? extends Object> map) {
 		properties.putAll(map);
 	}
@@ -194,6 +203,7 @@
 	 * 
 	 * @throws UnsupportedOperationException if called.
 	 */
+	@Override
 	public Object remove(Object key) {
 		return properties.remove(key);
 	}
@@ -203,6 +213,7 @@
 	 * 
 	 * @return The number of properties.
 	 */
+	@Override
 	public int size() {
 		return properties.size();
 	}
@@ -212,6 +223,7 @@
 	 * 
 	 * @return The values of the properties.
 	 */
+	@Override
 	public Collection<Object> values() {
 		return properties.values();
 	}
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/TopicPermission.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/TopicPermission.java
index dbe0829..a315cdc 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/TopicPermission.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/TopicPermission.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2005, 2015). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2005, 2016). 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.
@@ -289,7 +289,7 @@
 	public String getActions() {
 		String result = actions;
 		if (result == null) {
-			StringBuffer sb = new StringBuffer();
+			StringBuilder sb = new StringBuilder();
 			boolean comma = false;
 			int mask = getActionsMask();
 			if ((mask & ACTION_PUBLISH) == ACTION_PUBLISH) {
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/packageinfo b/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/packageinfo
deleted file mode 100644
index 6435862..0000000
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/event/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.3.1
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/log/LogEntry.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/log/LogEntry.java
index 6b3ee59..9dca758 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/log/LogEntry.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/log/LogEntry.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2000, 2016). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2000, 2017). 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.
@@ -68,11 +68,11 @@
 	int getLevel();
 
 	/**
-	 * Returns the human readable message associated with this {@code LogEntry}
+	 * Returns the formatted message associated with this {@code LogEntry}
 	 * object.
 	 * 
-	 * @return {@code String} containing the message associated with this
-	 *         {@code LogEntry} object.
+	 * @return {@code String} containing the formatted message associated with
+	 *         this {@code LogEntry} object.
 	 */
 	String getMessage();
 
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/MetaTypeService.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/MetaTypeService.java
index 3a507c1..c5c96a3 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/MetaTypeService.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/MetaTypeService.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2005, 2015). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2005, 2017). 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.
@@ -55,17 +55,27 @@
 
 	/**
 	 * Capability name for meta type document processors.
-	 * 
 	 * <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.metatype)(version&gt;=1.3)(!(version&gt;=2.0)))"
+	 *  filter:="(&amp;(osgi.extender=osgi.metatype)(version&gt;=1.4)(!(version&gt;=2.0)))"
 	 * </pre>
 	 * 
 	 * @since 1.3
 	 */
 	public static final String	METATYPE_CAPABILITY_NAME	= "osgi.metatype";
+
+	/**
+	 * Compile time constant for the Specification Version of MetaType Service.
+	 * <p>
+	 * Used in {@code Version} and {@code Requirement} annotations. The value of
+	 * this compile time constant will change when the specification version of
+	 * MetaType Service is updated.
+	 * 
+	 * @since 1.4
+	 */
+	public static final String	METATYPE_SPECIFICATION_VERSION	= "1.4.0";
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/package-info.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/package-info.java
index ca1a060..c55119e 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/package-info.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2017). 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.
@@ -15,28 +15,27 @@
  */
 
 /**
- * Metatype Package Version 1.3.
- * 
+ * Metatype Package Version 1.4.
  * <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.metatype; version="[1.3,2.0)"}
+ * {@code  Import-Package: org.osgi.service.metatype; version="[1.4,2.0)"}
  * <p>
  * Example import for providers implementing the API in this package:
  * <p>
- * {@code  Import-Package: org.osgi.service.metatype; version="[1.3,1.4)"}
+ * {@code  Import-Package: org.osgi.service.metatype; version="[1.4,1.5)"}
  * 
  * @author $Id$
  */
 
-@Version("1.3")
+@Version(METATYPE_SPECIFICATION_VERSION)
 package org.osgi.service.metatype;
 
-import org.osgi.annotation.versioning.Version;
+import static org.osgi.service.metatype.MetaTypeService.METATYPE_SPECIFICATION_VERSION;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/packageinfo b/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/packageinfo
deleted file mode 100644
index 0117a56..0000000
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/metatype/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.3
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/ProvisioningService.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/ProvisioningService.java
index 4751061..7fb7e78 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/ProvisioningService.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/ProvisioningService.java
@@ -166,7 +166,7 @@
 	 * 
 	 * @return A reference to the Provisioning Dictionary.
 	 */
-	public Dictionary getInformation();
+	public Dictionary<String, Object> getInformation();
 
 	/**
 	 * Replaces the Provisioning Information dictionary with the key/value pairs
@@ -178,7 +178,7 @@
 	 *        keys are values that are of an invalid type will be silently
 	 *        ignored.
 	 */
-	public void setInformation(Dictionary info);
+	public void setInformation(Dictionary<String, ?> info);
 
 	/**
 	 * Adds the key/value pairs contained in {@code info} to the Provisioning
@@ -189,7 +189,7 @@
 	 *        the Provisioning Information dictionary. Any keys are values that
 	 *        are of an invalid type will be silently ignored.
 	 */
-	public void addInformation(Dictionary info);
+	public void addInformation(Dictionary<String, ?> info);
 
 	/**
 	 * Processes the {@code ZipInputStream} and extracts information to add to
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/package-info.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/package-info.java
index d47e07a..8d2cafd 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/package-info.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2012). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -32,9 +32,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.service.provisioning; version="[1.2,1.3)"}
  * 
- * @version 1.2
  * @author $Id$
  */
 
+@Version("1.2")
 package org.osgi.service.provisioning;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/packageinfo b/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/packageinfo
deleted file mode 100644
index ef7df68..0000000
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/provisioning/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.2
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPAction.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPAction.java
index f1ba100..1dcd115 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPAction.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPAction.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -138,5 +138,5 @@
 	 * 
 	 * @see UPnPStateVariable
 	 */
-	Dictionary invoke(Dictionary args) throws Exception;
+	Dictionary<String, Object> invoke(Dictionary<String, ?> args) throws Exception;
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPDevice.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPDevice.java
index a09c1c2..fe7d6d7 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPDevice.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPDevice.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -287,5 +287,5 @@
 	 *         Strings
 	 * 
 	 */
-	Dictionary getDescriptions(String locale);
+	Dictionary<String, String> getDescriptions(String locale);
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPEventListener.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPEventListener.java
index 80582d9..fab5adc 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPEventListener.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPEventListener.java
@@ -81,5 +81,5 @@
 	 * 
 	 * 
 	 */
-	void notifyUPnPEvent(String deviceId, String serviceId, Dictionary events);
+	void notifyUPnPEvent(String deviceId, String serviceId, Dictionary<String, ?> events);
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPException.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPException.java
index ffd3b84..c377037 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPException.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2005, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2005, 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.
@@ -107,7 +107,7 @@
 	 * 
 	 * @return The UPnPErrorCode defined by a UPnP Forum working committee or
 	 *         specified by a UPnP vendor.
-	 * @deprecated As of version 1.2, replaced by {@link #getUPnPErrorCode()}
+	 * @deprecated As of 1.2. Replaced by {@link #getUPnPErrorCode()}.
 	 */
 	public int getUPnPError_Code() {
 		return getUPnPErrorCode();
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPStateVariable.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPStateVariable.java
index 1ebafb5..f152422 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPStateVariable.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/UPnPStateVariable.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -285,7 +285,7 @@
 	 * 
 	 * @return A class object corresponding to the Java type of this argument.
 	 */
-	Class getJavaDataType();
+	Class<?> getJavaDataType();
 
 	/**
 	 * Returns the UPnP type of this state variable. Valid types are defined as
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/package-info.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/package-info.java
index 1416516..15372d2 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/package-info.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2012). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -32,9 +32,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.service.upnp; version="[1.2,1.3)"}
  * 
- * @version 1.2
  * @author $Id$
  */
 
+@Version("1.2")
 package org.osgi.service.upnp;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/packageinfo b/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/packageinfo
deleted file mode 100644
index ef7df68..0000000
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/upnp/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.2
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/Role.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/Role.java
index c366d5a..aff70c8 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/Role.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/Role.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2001, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2001, 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.
@@ -113,5 +113,5 @@
 	 * @return {@code Dictionary} containing the properties of this {@code Role}
 	 *         object.
 	 */
-	public Dictionary getProperties();
+	public Dictionary<String, Object> getProperties();
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/User.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/User.java
index 0520ec2..4a13bb5 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/User.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/User.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2001, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2001, 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.
@@ -68,7 +68,7 @@
 	 * @return {@code Dictionary} object containing the credentials of this
 	 *         {@code User} object.
 	 */
-	public Dictionary getCredentials();
+	public Dictionary<String, Object> getCredentials();
 
 	/**
 	 * Checks to see if this {@code User} object has a credential with the
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminEvent.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminEvent.java
index 606618c..3750d20 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminEvent.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminEvent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2001, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2001, 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.
@@ -37,7 +37,7 @@
  * @author $Id$
  */
 public class UserAdminEvent {
-	private ServiceReference	ref;
+	private ServiceReference<UserAdmin>	ref;
 	private int					type;
 	private Role				role;
 	/**
@@ -71,7 +71,7 @@
 	 * @param type The event type.
 	 * @param role The {@code Role} object on which this event occurred.
 	 */
-	public UserAdminEvent(ServiceReference ref, int type, Role role) {
+	public UserAdminEvent(ServiceReference<UserAdmin> ref, int type, Role role) {
 		this.ref = ref;
 		this.type = type;
 		this.role = role;
@@ -83,7 +83,7 @@
 	 * 
 	 * @return The User Admin service's {@code ServiceReference} object.
 	 */
-	public ServiceReference getServiceReference() {
+	public ServiceReference<UserAdmin> getServiceReference() {
 		return ref;
 	}
 
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminPermission.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminPermission.java
index 536a2ac..b950fbd 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminPermission.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/UserAdminPermission.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2001, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2001, 2016). 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.
@@ -20,8 +20,11 @@
 import java.security.BasicPermission;
 import java.security.Permission;
 import java.security.PermissionCollection;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.List;
 
 /**
  * Permission to configure and access the {@link Role} objects managed by a User
@@ -323,6 +326,7 @@
 	 * @return {@code true} if the specified permission is implied by this
 	 *         object; {@code false} otherwise.
 	 */
+	@Override
 	public boolean implies(Permission p) {
 		if (p instanceof UserAdminPermission) {
 			UserAdminPermission requested = (UserAdminPermission) p;
@@ -345,10 +349,11 @@
 	 * 
 	 * @return the canonical string representation of the actions.
 	 */
+	@Override
 	public String getActions() {
 		String result = actions;
 		if (result == null) {
-			StringBuffer sb = new StringBuffer();
+			StringBuilder sb = new StringBuilder();
 			boolean comma = false;
 			int mask = getActionsMask();
 			if ((mask & ACTION_CHANGE_CREDENTIAL) == ACTION_CHANGE_CREDENTIAL) {
@@ -378,6 +383,7 @@
 	 * @return a new {@code PermissionCollection} object suitable for storing
 	 *         {@code UserAdminPermission} objects.
 	 */
+	@Override
 	public PermissionCollection newPermissionCollection() {
 		return new UserAdminPermissionCollection();
 	}
@@ -393,6 +399,7 @@
 	 *         object, and has the same name and actions as this
 	 *         {@code UserAdminPermission} object.
 	 */
+	@Override
 	public boolean equals(Object obj) {
 		if (obj == this) {
 			return true;
@@ -411,6 +418,7 @@
 	 * 
 	 * @return A hash code value for this object.
 	 */
+	@Override
 	public int hashCode() {
 		int h = 31 * 17 + getName().hashCode();
 		h = 31 * h + getActions().hashCode();
@@ -446,8 +454,9 @@
 	 *         {@code UserAdminPermission} object.
 	 * @see "org.osgi.service.permissionadmin.PermissionInfo.getEncoded()"
 	 */
+	@Override
 	public String toString() {
-		StringBuffer sb = new StringBuffer();
+		StringBuilder sb = new StringBuilder();
 		sb.append('(');
 		sb.append(getClass().getName());
 		sb.append(" \"");
@@ -475,7 +484,7 @@
 	 * @serial
 	 * @GuardedBy this
 	 */
-	private final Hashtable	permissions;
+	private final Hashtable<String, UserAdminPermission>	permissions;
 	/**
 	 * Boolean saying if "*" is in the collection.
 	 * 
@@ -488,7 +497,7 @@
 	 * Creates an empty {@code UserAdminPermissionCollection} object.
 	 */
 	public UserAdminPermissionCollection() {
-		permissions = new Hashtable();
+		permissions = new Hashtable<>();
 		all_allowed = false;
 	}
 
@@ -503,6 +512,7 @@
 	 * @throws SecurityException If this {@code UserAdminPermissionCollection}
 	 *         object has been marked readonly
 	 */
+	@Override
 	public void add(Permission permission) {
 		if (!(permission instanceof UserAdminPermission))
 			throw new IllegalArgumentException("Invalid permission: " + permission);
@@ -512,7 +522,7 @@
 		final UserAdminPermission uap = (UserAdminPermission) permission;
 		final String name = uap.getName();
 		synchronized (this) {
-			final UserAdminPermission existing = (UserAdminPermission) permissions.get(name);
+			final UserAdminPermission existing = permissions.get(name);
 			if (existing != null) {
 				int oldMask = existing.getActionsMask();
 				int newMask = uap.getActionsMask();
@@ -539,6 +549,7 @@
 	 * @return true if the given permission is implied by this
 	 *         {@code PermissionCollection}, false otherwise.
 	 */
+	@Override
 	public boolean implies(Permission permission) {
 		if (!(permission instanceof UserAdminPermission)) {
 			return false;
@@ -552,7 +563,7 @@
 			// Short circuit if the "*" Permission was added.
 			// desired can only be ACTION_NONE when name is "admin".
 			if (all_allowed && (desired != UserAdminPermission.ACTION_NONE)) {
-				x = (UserAdminPermission) permissions.get("*");
+				x = permissions.get("*");
 				if (x != null) {
 					effective |= x.getActionsMask();
 					if ((effective & desired) == desired) {
@@ -564,7 +575,7 @@
 			// Check for full match first. Then work our way up the
 			// name looking for matches on a.b.*
 
-			x = (UserAdminPermission) permissions.get(name);
+			x = permissions.get(name);
 		}
 		if (x != null) {
 			// we have a direct hit!
@@ -579,7 +590,7 @@
 		while ((last = name.lastIndexOf(".", offset)) != -1) {
 			name = name.substring(0, last + 1) + "*";
 			synchronized (this) {
-				x = (UserAdminPermission) permissions.get(name);
+				x = permissions.get(name);
 			}
 			if (x != null) {
 				effective |= x.getActionsMask();
@@ -600,7 +611,9 @@
 	 * 
 	 * @return an enumeration of all the {@code UserAdminPermission} objects.
 	 */
-	public Enumeration elements() {
-		return permissions.elements();
+	@Override
+	public Enumeration<Permission> elements() {
+		List<Permission> all = new ArrayList<Permission>(permissions.values());
+		return Collections.enumeration(all);
 	}
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/package-info.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/package-info.java
index b79edb1..408a517 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/package-info.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2012). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -32,9 +32,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.service.useradmin; version="[1.1,1.2)"}
  * 
- * @version 1.1
  * @author $Id$
  */
 
+@Version("1.1")
 package org.osgi.service.useradmin;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/packageinfo b/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/packageinfo
deleted file mode 100644
index 3987f9c..0000000
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/useradmin/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.1
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/BasicEnvelope.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/BasicEnvelope.java
index e7f7111..2c60743 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/BasicEnvelope.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/BasicEnvelope.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -45,6 +45,7 @@
 	/**
 	 * @see org.osgi.service.wireadmin.Envelope#getValue()
 	 */
+	@Override
 	public Object getValue() {
 		return value;
 	}
@@ -52,6 +53,7 @@
 	/**
 	 * @see org.osgi.service.wireadmin.Envelope#getIdentification()
 	 */
+	@Override
 	public Object getIdentification() {
 		return identification;
 	}
@@ -59,6 +61,7 @@
 	/**
 	 * @see org.osgi.service.wireadmin.Envelope#getScope()
 	 */
+	@Override
 	public String getScope() {
 		return scope;
 	}
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/Wire.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/Wire.java
index de75c27..f1c1293 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/Wire.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/Wire.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -118,7 +118,7 @@
 	 *         {@link WireConstants#WIREADMIN_CONSUMER_FLAVORS} property or the
 	 *         value of the property is not of type {@code Class[]}.
 	 */
-	public Class[] getFlavors();
+	public Class<?>[] getFlavors();
 
 	/**
 	 * Update the value.
@@ -216,7 +216,7 @@
 	 * @return The properties for this {@code Wire} object. The returned
 	 *         {@code Dictionary} must be read only.
 	 */
-	public Dictionary getProperties();
+	public Dictionary<String, Object> getProperties();
 
 	/**
 	 * Return the calculated scope of this {@code Wire} object.
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdmin.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdmin.java
index 783de09..47b38d0 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdmin.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdmin.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -90,7 +90,7 @@
 	 * @throws java.lang.IllegalArgumentException If {@code properties} contains
 	 *         invalid wire types or case variants of the same key name.
 	 */
-	public Wire createWire(String producerPID, String consumerPID, Dictionary properties);
+	public Wire createWire(String producerPID, String consumerPID, Dictionary<String, ?> properties);
 
 	/**
 	 * Delete a {@code Wire} object.
@@ -132,7 +132,7 @@
 	 * @throws java.lang.IllegalArgumentException If {@code properties} contains
 	 *         invalid wire types or case variants of the same key name.
 	 */
-	public void updateWire(Wire wire, Dictionary properties);
+	public void updateWire(Wire wire, Dictionary<String, ?> properties);
 
 	/**
 	 * Return the {@code Wire} objects that match the given {@code filter}.
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdminEvent.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdminEvent.java
index 665e72c..9b40718 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdminEvent.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WireAdminEvent.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -60,7 +60,7 @@
 	/**
 	 * The WireAdmin service which created this event.
 	 */
-	private final ServiceReference	reference;
+	private final ServiceReference<WireAdmin>	reference;
 	/**
 	 * The {@code Wire} object associated with this event.
 	 */
@@ -205,7 +205,7 @@
 	 * @param exception An exception associated with this event. This may be
 	 *        {@code null} if no exception is associated with this event.
 	 */
-	public WireAdminEvent(ServiceReference reference, int type, Wire wire, Throwable exception) {
+	public WireAdminEvent(ServiceReference<WireAdmin> reference, int type, Wire wire, Throwable exception) {
 		this.reference = reference;
 		this.wire = wire;
 		this.type = type;
@@ -219,7 +219,7 @@
 	 * @return The {@code ServiceReference} object for the Wire Admin service
 	 *         that created this event.
 	 */
-	public ServiceReference getServiceReference() {
+	public ServiceReference<WireAdmin> getServiceReference() {
 		return reference;
 	}
 
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WirePermission.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WirePermission.java
index ecf1b5f..53e2f60 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WirePermission.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/WirePermission.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2015). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 2016). 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.
@@ -20,8 +20,11 @@
 import java.security.BasicPermission;
 import java.security.Permission;
 import java.security.PermissionCollection;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.List;
 
 /**
  * Permission for the scope of a {@code Wire} object. When a {@code Envelope}
@@ -190,6 +193,7 @@
 	 * @return {@code true} if the specified permission is implied by this
 	 *         object; {@code false} otherwise.
 	 */
+	@Override
 	public boolean implies(Permission p) {
 		if (p instanceof WirePermission) {
 			WirePermission requested = (WirePermission) p;
@@ -206,10 +210,11 @@
 	 * 
 	 * @return The canonical string representation of the actions.
 	 */
+	@Override
 	public String getActions() {
 		String result = actions;
 		if (result == null) {
-			StringBuffer sb = new StringBuffer();
+			StringBuilder sb = new StringBuilder();
 			boolean comma = false;
 			int mask = getActionsMask();
 			if ((mask & ACTION_PRODUCE) == ACTION_PRODUCE) {
@@ -233,6 +238,7 @@
 	 * @return A new {@code PermissionCollection} object suitable for storing
 	 *         {@code WirePermission} objects.
 	 */
+	@Override
 	public PermissionCollection newPermissionCollection() {
 		return new WirePermissionCollection();
 	}
@@ -248,6 +254,7 @@
 	 *         name and actions as this {@code WirePermission} object;
 	 *         {@code false} otherwise.
 	 */
+	@Override
 	public boolean equals(Object obj) {
 		if (obj == this) {
 			return true;
@@ -264,6 +271,7 @@
 	 * 
 	 * @return Hash code value for this object.
 	 */
+	@Override
 	public int hashCode() {
 		int h = 31 * 17 + getName().hashCode();
 		h = 31 * h + getActions().hashCode();
@@ -278,8 +286,9 @@
 	 * 
 	 * @return information about this {@code Permission} object.
 	 */
+	@Override
 	public String toString() {
-		StringBuffer sb = new StringBuffer();
+		StringBuilder sb = new StringBuilder();
 		sb.append('(');
 		sb.append(getClass().getName());
 		sb.append(" \"");
@@ -330,7 +339,7 @@
 	 * @GuardedBy this
 	 * @serial
 	 */
-	private final Hashtable	permissions;
+																		private final Hashtable<String, WirePermission>permissions;
 	/**
 	 * Boolean saying if "*" is in the collection.
 	 * 
@@ -344,7 +353,7 @@
 	 * 
 	 */
 	public WirePermissionCollection() {
-		permissions = new Hashtable();
+		permissions = new Hashtable<>();
 		all_allowed = false;
 	}
 
@@ -359,6 +368,7 @@
 	 * @throws SecurityException If this PermissionCollection has been marked
 	 *         read-only.
 	 */
+	@Override
 	public void add(Permission permission) {
 		if (!(permission instanceof WirePermission)) {
 			throw new IllegalArgumentException("invalid permission: " + permission);
@@ -369,7 +379,7 @@
 		WirePermission wp = (WirePermission) permission;
 		String name = wp.getName();
 		synchronized (this) {
-			WirePermission existing = (WirePermission) permissions.get(name);
+			WirePermission existing = permissions.get(name);
 			if (existing != null) {
 				int oldMask = existing.getActionsMask();
 				int newMask = wp.getActionsMask();
@@ -396,6 +406,7 @@
 	 * @return {@code true} if {@code permission} is a proper subset of a
 	 *         permission in the set; {@code false} otherwise.
 	 */
+	@Override
 	public boolean implies(Permission permission) {
 		if (!(permission instanceof WirePermission)) {
 			return false;
@@ -408,7 +419,7 @@
 		synchronized (this) {
 			// short circuit if the "*" Permission was added
 			if (all_allowed) {
-				x = (WirePermission) permissions.get("*");
+				x = permissions.get("*");
 				if (x != null) {
 					effective |= x.getActionsMask();
 					if ((effective & desired) == desired)
@@ -418,7 +429,7 @@
 			// strategy:
 			// Check for full match first. Then work our way up the
 			// name looking for matches on a.b.*
-			x = (WirePermission) permissions.get(name);
+			x = permissions.get(name);
 		}
 		if (x != null) {
 			// we have a direct hit!
@@ -433,7 +444,7 @@
 		while ((last = name.lastIndexOf(".", offset)) != -1) {
 			name = name.substring(0, last + 1) + "*";
 			synchronized (this) {
-				x = (WirePermission) permissions.get(name);
+				x = permissions.get(name);
 			}
 			if (x != null) {
 				effective |= x.getActionsMask();
@@ -453,7 +464,9 @@
 	 * 
 	 * @return Enumeration of all the Permission objects.
 	 */
-	public Enumeration elements() {
-		return permissions.elements();
+	@Override
+	public Enumeration<Permission> elements() {
+		List<Permission> all = new ArrayList<Permission>(permissions.values());
+		return Collections.enumeration(all);
 	}
 }
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/package-info.java b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/package-info.java
index b5af96b..6058a3d 100644
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/package-info.java
+++ b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -32,9 +32,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.service.wireadmin; version="[1.0,1.1)"}
  * 
- * @version 1.0.1
  * @author $Id$
  */
 
+@Version("1.0.1")
 package org.osgi.service.wireadmin;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/packageinfo b/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/packageinfo
deleted file mode 100644
index b3d1f97..0000000
--- a/bundles/org.eclipse.osgi.services/src/org/osgi/service/wireadmin/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0.1
diff --git a/bundles/org.eclipse.osgi.util/META-INF/MANIFEST.MF b/bundles/org.eclipse.osgi.util/META-INF/MANIFEST.MF
index f58db0c..fd48809 100644
--- a/bundles/org.eclipse.osgi.util/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.osgi.util/META-INF/MANIFEST.MF
@@ -9,7 +9,7 @@
 Bundle-DocUrl: http://www.eclipse.org
 Bundle-ContactAddress: www.eclipse.org
 Export-Package: org.osgi.util.function;version="1.1",
- org.osgi.util.measurement;version="1.0.1",
+ org.osgi.util.measurement;version="1.0.2",
  org.osgi.util.position;version="1.0.1";uses:="org.osgi.util.measurement",
  org.osgi.util.promise;version="1.1";uses:="org.osgi.util.function",
  org.osgi.util.xml;version="1.0.1";uses:="org.osgi.framework,javax.xml.parsers"
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Measurement.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Measurement.java
index 5d6be0f..4a8cf66 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Measurement.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Measurement.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 2016). 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.
@@ -47,7 +47,7 @@
  * @Immutable
  * @author $Id$
  */
-public class Measurement implements Comparable {
+public class Measurement implements Comparable<Object> {
 	private final double		value;
 	private final double		error;
 	private final long			time;
@@ -362,10 +362,11 @@
 	 * @return a {@code String} object representing this {@code Measurement}
 	 *         object.
 	 */
+	@Override
 	public String toString() {
 		String result = name;
 		if (result == null) {
-			StringBuffer sb = new StringBuffer();
+			StringBuilder sb = new StringBuilder();
 			sb.append(value);
 			if (error != 0.0d) {
 				sb.append(" +/- ");
@@ -408,6 +409,7 @@
 	 *         {@code Measurement} object is not equal to the {@code Unit}
 	 *         object of this object.
 	 */
+	@Override
 	public int compareTo(Object obj) {
 		if (this == obj) {
 			return 0;
@@ -437,6 +439,7 @@
 	 * 
 	 * @return A hash code value for this object.
 	 */
+	@Override
 	public int hashCode() {
 		int h = hashCode;
 		if (h == 0) {
@@ -463,6 +466,7 @@
 	 * @return {@code true} if this object is equal to the specified object;
 	 *         {@code false} otherwise.
 	 */
+	@Override
 	public boolean equals(Object obj) {
 		if (this == obj) {
 			return true;
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/State.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/State.java
index 415613f..e9fcca5 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/State.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/State.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 2016). 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.
@@ -91,8 +91,9 @@
 	 * 
 	 * @return a {@code String} object representing this object.
 	 */
+	@Override
 	public String toString() {
-		StringBuffer sb = new StringBuffer();
+		StringBuilder sb = new StringBuilder();
 		sb.append(value);
 		if (name != null) {
 			sb.append(" \"");
@@ -107,6 +108,7 @@
 	 * 
 	 * @return A hash code value for this object.
 	 */
+	@Override
 	public int hashCode() {
 		int hash = 31 * 17 + value;
 		if (name != null) {
@@ -123,6 +125,7 @@
 	 * @return {@code true} if this object is equal to the specified object;
 	 *         {@code false} otherwise.
 	 */
+	@Override
 	public boolean equals(Object obj) {
 		if (this == obj) {
 			return true;
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Unit.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Unit.java
index e97563d..64d749c 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Unit.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/Unit.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 2016). 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.
@@ -16,7 +16,8 @@
 
 package org.osgi.util.measurement;
 
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * A unit system for measurements.
@@ -250,8 +251,8 @@
 	 */
 	private final static Unit[]	allUnits	= new Unit[] {m, s, kg, K, A, mol, cd, rad, m_s, m_s2, m2, m3, Hz, N, Pa, J, W, C, V, F, Ohm, S, Wb, T, lx, Gy, kat, unity};
 
-	/* @GuardedBy("this") */
-	private static Hashtable	base;
+	/* @GuardedBy("Unit.class") */
+	private static Map<Unit, Unit>	base;
 	private final String		name;
 	private final long			type;
 
@@ -289,6 +290,7 @@
 	 * @return true if the specified {@code Unit} object is equal to this
 	 *         {@code Unit} object.
 	 */
+	@Override
 	public boolean equals(Object obj) {
 		if (this == obj) {
 			return true;
@@ -304,6 +306,7 @@
 	 * 
 	 * @return This object's hash code.
 	 */
+	@Override
 	public int hashCode() {
 		return 31 * 17 + (int) (type ^ (type >>> 32));
 	}
@@ -399,13 +402,13 @@
 	static synchronized Unit find(long type) {
 		if (base == null) {
 			int size = allUnits.length;
-			base = new Hashtable(size << 1);
+			base = new HashMap<>(size << 1);
 			for (int i = 0; i < size; i++) {
 				base.put(allUnits[i], allUnits[i]);
 			}
 		}
 		Unit unit = new Unit(null, type);
-		Unit out = (Unit) base.get(unit);
+		Unit out = base.get(unit);
 		if (out == null) {
 			base.put(unit, unit);
 			out = unit;
@@ -418,6 +421,7 @@
 	 * 
 	 * @return A {@code String} object representing the {@code Unit}
 	 */
+	@Override
 	public String toString() {
 		return name;
 	}
@@ -431,8 +435,8 @@
 		int _mol = (int) (((type >> mol_SHIFT) & MASK) - ZERO);
 		int _cd = (int) (((type >> cd_SHIFT) & MASK) - ZERO);
 		int _rad = (int) (((type >> rad_SHIFT) & MASK) - ZERO);
-		StringBuffer numerator = new StringBuffer();
-		StringBuffer denominator = new StringBuffer();
+		StringBuilder numerator = new StringBuilder();
+		StringBuilder denominator = new StringBuilder();
 		addSIname(_m, "m", numerator, denominator);
 		addSIname(_s, "s", numerator, denominator);
 		addSIname(_kg, "kg", numerator, denominator);
@@ -451,9 +455,10 @@
 		return numerator.toString();
 	}
 
-	private static void addSIname(int si, String name, StringBuffer numerator, StringBuffer denominator) {
+	private static void addSIname(int si, String name, StringBuilder numerator,
+			StringBuilder denominator) {
 		if (si != 0) {
-			StringBuffer sb = (si > 0) ? numerator : denominator;
+			StringBuilder sb = (si > 0) ? numerator : denominator;
 			if (sb.length() > 0) {
 				sb.append("*");
 			}
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/package-info.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/package-info.java
index 7603bac..bac289a 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/package-info.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -26,9 +26,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.util.measurement; version="[1.0,2.0)"}
  * 
- * @version 1.0.1
  * @author $Id$
  */
 
+@Version("1.0.2")
 package org.osgi.util.measurement;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/packageinfo b/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/packageinfo
deleted file mode 100644
index c266447..0000000
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/measurement/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0.1
\ No newline at end of file
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/position/package-info.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/position/package-info.java
index 63af1b6..b67b806 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/position/package-info.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/position/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -26,9 +26,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.util.position; version="[1.0,2.0)"}
  * 
- * @version 1.0.1
  * @author $Id$
  */
 
+@Version("1.0.1")
 package org.osgi.util.position;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/position/packageinfo b/bundles/org.eclipse.osgi.util/src/org/osgi/util/position/packageinfo
deleted file mode 100644
index c266447..0000000
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/position/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0.1
\ No newline at end of file
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Deferred.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Deferred.java
index 004925f..25c7442 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Deferred.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Deferred.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2014, 2016). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2014, 2017). 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.
@@ -16,7 +16,10 @@
 
 package org.osgi.util.promise;
 
-import static org.osgi.util.promise.PromiseImpl.requireNonNull;
+import static java.util.Objects.requireNonNull;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ScheduledExecutorService;
 
 /**
  * A Deferred Promise resolution.
@@ -42,14 +45,49 @@
 	private final PromiseImpl<T>	promise;
 
 	/**
-	 * Create a new Deferred with an associated Promise.
+	 * Create a new Deferred.
+	 * <p>
+	 * The default callback executor and default scheduled executor will be
+	 * used.
 	 */
 	public Deferred() {
-		promise = new PromiseImpl<>();
+		this(null, null);
+	}
+
+	/**
+	 * Create a new Deferred with the specified callback executor.
+	 * <p>
+	 * The default scheduled executor will be used.
+	 * 
+	 * @param callbackExecutor The executor to use for callbacks. {@code null}
+	 *            can be specified for the default callback executor.
+	 * @since 1.1
+	 */
+	public Deferred(Executor callbackExecutor) {
+		this(callbackExecutor, null);
+	}
+
+	/**
+	 * Create a new Deferred with the specified callback and scheduled
+	 * executors.
+	 * 
+	 * @param callbackExecutor The executor to use for callbacks. {@code null}
+	 *            can be specified for the default callback executor.
+	 * @param scheduledExecutor The scheduled executor for use for scheduled
+	 *            operations. {@code null} can be specified for the default
+	 *            scheduled executor.
+	 * @since 1.1
+	 */
+	public Deferred(Executor callbackExecutor,
+			ScheduledExecutorService scheduledExecutor) {
+		promise = new PromiseImpl<>(callbackExecutor, scheduledExecutor);
 	}
 
 	/**
 	 * Returns the Promise associated with this Deferred.
+	 * <p>
+	 * All Promise objects created by the associated Promise will use the
+	 * executors of the associated Promise.
 	 * 
 	 * @return The Promise associated with this Deferred.
 	 */
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/PromiseImpl.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/PromiseImpl.java
index 2afb377..1a65fc8 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/PromiseImpl.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/PromiseImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2014, 2016). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2014, 2017). 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.
@@ -16,6 +16,8 @@
 
 package org.osgi.util.promise;
 
+import static java.util.Objects.requireNonNull;
+
 import java.lang.reflect.InvocationTargetException;
 import java.util.NoSuchElementException;
 import java.util.concurrent.BlockingQueue;
@@ -23,11 +25,13 @@
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.RunnableScheduledFuture;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.SynchronousQueue;
@@ -42,18 +46,26 @@
 
 /**
  * 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$
  */
 final class PromiseImpl<T> implements Promise<T> {
 	/**
+	 * The executor to use for callbacks. If {@code null}, the default callback
+	 * executor is used.
+	 */
+	private final Executor							callbackExecutor;
+	/**
+	 * The executor to use for scheduled operations. If {@code null}, the
+	 * default scheduled executor is used.
+	 */
+	private final ScheduledExecutorService			scheduledExecutor;
+	/**
 	 * A ConcurrentLinkedQueue to hold the callbacks for this Promise, so no
 	 * additional synchronization is required to write to or read from the
 	 * queue.
@@ -91,8 +103,17 @@
 
 	/**
 	 * Initialize this Promise.
+	 * 
+	 * @param callbackExecutor The executor to use for callbacks. {@code null}
+	 *            can be specified for the default callback executor.
+	 * @param scheduledExecutor The scheduled executor for use for scheduled
+	 *            operations. {@code null} can be specified for the default
+	 *            scheduled executor.
 	 */
-	PromiseImpl() {
+	PromiseImpl(Executor callbackExecutor,
+			ScheduledExecutorService scheduledExecutor) {
+		this.callbackExecutor = callbackExecutor;
+		this.scheduledExecutor = scheduledExecutor;
 		callbacks = new ConcurrentLinkedQueue<>();
 		resolved = new CountDownLatch(1);
 	}
@@ -102,13 +123,21 @@
 	 * 
 	 * @param v The value of this resolved Promise.
 	 * @param f The failure of this resolved Promise.
+	 * @param callbackExecutor The executor to use for callbacks. {@code null}
+	 *            can be specified for the default callback executor.
+	 * @param scheduledExecutor The scheduled executor for use for scheduled
+	 *            operations. {@code null} can be specified for the default
+	 *            scheduled executor.
 	 */
-	PromiseImpl(T v, Throwable f) {
+	PromiseImpl(T v, Throwable f, Executor callbackExecutor,
+			ScheduledExecutorService scheduledExecutor) {
 		if (f == null) {
 			value = v;
 		} else {
 			fail = f;
 		}
+		this.callbackExecutor = callbackExecutor;
+		this.scheduledExecutor = scheduledExecutor;
 		callbacks = new ConcurrentLinkedQueue<>();
 		resolved = new CountDownLatch(0);
 	}
@@ -164,24 +193,6 @@
 	}
 
 	/**
-	 * 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 executing them, so the order in which callbacks are
-		 * executed cannot be specified.
-		 */
-		for (Runnable callback = callbacks.poll(); callback != null; callback = callbacks.poll()) {
-			Callbacks.execute(callback);
-		}
-	}
-
-	/**
 	 * {@inheritDoc}
 	 */
 	@Override
@@ -245,24 +256,83 @@
 	}
 
 	/**
-	 * {@inheritDoc}
+	 * Call any registered callbacks if this Promise is resolved.
 	 */
-	@Override
-	public <R> Promise<R> then(Success<? super T, ? extends R> success, Failure failure) {
-		PromiseImpl<R> chained = new PromiseImpl<>();
-		onResolve(chained.new Then<>(this, success, failure));
-		return chained;
+	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 executing them, so the order in which callbacks are
+		 * executed cannot be specified.
+		 */
+		Executor executor = callbackExecutor;
+		for (Runnable callback = callbacks.poll(); callback != null; callback = callbacks.poll()) {
+			if (executor == null) {
+				executor = DefaultExecutors.callbackExecutor();
+			}
+			try {
+				try {
+					executor.execute(callback);
+				} catch (RejectedExecutionException e) {
+					callback.run();
+				}
+			} catch (Throwable t) {
+				uncaughtException(t);
+			}
+		}
+	}
+
+	/**
+	 * Handle an uncaught exception from a Runnable.
+	 * 
+	 * @param t The uncaught exception.
+	 * @since 1.1
+	 */
+	static void uncaughtException(Throwable t) {
+		try {
+			Thread thread = Thread.currentThread();
+			thread.getUncaughtExceptionHandler().uncaughtException(thread, t);
+		} catch (Throwable ignored) {
+			// we ignore this
+		}
 	}
 
 	/**
 	 * {@inheritDoc}
 	 */
 	@Override
+	public <R> Promise<R> then(Success<? super T, ? extends R> success, Failure failure) {
+		PromiseImpl<R> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
+		onResolve(chained.new Then<>(this, success, failure));
+		return chained;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @since 1.1
+	 */
+	@Override
 	public <R> Promise<R> then(Success<? super T, ? extends R> success) {
 		return then(success, null);
 	}
 
 	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Promise<T> then(Callback callback) {
+		PromiseImpl<T> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
+		onResolve(chained.new Chain(this, callback));
+		return chained;
+	}
+
+	/**
 	 * A callback used to chain promises for the {@link #then(Success, Failure)}
 	 * method.
 	 * 
@@ -357,16 +427,6 @@
 	}
 
 	/**
-	 * {@inheritDoc}
-	 */
-	@Override
-	public Promise<T> then(Callback callback) {
-		PromiseImpl<T> chained = new PromiseImpl<>();
-		onResolve(chained.new Chain(this, callback));
-		return chained;
-	}
-
-	/**
 	 * Resolve this Promise with the specified Promise.
 	 * 
 	 * <p>
@@ -386,7 +446,8 @@
 	 *         resolved.
 	 */
 	Promise<Void> resolveWith(Promise<? extends T> with) {
-		PromiseImpl<Void> chained = new PromiseImpl<>();
+		PromiseImpl<Void> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		with.onResolve(new ResolveWith(with, chained));
 		return chained;
 	}
@@ -424,7 +485,8 @@
 	 */
 	@Override
 	public Promise<T> filter(Predicate<? super T> predicate) {
-		PromiseImpl<T> chained = new PromiseImpl<>();
+		PromiseImpl<T> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		onResolve(chained.new Filter(this, predicate));
 		return chained;
 	}
@@ -464,7 +526,8 @@
 	 */
 	@Override
 	public <R> Promise<R> map(Function<? super T, ? extends R> mapper) {
-		PromiseImpl<R> chained = new PromiseImpl<>();
+		PromiseImpl<R> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		onResolve(chained.new Map<>(this, mapper));
 		return chained;
 	}
@@ -504,7 +567,8 @@
 	 */
 	@Override
 	public <R> Promise<R> flatMap(Function<? super T, Promise<? extends R>> mapper) {
-		PromiseImpl<R> chained = new PromiseImpl<>();
+		PromiseImpl<R> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		onResolve(chained.new FlatMap<>(this, mapper));
 		return chained;
 	}
@@ -548,7 +612,8 @@
 	 */
 	@Override
 	public Promise<T> recover(Function<Promise<?>, ? extends T> recovery) {
-		PromiseImpl<T> chained = new PromiseImpl<>();
+		PromiseImpl<T> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		onResolve(chained.new Recover(this, recovery));
 		return chained;
 	}
@@ -591,7 +656,8 @@
 	 */
 	@Override
 	public Promise<T> recoverWith(Function<Promise<?>, Promise<? extends T>> recovery) {
-		PromiseImpl<T> chained = new PromiseImpl<>();
+		PromiseImpl<T> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		onResolve(chained.new RecoverWith(this, recovery));
 		return chained;
 	}
@@ -635,7 +701,8 @@
 	 */
 	@Override
 	public Promise<T> fallbackTo(Promise<? extends T> fallback) {
-		PromiseImpl<T> chained = new PromiseImpl<>();
+		PromiseImpl<T> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		onResolve(chained.new FallbackTo(this, fallback));
 		return chained;
 	}
@@ -666,13 +733,37 @@
 	}
 
 	/**
+	 * Schedule a operation on the scheduled executor.
+	 * 
+	 * @since 1.1
+	 */
+	ScheduledFuture< ? > schedule(Runnable operation, long delay,
+			TimeUnit unit) {
+		ScheduledExecutorService executor = scheduledExecutor;
+		if (executor == null) {
+			executor = DefaultExecutors.scheduledExecutor();
+		}
+		try {
+			try {
+				return executor.schedule(operation, delay, unit);
+			} catch (RejectedExecutionException e) {
+				operation.run();
+			}
+		} catch (Throwable t) {
+			uncaughtException(t);
+		}
+		return null;
+	}
+
+	/**
 	 * {@inheritDoc}
 	 * 
 	 * @since 1.1
 	 */
 	@Override
 	public Promise<T> timeout(long millis) {
-		PromiseImpl<T> chained = new PromiseImpl<>();
+		PromiseImpl<T> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		if (!isDone()) {
 			onResolve(chained.new Timeout(millis, TimeUnit.MILLISECONDS));
 		}
@@ -691,7 +782,7 @@
 		private final ScheduledFuture< ? > future;
 
 		Timeout(long timeout, TimeUnit unit) {
-			future = Callbacks.schedule(new TimeoutAction(), timeout, unit);
+			future = schedule(new TimeoutAction(), timeout, unit);
 		}
 
 		@Override
@@ -701,15 +792,16 @@
 			}
 		}
 	}
-	
+
 	/**
 	 * Callback used to fail the Promise if the timeout expires.
 	 * 
 	 * @Immutable
+	 * @since 1.1
 	 */
 	private final class TimeoutAction implements Runnable {
 		TimeoutAction() {}
-		
+
 		@Override
 		public void run() {
 			tryResolve(null, new TimeoutException());
@@ -723,7 +815,8 @@
 	 */
 	@Override
 	public Promise<T> delay(long millis) {
-		PromiseImpl<T> chained = new PromiseImpl<>();
+		PromiseImpl<T> chained = new PromiseImpl<>(callbackExecutor,
+				scheduledExecutor);
 		onResolve(new Delay(chained.new Chain(this), millis,
 				TimeUnit.MILLISECONDS));
 		return chained;
@@ -736,76 +829,54 @@
 	 * @Immutable
 	 * @since 1.1
 	 */
-	private static final class Delay implements Runnable {
-		private final Runnable	callback;
+	private final class Delay implements Runnable {
+		private final Runnable	operation;
 		private final long		delay;
 		private final TimeUnit	unit;
 
-		Delay(Runnable callback, long delay, TimeUnit unit) {
-			this.callback = callback;
+		Delay(Runnable operation, long delay, TimeUnit unit) {
+			this.operation = operation;
 			this.delay = delay;
 			this.unit = unit;
 		}
 
 		@Override
 		public void run() {
-			Callbacks.schedule(callback, delay, unit);
+			schedule(operation, delay, unit);
 		}
 	}
 
 	/**
-	 * Callback handler used to asynchronously execute callbacks.
+	 * Default executors for callbacks.
 	 * 
 	 * @Immutable
 	 * @since 1.1
 	 */
-	private static final class Callbacks
+	private static final class DefaultExecutors
 			implements ThreadFactory, RejectedExecutionHandler, Runnable {
-		private static final Callbacks			callbacks;
+		private static final DefaultExecutors	callbacks;
 		private static final ScheduledExecutor	scheduledExecutor;
 		private static final ThreadPoolExecutor	callbackExecutor;
 		static {
-			callbacks = new Callbacks();
+			callbacks = new DefaultExecutors();
 			scheduledExecutor = new ScheduledExecutor(2, callbacks);
 			callbackExecutor = new ThreadPoolExecutor(0, 64, 60L,
 					TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),
 					callbacks, callbacks);
 		}
 
-		/**
-		 * Schedule a callback on the scheduled executor
-		 */
-		static ScheduledFuture< ? > schedule(Runnable callback, long delay,
-				TimeUnit unit) {
-			try {
-				return scheduledExecutor.schedule(callback, delay, unit);
-			} catch (RejectedExecutionException e) {
-				callbacks.rejectedExecution(callback, scheduledExecutor);
-				return null;
-			}
+		static Executor callbackExecutor() {
+			return callbackExecutor;
 		}
 
-		/**
-		 * Execute a callback on the callback executor
-		 */
-		static void execute(Runnable callback) {
-			callbackExecutor.execute(callback);
-		}
-
-		static void uncaughtException(Throwable t) {
-			try {
-				Thread thread = Thread.currentThread();
-				thread.getUncaughtExceptionHandler().uncaughtException(thread,
-						t);
-			} catch (Throwable ignored) {
-				// we ignore this
-			}
+		static ScheduledExecutorService scheduledExecutor() {
+			return scheduledExecutor;
 		}
 
 		private final AtomicBoolean	shutdownHookInstalled;
 		private final ThreadFactory	delegateThreadFactory;
 
-		private Callbacks() {
+		private DefaultExecutors() {
 			shutdownHookInstalled = new AtomicBoolean();
 			delegateThreadFactory = Executors.defaultThreadFactory();
 		}
@@ -929,13 +1000,14 @@
 	 * A holder of the result of a promise.
 	 * 
 	 * @NotThreadSafe
+	 * @since 1.1
 	 */
 	static final class Result<P> {
 		Throwable	fail;
 		P			value;
-	
+
 		Result() {}
-	
+
 		static <R> Result<R> collect(Promise< ? extends R> promise) {
 			Result<R> result = new Result<>();
 			final boolean interrupted = Thread.interrupted();
@@ -954,11 +1026,4 @@
 			return result;
 		}
 	}
-
-	static <V> V requireNonNull(V value) {
-		if (value != null) {
-			return value;
-		}
-		throw new NullPointerException();
-	}
 }
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java
index 7067fe5..394bce4 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/promise/Promises.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2014, 2016). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2014, 2017). 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.
@@ -16,7 +16,7 @@
 
 package org.osgi.util.promise;
 
-import static org.osgi.util.promise.PromiseImpl.requireNonNull;
+import static java.util.Objects.requireNonNull;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -38,43 +38,42 @@
 	}
 
 	/**
-	 * Create a new Promise that has been resolved with the specified value.
+	 * Returns 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<>(value, null);
+		return new PromiseImpl<>(value, null, null, null);
 	}
 
 	/**
-	 * Create a new Promise that has been resolved with the specified failure.
+	 * Returns 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}.
+	 *            {@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<>(null, requireNonNull(failure));
+		return new PromiseImpl<>(null, requireNonNull(failure), null, null);
 	}
 
 	/**
-	 * Create a new Promise that is a latch on the resolution of the specified
+	 * Returns 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
+	 * The returned 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.
+	 *            Promise.
 	 * @param <S> A subtype of the value type of the List value associated with
-	 *        the returned Promise.
+	 *            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}.
+	 *            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 must be successfully resolved
 	 *         with a List of the values in the order of the specified Promises
@@ -87,33 +86,67 @@
 	 *         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<>();
-			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<>();
-		All<T> all = new All<>(chained, list);
-		for (Promise<? extends T> promise : list) {
-			promise.onResolve(all);
-		}
-		return chained;
+		return all(new Deferred<List<T>>(), promises);
 	}
 
 	/**
-	 * Create a new Promise that is a latch on the resolution of the specified
-	 * Promises.
+	 * Resolves the Promise returned by the specified Deferred when the
+	 * specified Promises are all resolved.
+	 * <p>
+	 * The returned 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 deferred The specified Deferred is used to obtain and resolve the
+	 *            returned Promise. Must not be {@code null} and must not have
+	 *            already resolved 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 The Promise from the specified Deferred. It is resolved only when
+	 *         all the specified Promises are resolved. The returned Promise
+	 *         must 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
+	 *         must 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.
+	 * @since 1.1
+	 */
+	public static <T, S extends T> Promise<List<T>> all(
+			Deferred<List<T>> deferred, Collection<Promise<S>> promises) {
+		if (promises.isEmpty()) {
+			List<T> result = new ArrayList<>();
+			deferred.resolve(result);
+		} else {
+			/* make a copy and capture the ordering */
+			List<Promise< ? extends T>> list = new ArrayList<Promise< ? extends T>>(
+					promises);
+			All<T> all = new All<>(deferred, list);
+			for (Promise< ? extends T> promise : list) {
+				promise.onResolve(all);
+			}
+		}
+		return deferred.getPromise();
+	}
+
+	/**
+	 * Returns 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}.
+	 *            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 must be successfully resolved
 	 *         with a List of the values in the order of the specified Promises
@@ -133,17 +166,55 @@
 	}
 
 	/**
-	 * A callback used to resolve a Promise when the specified list of Promises
+	 * Resolves the Promise returned by the specified Deferred when the
+	 * specified Promises are all resolved.
+	 * <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 deferred The specified Deferred is used to obtain and resolve the
+	 *            returned Promise. Must not be {@code null} and must not have
+	 *            already resolved 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 arguments must not be {@code null}.
+	 * @return The Promise from the specified Deferred. It is resolved only when
+	 *         all the specified Promises are resolved. The returned Promise
+	 *         must 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
+	 *         must 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.
+	 * @since 1.1
+	 */
+	@SafeVarargs
+	public static <T> Promise<List<T>> all(Deferred<List<T>> deferred,
+			Promise< ? extends T>... promises) {
+		@SuppressWarnings("unchecked")
+		List<Promise<T>> list = Arrays.asList((Promise<T>[]) promises);
+		return all(deferred, list);
+	}
+
+	/**
+	 * A callback used to resolve a Deferred 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 Deferred<List<T>>				chained;
 		private final List<Promise<? extends T>>	promises;
 		private final AtomicInteger					promiseCount;
 
-		All(PromiseImpl<List<T>> chained, List<Promise<? extends T>> promises) {
+		All(Deferred<List<T>> chained, List<Promise< ? extends T>> promises) {
+			if (chained.getPromise().isDone()) {
+				throw new IllegalStateException("Already resolved");
+			}
 			this.chained = chained;
 			this.promises = promises;
 			this.promiseCount = new AtomicInteger(promises.size());
@@ -169,10 +240,9 @@
 				}
 			}
 			if (failed.isEmpty()) {
-				chained.tryResolve(value, null);
+				chained.resolve(value);
 			} else {
-				chained.tryResolve(null,
-						new FailedPromisesException(failed, cause));
+				chained.fail(new FailedPromisesException(failed, cause));
 			}
 		}
 	}
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/XMLParserActivator.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/XMLParserActivator.java
index c73b3c0..64be3f5 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/XMLParserActivator.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/XMLParserActivator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2002, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2002, 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.
@@ -91,9 +91,9 @@
  * @ThreadSafe
  * @author $Id$
  */
-public class XMLParserActivator implements BundleActivator, ServiceFactory {
+public class XMLParserActivator implements BundleActivator, ServiceFactory<Object> {
 	/** Context of this bundle */
-	private volatile BundleContext	context;
+	private volatile BundleContext	bundleContext;
 	/**
 	 * Filename containing the SAX Parser Factory Class name. Also used as the
 	 * basis for the {@code SERVICE_PID} registration property.
@@ -150,8 +150,9 @@
 	 *         bundle's listeners, unregister all services registered by this
 	 *         bundle, and release all services used by this bundle.
 	 */
+	@Override
 	public void start(BundleContext context) throws Exception {
-		this.context = context;
+		this.bundleContext = context;
 		Bundle parserBundle = context.getBundle();
 		// check for sax parsers
 		registerSAXParsers(getParserFactoryClassNames(parserBundle.getResource(SAXCLASSFILE)));
@@ -169,6 +170,7 @@
 	 *         the bundle's listeners, unregister all services registered by the
 	 *         bundle, and release all services used by the bundle.
 	 */
+	@Override
 	public void stop(BundleContext context) throws Exception {
 		// framework will automatically unregister the parser services
 	}
@@ -183,11 +185,11 @@
 	 * @return A List of strings containing the parser class names.
 	 * @throws IOException if there is a problem reading the URL input stream
 	 */
-	private List getParserFactoryClassNames(URL parserUrl) throws IOException {
+	private List<String> getParserFactoryClassNames(URL parserUrl) throws IOException {
 		if (parserUrl == null) {
-			return Collections.EMPTY_LIST;
+			return Collections.emptyList();
 		}
-		List v = new ArrayList(1);
+		List<String> v = new ArrayList<String>(1);
 		String parserFactoryClassName = null;
 		InputStream is = parserUrl.openStream();
 		BufferedReader br = new BufferedReader(new InputStreamReader(is));
@@ -220,17 +222,17 @@
 	 *        containing the names of the parser Factory Classes
 	 * @throws FactoryConfigurationError if thrown from {@code getFactory}
 	 */
-	private void registerSAXParsers(List parserFactoryClassNames) throws FactoryConfigurationError {
-		Iterator e = parserFactoryClassNames.iterator();
+	private void registerSAXParsers(List<String> parserFactoryClassNames) throws FactoryConfigurationError {
+		Iterator<String> e = parserFactoryClassNames.iterator();
 		int index = 0;
 		while (e.hasNext()) {
-			String parserFactoryClassName = (String) e.next();
+			String parserFactoryClassName = e.next();
 			// create a sax parser factory just to get it's default
 			// properties. It will never be used since
 			// this class will operate as a service factory and give each
 			// service requestor it's own SaxParserFactory
 			SAXParserFactory factory = (SAXParserFactory) getFactory(parserFactoryClassName);
-			Hashtable properties = new Hashtable(7);
+			Hashtable<String, Object> properties = new Hashtable<String, Object>(7);
 			// figure out the default properties of the parser
 			setDefaultSAXProperties(factory, properties, index);
 			// store the parser factory class name in the properties so that
@@ -238,7 +240,7 @@
 			// to return a parser factory
 			properties.put(FACTORYNAMEKEY, parserFactoryClassName);
 			// register the factory as a service
-			context.registerService(SAXFACTORYNAME, this, properties);
+			bundleContext.registerService(SAXFACTORYNAME, this, properties);
 			index++;
 		}
 	}
@@ -259,9 +261,9 @@
 	 * @param factory The {@code SAXParserFactory} object
 	 * @param props {@code Hashtable} of service properties.
 	 */
-	private void setDefaultSAXProperties(SAXParserFactory factory, Hashtable props, int index) {
+	private void setDefaultSAXProperties(SAXParserFactory factory, Hashtable<String, Object> props, int index) {
 		props.put(Constants.SERVICE_DESCRIPTION, SAXFACTORYDESCRIPTION);
-		props.put(Constants.SERVICE_PID, SAXFACTORYNAME + "." + context.getBundle().getBundleId() + "." + index);
+		props.put(Constants.SERVICE_PID, SAXFACTORYNAME + "." + bundleContext.getBundle().getBundleId() + "." + index);
 		setSAXProperties(factory, props);
 	}
 
@@ -285,7 +287,7 @@
 	 * @param factory - the SAXParserFactory object
 	 * @param properties - the properties object for the service
 	 */
-	public void setSAXProperties(SAXParserFactory factory, Hashtable properties) {
+	public void setSAXProperties(SAXParserFactory factory, Hashtable<String, Object> properties) {
 		// check if this parser can be configured to validate
 		boolean validating = true;
 		factory.setValidating(true);
@@ -308,8 +310,8 @@
 		factory.setValidating(validating);
 		factory.setNamespaceAware(namespaceaware);
 		// set the OSGi service properties
-		properties.put(PARSER_NAMESPACEAWARE, new Boolean(namespaceaware));
-		properties.put(PARSER_VALIDATING, new Boolean(validating));
+		properties.put(PARSER_NAMESPACEAWARE, Boolean.valueOf(namespaceaware));
+		properties.put(PARSER_VALIDATING, Boolean.valueOf(validating));
 	}
 
 	/**
@@ -319,17 +321,17 @@
 	 *        containing the names of the parser Factory Classes
 	 * @throws FactoryConfigurationError if thrown from {@code getFactory}
 	 */
-	private void registerDOMParsers(List parserFactoryClassNames) throws FactoryConfigurationError {
-		Iterator e = parserFactoryClassNames.iterator();
+	private void registerDOMParsers(List<String> parserFactoryClassNames) throws FactoryConfigurationError {
+		Iterator<String> e = parserFactoryClassNames.iterator();
 		int index = 0;
 		while (e.hasNext()) {
-			String parserFactoryClassName = (String) e.next();
+			String parserFactoryClassName = e.next();
 			// create a dom parser factory just to get it's default
 			// properties. It will never be used since
 			// this class will operate as a service factory and give each
 			// service requestor it's own DocumentBuilderFactory
 			DocumentBuilderFactory factory = (DocumentBuilderFactory) getFactory(parserFactoryClassName);
-			Hashtable properties = new Hashtable(7);
+			Hashtable<String, Object> properties = new Hashtable<String, Object>(7);
 			// figure out the default properties of the parser
 			setDefaultDOMProperties(factory, properties, index);
 			// store the parser factory class name in the properties so that
@@ -337,7 +339,7 @@
 			// to return a parser factory
 			properties.put(FACTORYNAMEKEY, parserFactoryClassName);
 			// register the factory as a service
-			context.registerService(DOMFACTORYNAME, this, properties);
+			bundleContext.registerService(DOMFACTORYNAME, this, properties);
 			index++;
 		}
 	}
@@ -356,9 +358,9 @@
 	 * @param factory The {@code DocumentBuilderFactory} object
 	 * @param props {@code Hashtable} of service properties.
 	 */
-	private void setDefaultDOMProperties(DocumentBuilderFactory factory, Hashtable props, int index) {
+	private void setDefaultDOMProperties(DocumentBuilderFactory factory, Hashtable<String, Object> props, int index) {
 		props.put(Constants.SERVICE_DESCRIPTION, DOMFACTORYDESCRIPTION);
-		props.put(Constants.SERVICE_PID, DOMFACTORYNAME + "." + context.getBundle().getBundleId() + "." + index);
+		props.put(Constants.SERVICE_PID, DOMFACTORYNAME + "." + bundleContext.getBundle().getBundleId() + "." + index);
 		setDOMProperties(factory, props);
 	}
 
@@ -382,7 +384,7 @@
 	 * @param factory - the DocumentBuilderFactory object
 	 * @param props - Hashtable of service properties.
 	 */
-	public void setDOMProperties(DocumentBuilderFactory factory, Hashtable props) {
+	public void setDOMProperties(DocumentBuilderFactory factory, Hashtable<String, Object> props) {
 		// check if this parser can be configured to validate
 		boolean validating = true;
 		factory.setValidating(true);
@@ -405,8 +407,8 @@
 		factory.setValidating(validating);
 		factory.setNamespaceAware(namespaceaware);
 		// set the OSGi service properties
-		props.put(PARSER_VALIDATING, new Boolean(validating));
-		props.put(PARSER_NAMESPACEAWARE, new Boolean(namespaceaware));
+		props.put(PARSER_VALIDATING, Boolean.valueOf(validating));
+		props.put(PARSER_NAMESPACEAWARE, Boolean.valueOf(namespaceaware));
 	}
 
 	/**
@@ -419,7 +421,7 @@
 	 */
 	private Object getFactory(String parserFactoryClassName) throws FactoryConfigurationError {
 		try {
-			return context.getBundle().loadClass(parserFactoryClassName).newInstance();
+			return bundleContext.getBundle().loadClass(parserFactoryClassName).newInstance();
 		} catch (RuntimeException e) {
 			throw e;
 		} catch (Exception e) {
@@ -448,8 +450,9 @@
 	 * @return A new, configured XML Parser Factory object or null if a
 	 *         configuration error was encountered
 	 */
-	public Object getService(Bundle bundle, ServiceRegistration registration) {
-		ServiceReference sref = registration.getReference();
+	@Override
+	public Object getService(Bundle bundle, ServiceRegistration<Object> registration) {
+		ServiceReference<Object> sref = registration.getReference();
 		String parserFactoryClassName = (String) sref.getProperty(FACTORYNAMEKEY);
 		// need to set factory properties
 		Object factory = getFactory(parserFactoryClassName);
@@ -474,6 +477,8 @@
 	 * @param service The XML Parser Factory object returned by a previous call
 	 *        to the {@code getService} method.
 	 */
-	public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+	@Override
+	public void ungetService(Bundle bundle, ServiceRegistration<Object> registration, Object service) {
+		// nothing to do
 	}
 }
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/package-info.java b/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/package-info.java
index 8d3c57b..1f05ed7 100644
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/package-info.java
+++ b/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2010, 2013). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2010, 2016). 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.
@@ -26,9 +26,10 @@
  * <p>
  * {@code  Import-Package: org.osgi.util.xml; version="[1.0,2.0)"}
  * 
- * @version 1.0.1
  * @author $Id$
  */
 
+@Version("1.0.1")
 package org.osgi.util.xml;
 
+import org.osgi.annotation.versioning.Version;
diff --git a/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/packageinfo b/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/packageinfo
deleted file mode 100644
index c266447..0000000
--- a/bundles/org.eclipse.osgi.util/src/org/osgi/util/xml/packageinfo
+++ /dev/null
@@ -1 +0,0 @@
-version 1.0.1
\ No newline at end of file
diff --git a/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/log/LogEntry.java b/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/log/LogEntry.java
index 6b3ee59..9dca758 100644
--- a/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/log/LogEntry.java
+++ b/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/log/LogEntry.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) OSGi Alliance (2000, 2016). All Rights Reserved.
+ * Copyright (c) OSGi Alliance (2000, 2017). 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.
@@ -68,11 +68,11 @@
 	int getLevel();
 
 	/**
-	 * Returns the human readable message associated with this {@code LogEntry}
+	 * Returns the formatted message associated with this {@code LogEntry}
 	 * object.
 	 * 
-	 * @return {@code String} containing the message associated with this
-	 *         {@code LogEntry} object.
+	 * @return {@code String} containing the formatted message associated with
+	 *         this {@code LogEntry} object.
 	 */
 	String getMessage();
 
diff --git a/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/resolver/Resolver.java b/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/resolver/Resolver.java
index 555f3cd..b51c25d 100644
--- a/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/resolver/Resolver.java
+++ b/bundles/org.eclipse.osgi/osgi/src/org/osgi/service/resolver/Resolver.java
@@ -77,13 +77,15 @@
 	Map<Resource, List<Wire>> resolve(ResolveContext context) throws ResolutionException;
 
 	/**
-	 * Resolves a given dynamic requirement dynamically for the given host
-	 * wiring using the given resolve context and return any new resources and
-	 * wires to the caller.
+	 * Resolves a given requirement dynamically for the given host wiring using
+	 * the given resolve context and return any new resources and wires to the
+	 * caller.
 	 * <p>
 	 * The requirement must be a {@link Wiring#getResourceRequirements(String)
 	 * requirement} of the wiring and must use the
-	 * {@link PackageNamespace#PACKAGE_NAMESPACE package} namespace.
+	 * {@link PackageNamespace#PACKAGE_NAMESPACE package} namespace with a
+	 * {@link Namespace#REQUIREMENT_RESOLUTION_DIRECTIVE resolution} of type
+	 * {@link PackageNamespace#RESOLUTION_DYNAMIC dynamic}.
 	 * <p>
 	 * The resolve context is not asked for
 	 * {@link ResolveContext#getMandatoryResources() mandatory} resources or for