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
