Merge remote-tracking branch 'origin/master' into BETA_JAVA14
diff --git a/apitools/org.eclipse.pde.api.tools.annotations/pom.xml b/apitools/org.eclipse.pde.api.tools.annotations/pom.xml
index c34b6d7..452e4ab 100644
--- a/apitools/org.eclipse.pde.api.tools.annotations/pom.xml
+++ b/apitools/org.eclipse.pde.api.tools.annotations/pom.xml
@@ -11,7 +11,7 @@
   <parent>
     <artifactId>eclipse.pde.ui.apitools</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.api.tools.annotations</artifactId>
diff --git a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
index 4db58d2..f2c0ff1 100644
--- a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
@@ -2,12 +2,11 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.pde.api.tools.tests
-Bundle-Version: 1.1.700.qualifier
+Bundle-Version: 1.1.800.qualifier
 Bundle-Vendor: %Bundle-Vendor
 Require-Bundle: org.eclipse.core.runtime,
  org.junit,
  org.eclipse.pde.api.tools;bundle-version="1.0.600",
- org.eclipse.core.resources,
  com.ibm.icu,
  org.eclipse.jdt.launching;bundle-version="[3.6.100,4.0.0)",
  org.eclipse.debug.core,
@@ -21,10 +20,7 @@
  org.eclipse.test.performance,
  org.eclipse.jdt.core.tests.builder;bundle-version="[3.8.0,4.0.0)",
  org.eclipse.jdt.core.tests.compiler;bundle-version="[3.8.0,4.0.0)",
- org.eclipse.ant.core,
- org.objectweb.asm;bundle-version="[6.0.0,8.0.0)",
- org.eclipse.jface;bundle-version="3.8.0",
- org.objectweb.asm.tree;bundle-version="[6.0.0,8.0.0)"
+ org.eclipse.ant.core
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.pde.api.tools.anttasks.tests,
  org.eclipse.pde.api.tools.apiusescan.tests,
diff --git a/apitools/org.eclipse.pde.api.tools.tests/pom.xml b/apitools/org.eclipse.pde.api.tools.tests/pom.xml
index 97f2df3..4c1482c 100644
--- a/apitools/org.eclipse.pde.api.tools.tests/pom.xml
+++ b/apitools/org.eclipse.pde.api.tools.tests/pom.xml
@@ -14,12 +14,12 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.api.tools.tests</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
+  <version>1.1.800-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
 
 	<build>
diff --git a/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/model/tests/ApiBaselineTests.java b/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/model/tests/ApiBaselineTests.java
index b848939..9ea64e4 100644
--- a/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/model/tests/ApiBaselineTests.java
+++ b/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/model/tests/ApiBaselineTests.java
@@ -311,25 +311,6 @@
 	}
 
 	/**
-	 * Tests component dependents.
-	 *
-	 * @throws CoreException
-	 */
-	@Test
-	public void testDependents() throws CoreException {
-		IApiComponent component = fBaseline.getApiComponent(COMPONENT_A);
-		IApiComponent[] dependents = fBaseline.getDependentComponents(new IApiComponent[] { component });
-		assertEquals("Wrong number of dependents", 2, dependents.length); //$NON-NLS-1$
-		for (IApiComponent apiComponent : dependents) {
-			if (apiComponent.getSymbolicName().equals(COMPONENT_B)) {
-				// done
-				return;
-			}
-		}
-		assertEquals("Missing dependent component.b", false); //$NON-NLS-1$
-	}
-
-	/**
 	 * Tests getting the location from an 'old' baseline
 	 */
 	@Test
diff --git a/apitools/org.eclipse.pde.api.tools.ui/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.ui/META-INF/MANIFEST.MF
index f684729..b17f3bd 100644
--- a/apitools/org.eclipse.pde.api.tools.ui/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.pde.api.tools.ui; singleton:=true
-Bundle-Version: 1.1.900.qualifier
+Bundle-Version: 1.1.1000.qualifier
 Bundle-Localization: plugin
 Eclipse-LazyStart: true
 Bundle-ActivationPolicy: lazy
@@ -14,19 +14,13 @@
  org.eclipse.ui;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.jdt.ui;bundle-version="[3.8.0,4.0.0)",
  org.eclipse.jface.text;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jdt.launching;bundle-version="[3.6.100,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ui.forms;bundle-version="[3.3.100,4.0.0)",
  org.eclipse.ui.ide;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.search;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ui.editors;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ltk.core.refactoring;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ltk.ui.refactoring;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.expressions;bundle-version="3.4.100",
- org.eclipse.equinox.frameworkadmin;bundle-version="[2.0.0,3.0.0)",
- org.eclipse.debug.core;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.debug.ui;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.ui.trace;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.equinox.frameworkadmin;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.jdt.core.manipulation;bundle-version="1.5.0",
  org.eclipse.core.filesystem;bundle-version="1.4.0",
  org.eclipse.equinox.bidi;bundle-version="[0.10.0,2.0.0)"
diff --git a/apitools/org.eclipse.pde.api.tools.ui/plugin.xml b/apitools/org.eclipse.pde.api.tools.ui/plugin.xml
index 96bd2a7..b5fb2a2 100644
--- a/apitools/org.eclipse.pde.api.tools.ui/plugin.xml
+++ b/apitools/org.eclipse.pde.api.tools.ui/plugin.xml
@@ -22,7 +22,8 @@
       <javaCompletionProposalComputer
             activate="true"
             categoryId="org.eclipse.pde.api.tools.ui.apitools_proposal_category"
-            class="org.eclipse.pde.api.tools.ui.internal.completion.APIToolsJavadocCompletionProposalComputer">
+            class="org.eclipse.pde.api.tools.ui.internal.completion.APIToolsJavadocCompletionProposalComputer"
+            requiresUIThread="false">
          <partition
                type="__java_javadoc">
          </partition>
diff --git a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/MarkerMessages.java b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/MarkerMessages.java
index 76ac9de..04fff9e 100644
--- a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/MarkerMessages.java
+++ b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/MarkerMessages.java
@@ -86,18 +86,12 @@
 	public static String VersionNumberingResolution_minor0;
 	public static String VersionNumberingResolution_major1;
 	public static String VersionNumberingResolution_minor1;
-	public static String VersionNumberingResolution_major2;
-	public static String VersionNumberingResolution_minor2;
 	public static String VersionNumberingResolution_minorNoNewAPI0;
 	public static String VersionNumberingResolution_minorNoNewAPI1;
 	public static String VersionNumberingResolution_minorNoNewAPI2;
 
 	public static String VersionNumberingResolution_reexportedMajor0;
-	public static String VersionNumberingResolution_reexportedMajor1;
-	public static String VersionNumberingResolution_reexportedMajor2;
 	public static String VersionNumberingResolution_reexportedMinor0;
-	public static String VersionNumberingResolution_reexportedMinor1;
-	public static String VersionNumberingResolution_reexportedMinor2;
 	public static String VersionNumberingResolution_unnecessaryMicroIncrease;
 	public static String VersionNumberingResolution_unnecessaryMinorIncrease;
 	public static String VersionNumberingResolution_breeMinor;
diff --git a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/VersionNumberingResolution.java b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/VersionNumberingResolution.java
index c5133ce..60f86204 100644
--- a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/VersionNumberingResolution.java
+++ b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/VersionNumberingResolution.java
@@ -87,7 +87,7 @@
 			case IApiProblem.MINOR_VERSION_CHANGE_NO_NEW_API:
 				return NLS.bind(MarkerMessages.VersionNumberingResolution_minorNoNewAPI1, this.newVersionValue);
 			case IApiProblem.REEXPORTED_MAJOR_VERSION_CHANGE:
-				return NLS.bind(MarkerMessages.VersionNumberingResolution_reexportedMajor1, this.newVersionValue);
+				return NLS.bind(MarkerMessages.VersionNumberingResolution_major1, this.newVersionValue);
 			case IApiProblem.MICRO_VERSION_CHANGE_UNNECESSARILY:
 				return MarkerMessages.VersionNumberingResolution_unnecessaryMicroIncrease;
 			case IApiProblem.MINOR_VERSION_CHANGE_UNNECESSARILY:
@@ -95,7 +95,7 @@
 
 			default:
 				// IApiProblem.REEXPORTED_MINOR_VERSION_CHANGE
-				return NLS.bind(MarkerMessages.VersionNumberingResolution_reexportedMinor1, this.newVersionValue);
+				return NLS.bind(MarkerMessages.VersionNumberingResolution_minor1, this.newVersionValue);
 		}
 	}
 
@@ -104,19 +104,19 @@
 		String title = null;
 		switch (this.kind) {
 			case IApiProblem.MAJOR_VERSION_CHANGE:
-				title = NLS.bind(MarkerMessages.VersionNumberingResolution_major2, this.newVersionValue);
+				title = NLS.bind(MarkerMessages.VersionNumberingResolution_major1, this.newVersionValue);
 				break;
 			case IApiProblem.MINOR_VERSION_CHANGE:
-				title = NLS.bind(MarkerMessages.VersionNumberingResolution_minor2, this.newVersionValue);
+				title = NLS.bind(MarkerMessages.VersionNumberingResolution_minor1, this.newVersionValue);
 				break;
 			case IApiProblem.MAJOR_VERSION_CHANGE_NO_BREAKAGE:
-				title = NLS.bind(MarkerMessages.VersionNumberingResolution_major2, this.newVersionValue);
+				title = NLS.bind(MarkerMessages.VersionNumberingResolution_major1, this.newVersionValue);
 				break;
 			case IApiProblem.MINOR_VERSION_CHANGE_NO_NEW_API:
 				title = NLS.bind(MarkerMessages.VersionNumberingResolution_minorNoNewAPI2, this.newVersionValue);
 				break;
 			case IApiProblem.REEXPORTED_MAJOR_VERSION_CHANGE:
-				title = NLS.bind(MarkerMessages.VersionNumberingResolution_reexportedMajor2, this.newVersionValue);
+				title = NLS.bind(MarkerMessages.VersionNumberingResolution_major1, this.newVersionValue);
 				break;
 			case IApiProblem.MICRO_VERSION_CHANGE_UNNECESSARILY:
 				title = MarkerMessages.VersionNumberingResolution_unnecessaryMicroIncrease;
@@ -126,7 +126,7 @@
 				break;
 			default:
 				// IApiProblem.REEXPORTED_MINOR_VERSION_CHANGE
-				title = NLS.bind(MarkerMessages.VersionNumberingResolution_reexportedMinor2, this.newVersionValue);
+				title = NLS.bind(MarkerMessages.VersionNumberingResolution_minor1, this.newVersionValue);
 		}
 		Job job = new Job(title) {
 			@Override
diff --git a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/markermessages.properties b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/markermessages.properties
index e797a5b..2aac0a5 100644
--- a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/markermessages.properties
+++ b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/markers/markermessages.properties
@@ -74,19 +74,13 @@
 VersionNumberingResolution_minor0=List of compatible changes:<br>{0}
 VersionNumberingResolution_major1=Correct the major version to {0}
 VersionNumberingResolution_minor1=Correct the minor version to {0}
-VersionNumberingResolution_major2=Correct the major version to {0}
-VersionNumberingResolution_minor2=Correct the minor version to {0}
 VersionNumberingResolution_minorNoNewAPI0=The minor version should be reverted
 VersionNumberingResolution_minorNoNewAPI1=Correct the version to {0}
 VersionNumberingResolution_minorNoNewAPI2=Correct the version to {0}
 UpdateVersionNumberingOperation_title=Update bundle version
 
 VersionNumberingResolution_reexportedMajor0=A major version change in a reexported bundle requires the major version of this bundle to be incremented
-VersionNumberingResolution_reexportedMajor1=Correct the major version to {0}
-VersionNumberingResolution_reexportedMajor2=Correct the major version to {0}
 VersionNumberingResolution_reexportedMinor0=A minor version change in a reexported bundle requires the minor version of this bundle to be incremented
-VersionNumberingResolution_reexportedMinor1=Correct the minor version to {0}
-VersionNumberingResolution_reexportedMinor2=Correct the minor version to {0}
 VersionNumberingResolution_unnecessaryMicroIncrease=Correct the micro version to 0
 VersionNumberingResolution_unnecessaryMinorIncrease=Correct the minor version to 0
 VersionNumberingResolution_breeMinor=Changed execution environments requires the minor version of this bundle to be incremented
diff --git a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/use/ApiUseTabGroup.java b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/use/ApiUseTabGroup.java
index f233b0d..820c935 100644
--- a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/use/ApiUseTabGroup.java
+++ b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/use/ApiUseTabGroup.java
@@ -16,7 +16,6 @@
 import org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup;
 import org.eclipse.debug.ui.CommonTab;
 import org.eclipse.debug.ui.ILaunchConfigurationDialog;
-import org.eclipse.debug.ui.ILaunchConfigurationTab;
 
 /**
  * The tab group for API use scanning
@@ -27,8 +26,7 @@
 
 	@Override
 	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
-		setTabs(new ILaunchConfigurationTab[] {
-				new ApiUseScanTab(), new ApiUsePatternTab(), new CommonTab() });
+		setTabs(new ApiUseScanTab(), new ApiUsePatternTab(), new CommonTab());
 	}
 
 }
diff --git a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
index 44e1ad0..07a3dfe 100644
--- a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
@@ -2,21 +2,17 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.pde.api.tools;singleton:=true
-Bundle-Version: 1.1.1000.qualifier
+Bundle-Version: 1.1.1200.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Require-Bundle: org.eclipse.osgi;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.pde.core;bundle-version="[3.3.102,4.0.0)",
  org.eclipse.jdt.core;bundle-version="[3.14.0,4.0.0)",
  org.eclipse.jdt.launching;bundle-version="[3.6.100,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.text;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.filebuffers;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.ant.core;bundle-version="[3.1.300,4.0.0)",
  org.objectweb.asm;bundle-version="[6.0.0,8.0.0)",
- org.eclipse.team.core;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)",
  org.eclipse.equinox.frameworkadmin;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.core.variables;bundle-version="[3.2.0,4.0.0)",
  org.objectweb.asm.tree;bundle-version="[6.0.0,8.0.0)"
diff --git a/apitools/org.eclipse.pde.api.tools/pom.xml b/apitools/org.eclipse.pde.api.tools/pom.xml
index 0102028..7fd8566 100644
--- a/apitools/org.eclipse.pde.api.tools/pom.xml
+++ b/apitools/org.eclipse.pde.api.tools/pom.xml
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>eclipse.pde.ui.apitools</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.api.tools</artifactId>
-  <version>1.1.1000-SNAPSHOT</version>
+  <version>1.1.1200-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
     <defaultSigning-excludeInnerJars>true</defaultSigning-excludeInnerJars>
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/ApiAnalysisApplication.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/ApiAnalysisApplication.java
index 041223c..03b7e31 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/ApiAnalysisApplication.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/ApiAnalysisApplication.java
@@ -312,19 +312,19 @@
 			res.setDescription(projectDescription, 0, new NullProgressMonitor());
 		}
 		ICommand[] buildSpec = projectDescription.getBuildSpec();
-		List<ICommand> newBuilders = removeManifestSchemaAndJavaBuilders(buildSpec);
+		List<ICommand> newBuilders = removeManifestAndSchemaBuilders(buildSpec);
 		projectDescription.setBuildSpec(
 				newBuilders.toArray(new ICommand[newBuilders.size()]));
 		res.setDescription(projectDescription, new NullProgressMonitor());
 		return res;
 	}
 
-	private static List<ICommand> removeManifestSchemaAndJavaBuilders(ICommand[] buildSpec) {
-		// remove manifest, schema and java builders
+	private static List<ICommand> removeManifestAndSchemaBuilders(ICommand[] buildSpec) {
+		// remove manifest and schema builders
 		return Arrays.stream(buildSpec)
 				.filter(x -> !("org.eclipse.pde.ManifestBuilder".equals(x.getBuilderName()) //$NON-NLS-1$
-						|| "org.eclipse.pde.SchemaBuilder".equals(x.getBuilderName()) //$NON-NLS-1$
-				|| "org.eclipse.jdt.core.javabuilder".equals(x.getBuilderName())) //$NON-NLS-1$
+				|| "org.eclipse.pde.SchemaBuilder".equals(x.getBuilderName())) //$NON-NLS-1$
+
 				).collect(Collectors.toList());
 	}
 
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
index aa2d644..7a34505 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
@@ -1825,6 +1825,17 @@
 				}
 				IProject project = fJavaProject.getProject();
 				resource = Util.getResource(project, type);
+				IProject project2 = resource.getProject();
+				if (!project2.equals(project)) {
+					// marker should be on the same project as fJavaProject
+					int flag = delta.getFlags();
+					if (flag == IDelta.REEXPORTED_API_TYPE) {
+						resource = project.findMember(new Path(JarFile.MANIFEST_NAME));
+						charStart = 0;
+						charEnd = 0;
+						lineNumber = 1;
+					}
+				}
 				if (resource == null) {
 					return null;
 				}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiBaseline.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiBaseline.java
index 6c4a0b3..ef785c5 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiBaseline.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiBaseline.java
@@ -67,6 +67,7 @@
 import org.eclipse.pde.api.tools.internal.provisional.model.IApiComponent;
 import org.eclipse.pde.api.tools.internal.provisional.model.IApiElement;
 import org.eclipse.pde.api.tools.internal.util.Util;
+import org.eclipse.pde.internal.core.BuildDependencyCollector;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.Version;
@@ -666,7 +667,7 @@
 				}
 			}
 		}
-		return getApiComponents(visible.toArray(new BundleDescription[visible.size()]));
+		return getApiComponents(visible);
 	}
 
 	/**
@@ -864,13 +865,6 @@
 		ApiModelCache.getCache().removeElementInfo(this);
 	}
 
-	@Override
-	public IApiComponent[] getDependentComponents(IApiComponent[] components) throws CoreException {
-		ArrayList<BundleDescription> bundles = getBundleDescriptions(components);
-		BundleDescription[] bundleDescriptions = getState().getStateHelper().getDependentBundles(bundles.toArray(new BundleDescription[bundles.size()]));
-		return getApiComponents(bundleDescriptions);
-	}
-
 	/**
 	 * Returns an array of API components corresponding to the given bundle
 	 * descriptions.
@@ -878,8 +872,8 @@
 	 * @param bundles bundle descriptions
 	 * @return corresponding API components
 	 */
-	private IApiComponent[] getApiComponents(BundleDescription[] bundles) {
-		ArrayList<IApiComponent> dependents = new ArrayList<>(bundles.length);
+	private IApiComponent[] getApiComponents(Collection<BundleDescription> bundles) {
+		ArrayList<IApiComponent> dependents = new ArrayList<>(bundles.size());
 		for (BundleDescription bundle : bundles) {
 			IApiComponent component = getApiComponent(bundle.getSymbolicName());
 			if (component != null) {
@@ -909,8 +903,7 @@
 	@Override
 	public IApiComponent[] getPrerequisiteComponents(IApiComponent[] components) throws CoreException {
 		ArrayList<BundleDescription> bundles = getBundleDescriptions(components);
-		BundleDescription[] bundlesDescriptions = getState().getStateHelper().getPrerequisites(bundles.toArray(new BundleDescription[bundles.size()]));
-		return getApiComponents(bundlesDescriptions);
+		return getApiComponents(BuildDependencyCollector.collectBuildRelevantDependencies(bundles));
 	}
 
 	/**
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiModelFactory.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiModelFactory.java
index a258f8e..1a7d2a7 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiModelFactory.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/ApiModelFactory.java
@@ -418,7 +418,7 @@
 		}
 		int seqEnd = -1;
 		if (location.charAt(TARGET_PREFIX.length()) != IPath.SEPARATOR) {
-			location = location.replace(System.getProperty("file.separator"), "/"); //$NON-NLS-1$ //$NON-NLS-2$
+			location = location.replace(File.separatorChar, '/');
 			if (location.charAt(TARGET_PREFIX.length()) != IPath.SEPARATOR) {
 				return false;
 			}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/problems/problemmessages.properties b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/problems/problemmessages.properties
index e6db4dc..ba7409b 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/problems/problemmessages.properties
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/problems/problemmessages.properties
@@ -140,13 +140,13 @@
 104 = The member type {0} in {1} has been removed
 105 = The type parameter {1} has been removed for {0}
 108 = The constant value {2} has been removed for {0}.{1}
-113 = The type {0} in {1} is no longer API
-125 = The field {0}.{1} is no longer API
-126 = The method {0}.{1} is no longer API
-127 = The constructor {0}.{1} is no longer API
-128 = The enum constant {0}.{1} is no longer API
-129 = The method {0}.{1} with a default value is no longer API
-130 = The method {0}.{1} without a default value is no longer API
+113 = The type {0} in {1} is no longer an API
+125 = The field {0}.{1} is no longer an API
+126 = The method {0}.{1} is no longer an API
+127 = The constructor {0}.{1} is no longer an API
+128 = The enum constant {0}.{1} is no longer an API
+129 = The method {0}.{1} with a default value is no longer an API
+130 = The method {0}.{1} without a default value is no longer an API
 
 #additions
 #{0} = Javadoc tag name, {1} = java member (class, field, method, etc)
@@ -156,7 +156,7 @@
 132 = The @nooverride restriction has been added for method {0}.{1}
 133 = The interface {1} adds method {2} to {0} that is not tagged as @noimplement
 99 = API analysis aborted: {0} has unresolved constraints: {1}
-134 = The re-exported type {0} in {1} is no longer API
+134 = The re-exported type {0} in {1} is no longer an API
 135 = The re-exported type {0} has been removed from {1}
 
 #API Use Scan breakage error messages 
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/model/IApiBaseline.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/model/IApiBaseline.java
index 2cfbf66..ba5a7b1 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/model/IApiBaseline.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/provisional/model/IApiBaseline.java
@@ -139,18 +139,6 @@
 	public void close() throws CoreException;
 
 	/**
-	 * Returns all components in this baseline depending on the given
-	 * components. The returned collection includes the given components and all
-	 * dependents.
-	 *
-	 * @param components the initial set of components
-	 * @return an array of components for the given roots and all components in
-	 *         the state that depend on them
-	 * @throws CoreException if the baseline is disposed
-	 */
-	public IApiComponent[] getDependentComponents(IApiComponent[] components) throws CoreException;
-
-	/**
 	 * Returns all the prerequisite components in this baseline for the given
 	 * components. The returned collection includes the given components and all
 	 * prerequisites.
diff --git a/apitools/pom.xml b/apitools/pom.xml
index 2b59c62..2cf8880 100644
--- a/apitools/pom.xml
+++ b/apitools/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
   </parent>
   <artifactId>eclipse.pde.ui.apitools</artifactId>
   <packaging>pom</packaging>
diff --git a/ds/org.eclipse.pde.ds.annotations.tests/META-INF/MANIFEST.MF b/ds/org.eclipse.pde.ds.annotations.tests/META-INF/MANIFEST.MF
index 0c74d50..14de740 100644
--- a/ds/org.eclipse.pde.ds.annotations.tests/META-INF/MANIFEST.MF
+++ b/ds/org.eclipse.pde.ds.annotations.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: DS Annotations Tests
 Bundle-SymbolicName: org.eclipse.pde.ds.annotations.tests
-Bundle-Version: 1.1.300.qualifier
+Bundle-Version: 1.1.400.qualifier
 Bundle-Activator: org.eclipse.pde.ds.internal.annotations.tests.Activator
 Bundle-Vendor: Eclipse.org
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
@@ -13,7 +13,6 @@
  org.junit;bundle-version="[4.12.0,5.0.0)",
  org.eclipse.core.resources;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.12.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.12.0,4.0.0)",
  org.eclipse.text;bundle-version="[3.6.0,4.0.0)"
 Export-Package: org.eclipse.pde.ds.internal.annotations.tests;x-internal:=true
 Eclipse-BundleShape: dir
diff --git a/ds/org.eclipse.pde.ds.annotations.tests/pom.xml b/ds/org.eclipse.pde.ds.annotations.tests/pom.xml
index e776a86..f27869f 100644
--- a/ds/org.eclipse.pde.ds.annotations.tests/pom.xml
+++ b/ds/org.eclipse.pde.ds.annotations.tests/pom.xml
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.ds.annotations.tests</artifactId>
-  <version>1.1.300-SNAPSHOT</version>
+  <version>1.1.400-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
 </project>
diff --git a/ds/org.eclipse.pde.ds.annotations/META-INF/MANIFEST.MF b/ds/org.eclipse.pde.ds.annotations/META-INF/MANIFEST.MF
index 6c17269..819964d 100644
--- a/ds/org.eclipse.pde.ds.annotations/META-INF/MANIFEST.MF
+++ b/ds/org.eclipse.pde.ds.annotations/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.pde.ds.annotations;singleton:=true
-Bundle-Version: 1.1.600.qualifier
+Bundle-Version: 1.1.700.qualifier
 Bundle-Activator: org.eclipse.pde.ds.internal.annotations.Activator
 Bundle-Vendor: %Bundle-Vendor
 Require-Bundle: org.eclipse.ui;bundle-version="[3.105.0,4.0.0)",
diff --git a/ds/org.eclipse.pde.ds.annotations/pom.xml b/ds/org.eclipse.pde.ds.annotations/pom.xml
index 7695344..b12f475 100644
--- a/ds/org.eclipse.pde.ds.annotations/pom.xml
+++ b/ds/org.eclipse.pde.ds.annotations/pom.xml
@@ -16,11 +16,11 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.ds.annotations</artifactId>
-  <version>1.1.600-SNAPSHOT</version>
+  <version>1.1.700-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/ds/org.eclipse.pde.ds.core/META-INF/MANIFEST.MF b/ds/org.eclipse.pde.ds.core/META-INF/MANIFEST.MF
index 36af80a..48d7a61 100644
--- a/ds/org.eclipse.pde.ds.core/META-INF/MANIFEST.MF
+++ b/ds/org.eclipse.pde.ds.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.pde.ds.core;singleton:=true
-Bundle-Version: 1.1.700.qualifier
+Bundle-Version: 1.1.800.qualifier
 Bundle-Activator: org.eclipse.pde.internal.ds.core.Activator
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.core.filebuffers;bundle-version="[3.3.0,4.0.0)",
diff --git a/ds/org.eclipse.pde.ds.core/pom.xml b/ds/org.eclipse.pde.ds.core/pom.xml
index 6e93921..d50dceb 100644
--- a/ds/org.eclipse.pde.ds.core/pom.xml
+++ b/ds/org.eclipse.pde.ds.core/pom.xml
@@ -15,11 +15,11 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.ds.core</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
+  <version>1.1.800-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/ds/org.eclipse.pde.ds.lib/META-INF/MANIFEST.MF b/ds/org.eclipse.pde.ds.lib/META-INF/MANIFEST.MF
index 38e0435..07a81bc 100644
--- a/ds/org.eclipse.pde.ds.lib/META-INF/MANIFEST.MF
+++ b/ds/org.eclipse.pde.ds.lib/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.pde.ds.lib
-Bundle-Version: 1.1.300.qualifier
+Bundle-Version: 1.1.400.qualifier
 Bundle-ClassPath: annotations.jar
 Bundle-Vendor: %Bundle-Vendor
 Export-Package: org.osgi.service.component.annotations;version="1.3.0"
diff --git a/ds/org.eclipse.pde.ds.lib/pom.xml b/ds/org.eclipse.pde.ds.lib/pom.xml
index 3b171c2..e5fcd88 100644
--- a/ds/org.eclipse.pde.ds.lib/pom.xml
+++ b/ds/org.eclipse.pde.ds.lib/pom.xml
@@ -16,12 +16,12 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.ds.lib</artifactId>
-  <version>1.1.300-SNAPSHOT</version>
+  <version>1.1.400-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <build>
     <plugins>
diff --git a/ds/org.eclipse.pde.ds.tests/pom.xml b/ds/org.eclipse.pde.ds.tests/pom.xml
index e234b81..0dbe66a 100644
--- a/ds/org.eclipse.pde.ds.tests/pom.xml
+++ b/ds/org.eclipse.pde.ds.tests/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ds/org.eclipse.pde.ds.ui/pom.xml b/ds/org.eclipse.pde.ds.ui/pom.xml
index f28fe36..1ff0847 100644
--- a/ds/org.eclipse.pde.ds.ui/pom.xml
+++ b/ds/org.eclipse.pde.ds.ui/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ds/org.eclipse.pde.ds1_2.lib/META-INF/MANIFEST.MF b/ds/org.eclipse.pde.ds1_2.lib/META-INF/MANIFEST.MF
index 710fefb..f347527 100644
--- a/ds/org.eclipse.pde.ds1_2.lib/META-INF/MANIFEST.MF
+++ b/ds/org.eclipse.pde.ds1_2.lib/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name
 Bundle-SymbolicName: org.eclipse.pde.ds1_2.lib
-Bundle-Version: 1.0.300.qualifier
+Bundle-Version: 1.0.400.qualifier
 Bundle-ClassPath: annotations.jar
 Bundle-Vendor: %Bundle-Vendor
 Export-Package: org.osgi.service.component.annotations;version="1.2.0"
diff --git a/ds/org.eclipse.pde.ds1_2.lib/pom.xml b/ds/org.eclipse.pde.ds1_2.lib/pom.xml
index 8e7a25c..4d2cbc7 100644
--- a/ds/org.eclipse.pde.ds1_2.lib/pom.xml
+++ b/ds/org.eclipse.pde.ds1_2.lib/pom.xml
@@ -17,12 +17,12 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.ds1_2.lib</artifactId>
-  <version>1.0.300-SNAPSHOT</version>
+  <version>1.0.400-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <build>
     <plugins>
diff --git a/features/org.eclipse.pde-feature/feature.xml b/features/org.eclipse.pde-feature/feature.xml
index f4aef0c..57a58c6 100644
--- a/features/org.eclipse.pde-feature/feature.xml
+++ b/features/org.eclipse.pde-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.pde"
       label="%featureName"
-      version="3.14.200.qualifier"
+      version="3.14.300.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.pde-feature/pom.xml b/features/org.eclipse.pde-feature/pom.xml
index d25b3ee..9dbc3f2 100644
--- a/features/org.eclipse.pde-feature/pom.xml
+++ b/features/org.eclipse.pde-feature/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2012, 2017 Eclipse Foundation and others.
+  Copyright (c) 2012, 2019 Eclipse Foundation and others.
   All rights reserved. This program and the accompanying materials
   are made available under the terms of the Eclipse Distribution License v1.0
   which accompanies this distribution, and is available at
@@ -14,12 +14,12 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde.feature</groupId>
   <artifactId>org.eclipse.pde</artifactId>
-  <version>3.14.200-SNAPSHOT</version>
+  <version>3.14.300-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 
   <build>
diff --git a/pom.xml b/pom.xml
index e6e811f..4465752 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,13 +17,13 @@
   <parent>
     <groupId>org.eclipse</groupId>
     <artifactId>eclipse-platform-parent</artifactId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../eclipse-platform-parent</relativePath>
   </parent>
 
   <groupId>eclipse.pde.ui</groupId>
   <artifactId>eclipse.pde.ui</artifactId>
-  <version>4.14.0-SNAPSHOT</version>
+  <version>4.15.0-SNAPSHOT</version>
   <packaging>pom</packaging>
 
   <properties>
diff --git a/tests-pom/pom.xml b/tests-pom/pom.xml
index 2322cee..3e14483 100644
--- a/tests-pom/pom.xml
+++ b/tests-pom/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
   </parent>
   <artifactId>tests-pom</artifactId>
   <packaging>pom</packaging>
diff --git a/ua/org.eclipse.pde.ua.core/pom.xml b/ua/org.eclipse.pde.ua.core/pom.xml
index 32c1b2e..4e19d75 100644
--- a/ua/org.eclipse.pde.ua.core/pom.xml
+++ b/ua/org.eclipse.pde.ua.core/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ua/org.eclipse.pde.ua.tests/pom.xml b/ua/org.eclipse.pde.ua.tests/pom.xml
index cd0f7d5..a8d7e52 100644
--- a/ua/org.eclipse.pde.ua.tests/pom.xml
+++ b/ua/org.eclipse.pde.ua.tests/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ua/org.eclipse.pde.ua.ui/pom.xml b/ua/org.eclipse.pde.ua.ui/pom.xml
index 49d73cf..8042a87 100644
--- a/ua/org.eclipse.pde.ua.ui/pom.xml
+++ b/ua/org.eclipse.pde.ua.ui/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF
index a2f02c7..f045abd 100644
--- a/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %name
 Bundle-SymbolicName: org.eclipse.pde.core; singleton:=true
-Bundle-Version: 3.13.200.qualifier
+Bundle-Version: 3.13.300.qualifier
 Bundle-Activator: org.eclipse.pde.internal.core.PDECore
 Bundle-Vendor: %provider-name
 Bundle-Localization: plugin
@@ -76,7 +76,6 @@
  org.eclipse.pde.internal.core.variables;x-internal:=true
 Require-Bundle: 
  org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.e4.core.contexts;bundle-version="[1.8.0,2.0.0)",
  org.eclipse.e4.core.services;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
@@ -95,16 +94,13 @@
  org.eclipse.equinox.p2.core;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.equinox.p2.metadata;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.equinox.p2.director;bundle-version="[2.1.0,3.0.0)",
- org.eclipse.equinox.p2.artifact.repository;bundle-version="[1.0.100,2.0.0)",
  org.eclipse.equinox.p2.repository;bundle-version="[2.0.0,3.0.0]",
  org.eclipse.equinox.p2.repository.tools;bundle-version="[2.0.100,3.0.0)",
- org.eclipse.equinox.p2.metadata.repository;bundle-version="[1.0.100,2.0.0)",
  org.eclipse.equinox.p2.garbagecollector;bundle-version="[1.0.100,2.0.0)",
  org.eclipse.equinox.p2.touchpoint.eclipse;bundle-version="[2.0.0,3.0.0)",
  org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.filesystem;bundle-version="[1.0.0,2.0.0)"
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: com.ibm.icu.util
 Bundle-ActivationPolicy: lazy
 Automatic-Module-Name: org.eclipse.pde.core
diff --git a/ui/org.eclipse.pde.core/pom.xml b/ui/org.eclipse.pde.core/pom.xml
index ebea8bb..9d476c7 100644
--- a/ui/org.eclipse.pde.core/pom.xml
+++ b/ui/org.eclipse.pde.core/pom.xml
@@ -15,12 +15,12 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.core</artifactId>
-  <version>3.13.200-SNAPSHOT</version>
+  <version>3.13.300-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
     <defaultSigning-excludeInnerJars>true</defaultSigning-excludeInnerJars>
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/BuildDependencyCollector.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/BuildDependencyCollector.java
new file mode 100644
index 0000000..8a70af8
--- /dev/null
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/BuildDependencyCollector.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ *  Copyright (c) 2019 Julian Honnen
+ *
+ *  This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *     Julian Honnen <julian.honnen@vector.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.pde.internal.core;
+
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Queue;
+import org.eclipse.osgi.service.resolver.BaseDescription;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.BundleSpecification;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.HostSpecification;
+import org.eclipse.osgi.service.resolver.ImportPackageSpecification;
+
+public class BuildDependencyCollector {
+	private final Collection<BundleDescription> fDependencies = new HashSet<>();
+	private final Queue<BundleDescription> fQueue = new ArrayDeque<>();
+
+	private BuildDependencyCollector(Collection<BundleDescription> roots) {
+		fQueue.addAll(roots);
+		fDependencies.addAll(roots);
+	}
+
+	/**
+	 * Returns all transitive dependencies that are relevant for building
+	 * {@code roots}, including {@code roots} themselves.
+	 */
+	public static Collection<BundleDescription> collectBuildRelevantDependencies(Collection<BundleDescription> roots) {
+		BuildDependencyCollector collector = new BuildDependencyCollector(roots);
+		collector.collect();
+		return collector.fDependencies;
+	}
+
+	private void collect() {
+		while (!fQueue.isEmpty()) {
+			BundleDescription bundleDescription = fQueue.remove();
+
+			collectRequiredBundles(bundleDescription);
+			collectImportedPackages(bundleDescription);
+			collectFragmentHost(bundleDescription);
+		}
+	}
+
+	private void collectRequiredBundles(BundleDescription bundle) {
+		for (BundleSpecification required : bundle.getRequiredBundles()) {
+			BundleDescription supplier = (BundleDescription) required.getSupplier();
+			enqueueDependency(supplier);
+		}
+	}
+
+	private void collectImportedPackages(BundleDescription bundle) {
+		for (ImportPackageSpecification importPackage : bundle.getImportPackages()) {
+			BaseDescription supplier = importPackage.getSupplier();
+			if (supplier instanceof ExportPackageDescription) {
+				enqueueDependency(((ExportPackageDescription) supplier).getExporter());
+			}
+		}
+	}
+
+	private void collectFragmentHost(BundleDescription bundle) {
+		HostSpecification host = bundle.getHost();
+		if (host != null) {
+			BaseDescription supplier = host.getSupplier();
+			if (supplier instanceof BundleDescription) {
+				enqueueDependency((BundleDescription) supplier);
+			}
+		}
+	}
+
+	private void enqueueDependency(BundleDescription dependency) {
+		if (dependency != null && fDependencies.add(dependency)) {
+			fQueue.add(dependency);
+		}
+	}
+}
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/DynamicPluginProjectReferences.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/DynamicPluginProjectReferences.java
index 77b06ed..c0145c3 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/DynamicPluginProjectReferences.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/DynamicPluginProjectReferences.java
@@ -13,7 +13,9 @@
  *******************************************************************************/
 package org.eclipse.pde.internal.core;
 
-import java.util.ArrayList;
+import static java.util.Collections.singleton;
+import static java.util.stream.Collectors.toList;
+
 import java.util.Collections;
 import java.util.List;
 import org.eclipse.core.resources.IBuildConfiguration;
@@ -24,8 +26,6 @@
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.osgi.service.resolver.BundleDescription;
-import org.eclipse.osgi.service.resolver.State;
-import org.eclipse.osgi.service.resolver.StateObjectFactory;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
 
 /**
@@ -34,8 +34,6 @@
  */
 public class DynamicPluginProjectReferences implements IDynamicReferenceProvider {
 
-	public static State state;
-
 	public DynamicPluginProjectReferences() {
 		super();
 	}
@@ -47,26 +45,14 @@
 		if (javaProject != null) {
 			IPluginModelBase model = PDECore.getDefault().getModelManager().findModel(javaProject.getProject());
 			if (model != null) {
-				List<IProject> allProj = new ArrayList<>();
 				BundleDescription currentBundle = model.getBundleDescription();
-				if (state == null) {
-					state = StateObjectFactory.defaultFactory.createState(true);
+				if (currentBundle != null) {
+					IWorkspaceRoot root = PDECore.getWorkspace().getRoot();
+					return BuildDependencyCollector.collectBuildRelevantDependencies(singleton(currentBundle)).stream()
+							.filter(dependency -> dependency != currentBundle)
+							.map(dependency -> root.getProject(dependency.getName())).filter(IProject::exists)
+							.distinct().collect(toList());
 				}
-				if (state != null && currentBundle != null) {
-					BundleDescription[] bundlePrereq = state.getStateHelper()
-							.getPrerequisites(new BundleDescription[] { currentBundle });
-					for (BundleDescription bundle : bundlePrereq) {
-						if (bundle.equals(currentBundle)) {
-							continue;
-						}
-						IWorkspaceRoot root = PDECore.getWorkspace().getRoot();
-						IProject project = root.getProject(bundle.getName());
-						if (project.exists() && !allProj.contains(project)) {
-							allProj.add(project);
-						}
-					}
-				}
-				return allProj;
 			}
 		}
 		return Collections.emptyList();
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginPathFinder.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginPathFinder.java
index 2da9262..9b52deb 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginPathFinder.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PluginPathFinder.java
@@ -18,12 +18,9 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.MalformedURLException;
-import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Properties;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -271,7 +268,7 @@
 	 * @return URLs to plugins/features
 	 */
 	public static URL[] scanLocations(File[] sites) {
-		Map<URI, URL> result = new HashMap<>();
+		HashSet<URL> result = new HashSet<>();
 		for (int i = 0; i < sites.length; i++) {
 			if (!sites[i].exists()) {
 				continue;
@@ -280,14 +277,13 @@
 			if (children != null) {
 				for (File element : children) {
 					try {
-						URI elementUri = element.toURI();
-						result.put(elementUri, elementUri.toURL());
+						result.add(element.toURL());
 					} catch (MalformedURLException e) {
 					}
 				}
 			}
 		}
-		return result.values().toArray(new URL[result.size()]);
+		return result.toArray(new URL[result.size()]);
 	}
 
 	public static boolean isDevLaunchMode() {
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PreferenceInitializer.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PreferenceInitializer.java
index eafa823..dad5813 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PreferenceInitializer.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PreferenceInitializer.java
@@ -40,6 +40,7 @@
 		prefs.putInt(CompilerFlags.P_NOT_EXTERNALIZED, CompilerFlags.IGNORE);
 		prefs.putInt(CompilerFlags.P_SERVICE_COMP_WITHOUT_LAZY_ACT, CompilerFlags.WARNING);
 		prefs.putInt(CompilerFlags.P_NO_AUTOMATIC_MODULE, CompilerFlags.WARNING);
+		prefs.putInt(CompilerFlags.P_EXEC_ENV_TOO_LOW, CompilerFlags.WARNING);
 
 		prefs.putInt(CompilerFlags.P_BUILD, CompilerFlags.WARNING);
 		prefs.putInt(CompilerFlags.P_BUILD_MISSING_OUTPUT, CompilerFlags.IGNORE);
@@ -52,7 +53,7 @@
 		prefs.putInt(CompilerFlags.P_BUILD_ENCODINGS, CompilerFlags.IGNORE);
 
 		prefs.putInt(CompilerFlags.P_INCOMPATIBLE_ENV, CompilerFlags.WARNING);
-		prefs.putInt(CompilerFlags.P_MISSING_EXPORT_PKGS, CompilerFlags.WARNING);
+		prefs.putInt(CompilerFlags.P_MISSING_EXPORT_PKGS, CompilerFlags.IGNORE);
 
 		prefs.putInt(CompilerFlags.P_MISSING_VERSION_EXP_PKG, CompilerFlags.IGNORE);
 		prefs.putInt(CompilerFlags.P_MISSING_VERSION_IMP_PKG, CompilerFlags.IGNORE);
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/BundleErrorReporter.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/BundleErrorReporter.java
index 50a30bf..9d7df16 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/BundleErrorReporter.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/BundleErrorReporter.java
@@ -18,6 +18,7 @@
 package org.eclipse.pde.internal.core.builders;
 
 import java.io.File;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -246,6 +247,12 @@
 									if (!containsPackage(header, name)) {
 										packages.append(name);
 										packages.append(","); //$NON-NLS-1$
+										byte[] bytes = packages.toString().getBytes(StandardCharsets.UTF_8);
+										// See MarkerInfo::checkValidAttribute
+										if (bytes.length > 65535) {
+											packages.delete(packages.lastIndexOf(name), packages.length());
+											break;
+										}
 									}
 								}
 							}
@@ -643,26 +650,57 @@
 		}
 
 		// Check for highest BREE of bundle dependencies
+		int compilerFlag = CompilerFlags.getFlag(fProject, CompilerFlags.P_EXEC_ENV_TOO_LOW);
+		if (compilerFlag != CompilerFlags.IGNORE) {
 		String highestDependencyEE = checkBREE(desc);
 		String highestBundleEE = getHighestBREE(bundleEnvs);
 		try {
 			if (highestBundleEE != getHighestEE(highestDependencyEE, highestBundleEE)) {
-				VirtualMarker marker = report(
-						NLS.bind(PDECoreMessages.BundleErrorReporter_ExecEnv_tooLow,
-								highestDependencyEE, highestDependencyEE),
-						getLine(header, highestBundleEE), sev, PDEMarkerFactory.M_EXEC_ENV_TOO_LOW,
-						PDEMarkerFactory.CAT_EE);
-				addMarkerAttribute(marker, PDEMarkerFactory.REQUIRED_EXEC_ENV, highestDependencyEE);
+
+					VirtualMarker marker = report(
+							NLS.bind(PDECoreMessages.BundleErrorReporter_ExecEnv_tooLow, highestDependencyEE,
+									highestDependencyEE),
+							getLine(header, highestBundleEE), compilerFlag, PDEMarkerFactory.M_EXEC_ENV_TOO_LOW,
+							PDEMarkerFactory.CAT_EE);
+					addMarkerAttribute(marker, PDEMarkerFactory.compilerKey, CompilerFlags.P_EXEC_ENV_TOO_LOW);
+					addMarkerAttribute(marker, PDEMarkerFactory.REQUIRED_EXEC_ENV, highestDependencyEE);
 			}
 		} catch (Exception e) {
 			PDECore.log(e);
 		}
+		}
 	}
 
 	static final List<String> EXECUTION_ENVIRONMENT_NAMES = Arrays.asList("OSGi/Minimum", //$NON-NLS-1$
 			"CDC-1.0/Foundation", //$NON-NLS-1$
 			"CDC-1.1/Foundation", "JRE", "J2SE", "JavaSE"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 
+	/**
+	 * <p>
+	 * Returns the highest Execution Environment between two given Execution
+	 * Environments. An Execution Environment is <b>higher</b> than another
+	 * Execution Environment if it's name occurs at a later index in
+	 * {@link #EXECUTION_ENVIRONMENT_NAMES}, or if the names are equal and it's
+	 * major version is greater, or if the names and major version are equal and
+	 * it's minor version is greater.
+	 * </p>
+	 * <p>
+	 * For example, the name component of JavaSE-1.8 is 'JavaSE', it's major
+	 * version is 1 and it's minor version is 8. Thus JavaSE-1.8 is a higher
+	 * Execution Environment than JRE-1.1 since it's name occurs at later index
+	 * than 'JRE' in {@link #EXECUTION_ENVIRONMENT_NAMES}.
+	 * </p>
+	 *
+	 * @param execEnv1
+	 *            String representation of the first Execution Environment to
+	 *            compare
+	 * @param execEnv2
+	 *            String representation of the second Execution Environment to
+	 *            compare
+	 * @return The string representation of the highest Execution Environment
+	 *         between the two Execution Environments
+	 * @throws IllegalArgumentException
+	 */
 	private static String getHighestEE(String execEnv1, String execEnv2) throws IllegalArgumentException {
 		if (execEnv1 == null) {
 			return execEnv2;
@@ -723,6 +761,16 @@
 		return execEnv1;
 	}
 
+	/**
+	 * Compares all the Execution Environments in an array of Execution
+	 * Environments strings and returns the highest one.
+	 *
+	 * @param executionEnvironments
+	 *            Array of Execution Environment strings to compare
+	 * @return The highest Execution Environment in the array of Execution
+	 *         Environments, null if an error occurred or if an empty array is
+	 *         given
+	 */
 	private String getHighestBREE(String[] executionEnvironments) {
 		if (executionEnvironments.length == 0) {
 			return null;
@@ -743,6 +791,16 @@
 		return highestExecEnv;
 	}
 
+	/**
+	 * Gets the highest Execution Environment required by a bundle or any of
+	 * it's transitive dependencies.
+	 *
+	 * @param desc
+	 *            The bundle description of the bundle which we wish to check
+	 *            for it's highest required Execution Environment
+	 * @return The highest Execution Environment required by the bundle or any
+	 *         of it's dependencies
+	 */
 	private String checkBREE(BundleDescription desc) {
 		String highestBREE = getHighestBREE(desc.getExecutionEnvironments());
 		HashSet<BundleDescription> visitedBundles = new HashSet<>();
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/CompilerFlags.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/CompilerFlags.java
index dee6c32..5ee8e62 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/CompilerFlags.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/builders/CompilerFlags.java
@@ -73,6 +73,7 @@
 	public static final String P_INTERNAL = "compilers.p.internal"; //$NON-NLS-1$
 	public static final String P_SERVICE_COMP_WITHOUT_LAZY_ACT = "compilers.p.service.component.without.lazyactivation"; //$NON-NLS-1$
 	public static final String P_NO_AUTOMATIC_MODULE = "compilers.p.no.automatic.module"; //$NON-NLS-1$
+	public static final String P_EXEC_ENV_TOO_LOW = "compilers.p.exec-env-too-low"; //$NON-NLS-1$
 
 	public static final String P_MISSING_VERSION_EXP_PKG = "compilers.p.missing-version-export-package"; //$NON-NLS-1$
 	public static final String P_MISSING_VERSION_IMP_PKG = "compilers.p.missing-version-import-package"; //$NON-NLS-1$
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/pderesources.properties b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/pderesources.properties
index 2051238..9021a24 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/pderesources.properties
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/pderesources.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2018 IBM Corporation and others.
+# Copyright (c) 2000, 2019 IBM Corporation and others.
 #
 # This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License 2.0
@@ -174,7 +174,7 @@
 BundleErrorReporter_BundleRangeInvalidInBundleVersion=Unsatisfied version constraint: ''{0}''
 BundleErrorReporter_NotExistPDE=Bundle ''{0}'' cannot be resolved
 BundleErrorReporter_EmptyTargetPlatform=Target Platform is not set
-BundleErrorReporter_ExecEnv_tooLow=One of the bundles dependencies requires an Execution Environment of {0}, thus this bundles Execution Environment should be set to at least {1}.
+BundleErrorReporter_ExecEnv_tooLow=One of the plug-in''s dependencies requires an execution environment of {0}, hence this plug-in''s execution environment should be at least {1}.
 BundleErrorReporter_exportNoJRE=Cannot export packages prefixed with 'java'
 BundleErrorReporter_importNoJRE=Cannot import packages prefixed with 'java'
 BundleErrorReporter_HostNotExistPDE=Host bundle ''{0}'' cannot be resolved
diff --git a/ui/org.eclipse.pde.genericeditor.extension.tests/pom.xml b/ui/org.eclipse.pde.genericeditor.extension.tests/pom.xml
index 39459ae..219c2fd 100644
--- a/ui/org.eclipse.pde.genericeditor.extension.tests/pom.xml
+++ b/ui/org.eclipse.pde.genericeditor.extension.tests/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.pde.genericeditor.extension/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.genericeditor.extension/META-INF/MANIFEST.MF
index 21ca0dc..42d22e1 100644
--- a/ui/org.eclipse.pde.genericeditor.extension/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde.genericeditor.extension/META-INF/MANIFEST.MF
@@ -2,19 +2,16 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.pde.genericeditor.extension;singleton:=true
-Bundle-Version: 1.0.600.qualifier
+Bundle-Version: 1.0.700.qualifier
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.jface.text,
- org.eclipse.ui.genericeditor,
- org.eclipse.pde;bundle-version="[3.13.0,4.0.0)",
  org.eclipse.pde.ui;bundle-version="[3.10.0,4.0.0)",
  org.eclipse.equinox.p2.metadata;bundle-version="[2.3.100,4.0.0)",
  org.eclipse.equinox.p2.core;bundle-version="[2.4.100,4.0.0)",
  org.eclipse.equinox.p2.repository;bundle-version="[2.3.200,4.0.0)",
  org.eclipse.ui;bundle-version="[3.109.0,4.0.0)",
  org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.forms,
  org.eclipse.core.expressions,
  org.eclipse.core.filebuffers,
  org.eclipse.core.filesystem,
diff --git a/ui/org.eclipse.pde.genericeditor.extension/pom.xml b/ui/org.eclipse.pde.genericeditor.extension/pom.xml
index 9a40d22..8b5d37d 100644
--- a/ui/org.eclipse.pde.genericeditor.extension/pom.xml
+++ b/ui/org.eclipse.pde.genericeditor.extension/pom.xml
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde.ui</groupId>
   <artifactId>org.eclipse.pde.genericeditor.extension</artifactId>
-  <version>1.0.600-SNAPSHOT</version>
+  <version>1.0.700-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/ui/org.eclipse.pde.junit.runtime.tests/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.junit.runtime.tests/META-INF/MANIFEST.MF
index a716b0e..2a1ebec 100644
--- a/ui/org.eclipse.pde.junit.runtime.tests/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde.junit.runtime.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: PDE JUnit Runtime Tests
 Bundle-SymbolicName: org.eclipse.pde.junit.runtime.tests;singleton:=true
-Bundle-Version: 3.5.500.qualifier
+Bundle-Version: 3.5.600.qualifier
 Automatic-Module-Name: org.eclipse.pde.junit.runtime.tests
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: Eclipse.org
diff --git a/ui/org.eclipse.pde.junit.runtime.tests/pom.xml b/ui/org.eclipse.pde.junit.runtime.tests/pom.xml
index 1395232..0c81033 100644
--- a/ui/org.eclipse.pde.junit.runtime.tests/pom.xml
+++ b/ui/org.eclipse.pde.junit.runtime.tests/pom.xml
@@ -20,12 +20,12 @@
 	<parent>
 		<artifactId>tests-pom</artifactId>
 		<groupId>eclipse.pde.ui</groupId>
-		<version>4.14.0-SNAPSHOT</version>
+		<version>4.15.0-SNAPSHOT</version>
 		<relativePath>../../tests-pom/</relativePath>
 	</parent>
 	<groupId>org.eclipse.pde</groupId>
 	<artifactId>org.eclipse.pde.junit.runtime.tests</artifactId>
-	<version>3.5.500-SNAPSHOT</version>
+	<version>3.5.600-SNAPSHOT</version>
 	<packaging>eclipse-test-plugin</packaging>
 	
 	<properties>
diff --git a/ui/org.eclipse.pde.junit.runtime/pom.xml b/ui/org.eclipse.pde.junit.runtime/pom.xml
index 8d69e32..245454c 100644
--- a/ui/org.eclipse.pde.junit.runtime/pom.xml
+++ b/ui/org.eclipse.pde.junit.runtime/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.pde.launching/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.launching/META-INF/MANIFEST.MF
index 0a4889b..1ae49a3 100644
--- a/ui/org.eclipse.pde.launching/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde.launching/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %name
 Bundle-SymbolicName: org.eclipse.pde.launching;singleton:=true
-Bundle-Version: 3.7.800.qualifier
+Bundle-Version: 3.8.100.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-Vendor: %provider-name
 Require-Bundle: org.eclipse.jdt.junit.core;bundle-version="[3.6.0,4.0.0)",
@@ -14,8 +14,7 @@
  org.eclipse.pde.build;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.pde.core;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.jdt.debug;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.filesystem;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)"
+ org.eclipse.core.filesystem;bundle-version="[1.0.0,2.0.0)"
 Bundle-Activator: org.eclipse.pde.internal.launching.PDELaunchingPlugin
 Export-Package: org.eclipse.pde.internal.launching;x-friends:="org.eclipse.pde.ui",
  org.eclipse.pde.internal.launching.launcher;x-friends:="org.eclipse.pde.ui",
diff --git a/ui/org.eclipse.pde.launching/pom.xml b/ui/org.eclipse.pde.launching/pom.xml
index 31905cf..e91ec37 100644
--- a/ui/org.eclipse.pde.launching/pom.xml
+++ b/ui/org.eclipse.pde.launching/pom.xml
@@ -14,12 +14,12 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.launching</artifactId>
-  <version>3.7.800-SNAPSHOT</version>
+  <version>3.8.100-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
     <code.ignoredWarnings>-warn:-deprecation,unavoidableGenericProblems</code.ignoredWarnings>
diff --git a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/BundleLauncherHelper.java b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/BundleLauncherHelper.java
index 3468e42..b33af92 100644
--- a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/BundleLauncherHelper.java
+++ b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/BundleLauncherHelper.java
@@ -43,20 +43,19 @@
 	public static final char VERSION_SEPARATOR = '*';
 
 	public static Map<IPluginModelBase, String> getWorkspaceBundleMap(ILaunchConfiguration configuration) throws CoreException {
-		return getWorkspaceBundleMap(configuration, null, IPDELauncherConstants.WORKSPACE_BUNDLES);
+		return getWorkspaceBundleMap(configuration, null);
 	}
 
 	public static Map<IPluginModelBase, String> getTargetBundleMap(ILaunchConfiguration configuration) throws CoreException {
-		return getTargetBundleMap(configuration, null, IPDELauncherConstants.TARGET_BUNDLES);
+		return getTargetBundleMap(configuration, null);
 	}
 
 	public static Map<IPluginModelBase, String> getMergedBundleMap(ILaunchConfiguration configuration, boolean osgi) throws CoreException {
 		Map<IPluginModelBase, String> map = new LinkedHashMap<>();
 
-		// if we are using the eclipse-based launcher, we need special checks
 		if (!osgi) {
 
-			checkBackwardCompatibility(configuration, true);
+			migrateLaunchConfiguration(configuration);
 
 			if (configuration.getAttribute(IPDELauncherConstants.USE_DEFAULT, true)) {
 				IPluginModelBase[] models = PluginRegistry.getActiveModels();
@@ -65,6 +64,9 @@
 				}
 				return map;
 			}
+
+		} else {
+			migrateOsgiLaunchConfiguration(configuration);
 		}
 
 		if (configuration.getAttribute(IPDELauncherConstants.USE_CUSTOM_FEATURES, false)) {
@@ -205,11 +207,9 @@
 			return map;
 		}
 
-		String workspace = osgi == false ? IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS : IPDELauncherConstants.WORKSPACE_BUNDLES;
-		String target = osgi == false ? IPDELauncherConstants.SELECTED_TARGET_PLUGINS : IPDELauncherConstants.TARGET_BUNDLES;
 		Set<String> set = new HashSet<>();
-		map = getWorkspaceBundleMap(configuration, set, workspace);
-		map.putAll(getTargetBundleMap(configuration, set, target));
+		map = getWorkspaceBundleMap(configuration, set);
+		map.putAll(getTargetBundleMap(configuration, set));
 		return map;
 	}
 
@@ -300,12 +300,10 @@
 		return map.keySet().toArray(new IPluginModelBase[map.size()]);
 	}
 
-	public static Map<IPluginModelBase, String> getWorkspaceBundleMap(ILaunchConfiguration configuration, Set<String> set, String attribute) throws CoreException {
-		String selected = configuration.getAttribute(attribute, ""); //$NON-NLS-1$
+	public static Map<IPluginModelBase, String> getWorkspaceBundleMap(ILaunchConfiguration configuration, Set<String> set) throws CoreException {
+		Set<String> selected = configuration.getAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES, Collections.emptySet());
 		Map<IPluginModelBase, String> map = new LinkedHashMap<>();
-		StringTokenizer tok = new StringTokenizer(selected, ","); //$NON-NLS-1$
-		while (tok.hasMoreTokens()) {
-			String token = tok.nextToken();
+		for (String token : selected) {
 			int index = token.indexOf('@');
 			if (index < 0) { // if no start levels, assume default
 				token = token.concat("@default:default"); //$NON-NLS-1$
@@ -338,7 +336,7 @@
 		}
 
 		if (configuration.getAttribute(IPDELauncherConstants.AUTOMATIC_ADD, true)) {
-			Set<IPluginModelBase> deselectedPlugins = LaunchPluginValidator.parsePlugins(configuration, IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS);
+			Set<IPluginModelBase> deselectedPlugins = LaunchPluginValidator.parsePlugins(configuration, IPDELauncherConstants.DESELECTED_WORKSPACE_BUNDLES);
 			IPluginModelBase[] models = PluginRegistry.getWorkspaceModels();
 			for (int i = 0; i < models.length; i++) {
 				String id = models[i].getPluginBase().getId();
@@ -427,12 +425,10 @@
 
 	}
 
-	public static Map<IPluginModelBase, String> getTargetBundleMap(ILaunchConfiguration configuration, Set<String> set, String attribute) throws CoreException {
-		String selected = configuration.getAttribute(attribute, ""); //$NON-NLS-1$
+	public static Map<IPluginModelBase, String> getTargetBundleMap(ILaunchConfiguration configuration, Set<String> set) throws CoreException {
+		Set<String> selected = configuration.getAttribute(IPDELauncherConstants.SELECTED_TARGET_BUNDLES, Collections.emptySet());
 		Map<IPluginModelBase, String> map = new LinkedHashMap<>();
-		StringTokenizer tok = new StringTokenizer(selected, ","); //$NON-NLS-1$
-		while (tok.hasMoreTokens()) {
-			String token = tok.nextToken();
+		for (String token : selected) {
 			int index = token.indexOf('@');
 			if (index < 0) { // if no start levels, assume default
 				token = token.concat("@default:default"); //$NON-NLS-1$
@@ -488,13 +484,9 @@
 		return buffer.toString();
 	}
 
-	public static void checkBackwardCompatibility(ILaunchConfiguration configuration, boolean save) throws CoreException {
-		ILaunchConfigurationWorkingCopy wc = null;
-		if (configuration.isWorkingCopy()) {
-			wc = (ILaunchConfigurationWorkingCopy) configuration;
-		} else {
-			wc = configuration.getWorkingCopy();
-		}
+	@SuppressWarnings("deprecation")
+	public static void migrateLaunchConfiguration(ILaunchConfiguration configuration) throws CoreException {
+		ILaunchConfigurationWorkingCopy wc = getWorkingCopy(configuration);
 
 		String value = configuration.getAttribute("wsproject", (String) null); //$NON-NLS-1$
 		if (value != null) {
@@ -571,8 +563,43 @@
 			}
 		}
 
-		if (save && (value != null || value2 != null || upgrade))
+		convertToSet(wc, IPDELauncherConstants.SELECTED_TARGET_PLUGINS, IPDELauncherConstants.SELECTED_TARGET_BUNDLES);
+		convertToSet(wc, IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS, IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES);
+		convertToSet(wc, IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS, IPDELauncherConstants.DESELECTED_WORKSPACE_BUNDLES);
+
+		if (wc.isDirty()) {
 			wc.doSave();
+		}
+	}
+
+	private static ILaunchConfigurationWorkingCopy getWorkingCopy(ILaunchConfiguration configuration) throws CoreException {
+		if (configuration.isWorkingCopy()) {
+			return (ILaunchConfigurationWorkingCopy) configuration;
+		}
+		return configuration.getWorkingCopy();
+	}
+
+	@SuppressWarnings("deprecation")
+	public static void migrateOsgiLaunchConfiguration(ILaunchConfiguration configuration) throws CoreException {
+		ILaunchConfigurationWorkingCopy wc = getWorkingCopy(configuration);
+
+		convertToSet(wc, IPDELauncherConstants.WORKSPACE_BUNDLES, IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES);
+		convertToSet(wc, IPDELauncherConstants.TARGET_BUNDLES, IPDELauncherConstants.SELECTED_TARGET_BUNDLES);
+		convertToSet(wc, IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS, IPDELauncherConstants.DESELECTED_WORKSPACE_BUNDLES);
+
+		if (wc.isDirty()) {
+			wc.doSave();
+		}
+	}
+
+	private static void convertToSet(ILaunchConfigurationWorkingCopy wc, String stringAttribute, String listAttribute) throws CoreException {
+		String value = wc.getAttribute(stringAttribute, (String) null);
+		if (value != null) {
+			wc.setAttribute(stringAttribute, (String) null);
+			String[] itemArray = value.split(","); //$NON-NLS-1$
+			Set<String> itemSet = new HashSet<>(Arrays.asList(itemArray));
+			wc.setAttribute(listAttribute, itemSet);
+		}
 	}
 
 	/**
diff --git a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LaunchPluginValidator.java b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LaunchPluginValidator.java
index a340267..c2c4d96 100644
--- a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LaunchPluginValidator.java
+++ b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LaunchPluginValidator.java
@@ -38,7 +38,7 @@
 			return models;
 
 		Collection<IPluginModelBase> result = null;
-		Map<IPluginModelBase, String> bundles = BundleLauncherHelper.getWorkspaceBundleMap(configuration, null, IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS);
+		Map<IPluginModelBase, String> bundles = BundleLauncherHelper.getWorkspaceBundleMap(configuration, null);
 		result = bundles.keySet();
 		return result.toArray(new IPluginModelBase[result.size()]);
 	}
@@ -52,43 +52,42 @@
 	 */
 	public static Set<IPluginModelBase> parsePlugins(ILaunchConfiguration configuration, String attribute) throws CoreException {
 		HashSet<IPluginModelBase> set = new HashSet<>();
-		String ids = configuration.getAttribute(attribute, (String) null);
-		if (ids != null) {
-			String[] entries = ids.split(","); //$NON-NLS-1$
-			Map<String, IPluginModelBase> unmatchedEntries = new HashMap<>();
-			for (int i = 0; i < entries.length; i++) {
-				int index = entries[i].indexOf('@');
-				if (index < 0) { // if no start levels, assume default
-					entries[i] = entries[i].concat("@default:default"); //$NON-NLS-1$
-					index = entries[i].indexOf('@');
-				}
-				String idVersion = entries[i].substring(0, index);
-				int versionIndex = entries[i].indexOf(BundleLauncherHelper.VERSION_SEPARATOR);
-				String id = (versionIndex > 0) ? idVersion.substring(0, versionIndex) : idVersion;
-				String version = (versionIndex > 0) ? idVersion.substring(versionIndex + 1) : null;
-				ModelEntry entry = PluginRegistry.findEntry(id);
-				if (entry != null) {
-					IPluginModelBase matchingModels[] = attribute.equals(IPDELauncherConstants.SELECTED_TARGET_PLUGINS) ? entry.getExternalModels() : entry.getWorkspaceModels();
-					for (IPluginModelBase matchingModel : matchingModels) {
-						if (matchingModel.isEnabled()) {
-							// TODO Very similar logic to BundleLauncherHelper
-							// the logic here is this (see bug 225644)
-							// a) if we come across a bundle that has the right version, immediately add it
-							// b) if there's no version, add it
-							// c) if there's only one instance of that bundle in the list of ids... add it
-							if (version == null || matchingModel.getPluginBase().getVersion().equals(version)) {
-								set.add(matchingModel);
-							} else if (matchingModels.length == 1) {
-								if (unmatchedEntries.remove(id) == null) {
-									unmatchedEntries.put(id, matchingModel);
-								}
+		Map<String, IPluginModelBase> unmatchedEntries = new HashMap<>();
+		Set<String> entries = configuration.getAttribute(attribute, Collections.emptySet());
+
+		for (String token : entries) {
+			int index = token.indexOf('@');
+			if (index < 0) { // if no start levels, assume default
+				token = token.concat("@default:default"); //$NON-NLS-1$
+				index = token.indexOf('@');
+			}
+			String idVersion = token.substring(0, index);
+			int versionIndex = token.indexOf(BundleLauncherHelper.VERSION_SEPARATOR);
+			String id = (versionIndex > 0) ? idVersion.substring(0, versionIndex) : idVersion;
+			String version = (versionIndex > 0) ? idVersion.substring(versionIndex + 1) : null;
+			ModelEntry entry = PluginRegistry.findEntry(id);
+			if (entry != null) {
+				IPluginModelBase matchingModels[] = attribute.equals(IPDELauncherConstants.SELECTED_TARGET_BUNDLES) ? entry.getExternalModels() : entry.getWorkspaceModels();
+				for (IPluginModelBase matchingModel : matchingModels) {
+					if (matchingModel.isEnabled()) {
+						// TODO Very similar logic to BundleLauncherHelper
+						// the logic here is this (see bug 225644)
+						// a) if we come across a bundle that has the right version, immediately add it
+						// b) if there's no version, add it
+						// c) if there's only one instance of that bundle in the list of ids... add it
+						if (version == null || matchingModel.getPluginBase().getVersion().equals(version)) {
+							set.add(matchingModel);
+						} else if (matchingModels.length == 1) {
+							if (unmatchedEntries.remove(id) == null) {
+								unmatchedEntries.put(id, matchingModel);
 							}
 						}
 					}
 				}
 			}
-			set.addAll(unmatchedEntries.values());
 		}
+
+		set.addAll(unmatchedEntries.values());
 		return set;
 	}
 
diff --git a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LauncherUtils.java b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LauncherUtils.java
index 3356172..4640b09 100644
--- a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LauncherUtils.java
+++ b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/internal/launching/launcher/LauncherUtils.java
@@ -265,7 +265,7 @@
 	}
 
 	private static void handleSelectedPlugins(ILaunchConfiguration config, String timeStamp, ArrayList<IProject> projects) throws CoreException {
-		Map<IPluginModelBase, String> selectedPlugins = BundleLauncherHelper.getWorkspaceBundleMap(config, null, IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS);
+		Map<IPluginModelBase, String> selectedPlugins = BundleLauncherHelper.getWorkspaceBundleMap(config, null);
 		Iterator<IPluginModelBase> it = selectedPlugins.keySet().iterator();
 		while (it.hasNext()) {
 			IPluginModelBase model = it.next();
@@ -280,7 +280,7 @@
 	}
 
 	private static void handleDeselectedPlugins(ILaunchConfiguration config, String launcherTimeStamp, ArrayList<IProject> projects) throws CoreException {
-		Map<IPluginModelBase, String> deSelectedPlugins = BundleLauncherHelper.getWorkspaceBundleMap(config, null, IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS);
+		Map<IPluginModelBase, String> deSelectedPlugins = BundleLauncherHelper.getWorkspaceBundleMap(config, null);
 		IProject[] projs = ResourcesPlugin.getWorkspace().getRoot().getProjects();
 		for (int i = 0; i < projs.length; i++) {
 			if (!WorkspaceModelManager.isPluginProject(projs[i]))
diff --git a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/IPDELauncherConstants.java b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/IPDELauncherConstants.java
index a1073da..88a5ad7 100644
--- a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/IPDELauncherConstants.java
+++ b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/IPDELauncherConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2015 IBM Corporation and others.
+ * Copyright (c) 2005, 2019 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -123,30 +123,58 @@
 	 * a comma-separated list of IDs of workspace plug-ins to launch with.
 	 * This value is only used when the Automatic Add option is off.
 	 *
-	 * @see IPDELauncherConstants#AUTOMATIC_ADD
+	 * @deprecated Use {@link IPDELauncherConstants#SELECTED_WORKSPACE_BUNDLES}
 	 */
+	@Deprecated
 	String SELECTED_WORKSPACE_PLUGINS = "selected_workspace_plugins"; //$NON-NLS-1$
 
 	/**
+	 * Launch configuration attribute key. The value is a set specifying
+	 * IDs of workspace bundles to launch with.
+	 * This value is only used when the Automatic Add option is off.
+	 * 
+	 * Each item in the set is of the format:
+	 * &lt;plugin-id&gt;@&lt;start-level&gt;:&lt;auto-start&gt;
+	 * 
+	 * @see IPDELauncherConstants#AUTOMATIC_ADD
+	 * @see IPDELauncherConstants#DEFAULT_AUTO_START
+	 * @see IPDELauncherConstants#DEFAULT_START_LEVEL
+	 * 
+	 * @since 3.8
+	 */
+	String SELECTED_WORKSPACE_BUNDLES = "selected_workspace_bundles"; //$NON-NLS-1$
+
+	/**
 	 * Launch configuration attribute key. The value is a string specifying
 	 * a comma-separated list of IDs of workspace plug-ins that are to be excluded from
 	 * the launch.
 	 * This value is only used when the Automatic Add option is on.
 	 *
-	 * @see IPDELauncherConstants#AUTOMATIC_ADD
+	 * @deprecated Use {@link IPDELauncherConstants#DESELECTED_WORKSPACE_BUNDLES}
 	 */
+	@Deprecated
 	String DESELECTED_WORKSPACE_PLUGINS = "deselected_workspace_plugins"; //$NON-NLS-1$
 
 	/**
+	 * Launch configuration attribute key. The value is a set specifying
+	 * IDs of workspace bundles that are to be excluded from the launch.
+	 * This value is only used when the Automatic Add option is on.
+	 * 
+	 * @see IPDELauncherConstants#AUTOMATIC_ADD
+	 * @since 3.8
+	 */
+	String DESELECTED_WORKSPACE_BUNDLES = "deselected_workspace_bundles"; //$NON-NLS-1$
+
+	/**
 	 * Launch configuration attribute key. The value is a boolean specifying
 	 * whether workspace plug-in created after the creation of a launch configuration
 	 * should be added to the list of plug-ins to launch with.
 	 *
-	 * If the value is <code>true</code>, then DESELECTED_WORKSPACE_PLUGINS should be used.
-	 * Otherwise, SELECTED_WORKSPACE_PLUGINS should be used.
+	 * If the value is <code>true</code>, then DESELECTED_WORKSPACE_BUNDLES should be used.
+	 * Otherwise, SELECTED_WORKSPACE_BUNDLES should be used.
 	 *
-	 * @see IPDELauncherConstants#DESELECTED_WORKSPACE_PLUGINS
-	 * @see IPDELauncherConstants#SELECTED_WORKSPACE_PLUGINS
+	 * @see IPDELauncherConstants#DESELECTED_WORKSPACE_BUNDLES
+	 * @see IPDELauncherConstants#SELECTED_WORKSPACE_BUNDLES
 	 */
 	String AUTOMATIC_ADD = "automaticAdd"; //$NON-NLS-1$
 
@@ -163,10 +191,27 @@
 	 * Launch configuration attribute key. The value is a string specifying
 	 * a comma-separated list of IDs of target platform plug-ins to launch with.
 	 * This value is only used when the Automatic Add option is off.
+	 * 
+	 * @deprecated Use {@link IPDELauncherConstants#SELECTED_TARGET_BUNDLES}
 	 */
+	@Deprecated
 	String SELECTED_TARGET_PLUGINS = "selected_target_plugins"; //$NON-NLS-1$
 
 	/**
+	 * Launch configuration attribute key. The value is a set specifying
+	 * the IDs of non-workspace bundles to launch with.
+	 * This value is only used when the Automatic Add option is off.
+	 * 
+	 * Each item in the set is of the format:
+	 * &lt;plugin-id&gt;@&lt;start-level&gt;:&lt;auto-start&gt;
+	 * 
+	 * @see IPDELauncherConstants#DEFAULT_AUTO_START
+	 * @see IPDELauncherConstants#DEFAULT_START_LEVEL
+	 * @since 3.8
+	 */
+	String SELECTED_TARGET_BUNDLES = "selected_target_bundles"; //$NON-NLS-1$
+
+	/**
 	 * Launch configuration attribute key. The value is a boolean indicating
 	 * whether the computation of required plug-ins on the Plug-ins tab should include
 	 * the traversal of optional dependencies.
@@ -297,9 +342,9 @@
 	 * Each token in the list is of the format:
 	 * &lt;plugin-id&gt;@&lt;start-level&gt;:&lt;auto-start&gt;
 	 *
-	 * @see IPDELauncherConstants#DEFAULT_AUTO_START
-	 * @see IPDELauncherConstants#DEFAULT_START_LEVEL
+	 * @deprecated Use {@link IPDELauncherConstants#SELECTED_WORKSPACE_BUNDLES}
 	 */
+	@Deprecated
 	String WORKSPACE_BUNDLES = "workspace_bundles"; //$NON-NLS-1$
 
 	/**
@@ -309,9 +354,9 @@
 	 * Each token in the list is of the format:
 	 * &lt;plugin-id&gt;@&lt;start-level&gt;:&lt;auto-start&gt;
 	 *
-	 * @see IPDELauncherConstants#DEFAULT_AUTO_START
-	 * @see IPDELauncherConstants#DEFAULT_START_LEVEL
+	 * @deprecated Use {@link IPDELauncherConstants#SELECTED_TARGET_BUNDLES}
 	 */
+	@Deprecated
 	String TARGET_BUNDLES = "target_bundles"; //$NON-NLS-1$
 
 	/**
diff --git a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/OSGiLaunchConfigurationInitializer.java b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/OSGiLaunchConfigurationInitializer.java
index 2841c21..71cc1f0 100644
--- a/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/OSGiLaunchConfigurationInitializer.java
+++ b/ui/org.eclipse.pde.launching/src/org/eclipse/pde/launching/OSGiLaunchConfigurationInitializer.java
@@ -13,6 +13,8 @@
  *******************************************************************************/
 package org.eclipse.pde.launching;
 
+import java.util.HashSet;
+import java.util.Set;
 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
 import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
@@ -75,24 +77,22 @@
 	 * 			the launch configuration
 	 */
 	protected void initializeBundleState(ILaunchConfigurationWorkingCopy configuration) {
-		StringBuilder explugins = new StringBuilder();
-		StringBuilder wsplugins = new StringBuilder();
+		Set<String> targetBundles = new HashSet<>();
+		Set<String> workspaceBundles = new HashSet<>();
 		IPluginModelBase[] models = PluginRegistry.getActiveModels();
 		for (IPluginModelBase model : models) {
 			boolean inWorkspace = model.getUnderlyingResource() != null;
-			appendBundle(inWorkspace ? wsplugins : explugins, model);
+			appendBundle(inWorkspace ? workspaceBundles : targetBundles, model);
 		}
-		configuration.setAttribute(IPDELauncherConstants.WORKSPACE_BUNDLES, wsplugins.toString());
-		configuration.setAttribute(IPDELauncherConstants.TARGET_BUNDLES, explugins.toString());
+		configuration.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES, workspaceBundles);
+		configuration.setAttribute(IPDELauncherConstants.SELECTED_TARGET_BUNDLES, targetBundles);
 		configuration.setAttribute(IPDELauncherConstants.AUTOMATIC_ADD, true);
 	}
 
-	private void appendBundle(StringBuilder buffer, IPluginModelBase model) {
-		if (buffer.length() > 0)
-			buffer.append(","); //$NON-NLS-1$
+	private void appendBundle(Set<String> bundleSet, IPluginModelBase model) {
 		String id = model.getPluginBase().getId();
 		String value = BundleLauncherHelper.writeBundleEntry(model, getStartLevel(id), getAutoStart(id));
-		buffer.append(value);
+		bundleSet.add(value);
 	}
 
 	/**
diff --git a/ui/org.eclipse.pde.runtime/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.runtime/META-INF/MANIFEST.MF
index 9a7269c..cf77548 100644
--- a/ui/org.eclipse.pde.runtime/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde.runtime/META-INF/MANIFEST.MF
@@ -2,19 +2,14 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %name
 Bundle-SymbolicName: org.eclipse.pde.runtime; singleton:=true
-Bundle-Version: 3.6.700.qualifier
+Bundle-Version: 3.6.800.qualifier
 Bundle-Activator: org.eclipse.pde.internal.runtime.PDERuntimePlugin
 Bundle-Vendor: %provider-name
 Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.databinding;bundle-version="1.6.0",
- org.eclipse.core.databinding.observable;bundle-version="1.6.0",
- org.eclipse.core.databinding.property;bundle-version="1.6.0",
- org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.ui;bundle-version="[3.3.0,4.0.0)",
  org.eclipse.ui.forms;bundle-version="[3.3.0,4.0.0)",
- org.eclipse.jdt.annotation;bundle-version="2.1.0";resolution:=optional,
  org.eclipse.jdt.core;bundle-version="[3.3.0,4.0.0)";resolution:=optional,
- org.eclipse.jface.databinding;bundle-version="1.8.0",
  org.eclipse.core.resources;bundle-version="[3.3.0,4.0.0)";resolution:=optional,
  org.eclipse.jdt.ui;bundle-version="[3.3.0,4.0.0)";resolution:=optional,
  org.eclipse.pde.ui;bundle-version="[3.3.0,4.0.0)";resolution:=optional,
diff --git a/ui/org.eclipse.pde.runtime/pom.xml b/ui/org.eclipse.pde.runtime/pom.xml
index 4fded0e..37eb0fc 100644
--- a/ui/org.eclipse.pde.runtime/pom.xml
+++ b/ui/org.eclipse.pde.runtime/pom.xml
@@ -15,12 +15,12 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.runtime</artifactId>
-  <version>3.6.700-SNAPSHOT</version>
+  <version>3.6.800-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <properties>
diff --git a/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/registry/RegistryBrowser.java b/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/registry/RegistryBrowser.java
index e58a934..e9060ea 100644
--- a/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/registry/RegistryBrowser.java
+++ b/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/registry/RegistryBrowser.java
@@ -259,6 +259,7 @@
 		fTreeViewer.setLabelProvider(fLabelProvider);
 		fTreeViewer.setUseHashlookup(true);
 		fTreeViewer.setComparator(new ViewerComparator() {
+			@SuppressWarnings({ "rawtypes", "unchecked" })
 			@Override
 			public int compare(Viewer viewer, Object e1, Object e2) {
 				// let Comparables compare themselves
diff --git a/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/spy/sections/ActivePartSection.java b/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/spy/sections/ActivePartSection.java
index cea7ef6..2bf433b 100644
--- a/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/spy/sections/ActivePartSection.java
+++ b/ui/org.eclipse.pde.runtime/src/org/eclipse/pde/internal/runtime/spy/sections/ActivePartSection.java
@@ -86,11 +86,12 @@
 			Class<?> clazz = site.getClass().getSuperclass();
 			Field field = clazz.getDeclaredField("menuExtenders"); //$NON-NLS-1$
 			field.setAccessible(true);
-			List list = (List) field.get(site);
+			@SuppressWarnings("unchecked")
+			List<PopupMenuExtender> list = (List<PopupMenuExtender>) field.get(site);
 			if (list != null && !list.isEmpty()) {
 				Set<String> menuIds = new LinkedHashSet<>();
 				for (int i = 0; i < list.size(); i++) {
-					PopupMenuExtender extender = (PopupMenuExtender) list.get(i);
+					PopupMenuExtender extender = list.get(i);
 					menuIds.addAll(extender.getMenuIds());
 				}
 				buffer.append("<p>"); //$NON-NLS-1$
diff --git a/ui/org.eclipse.pde.ui.templates.tests/pom.xml b/ui/org.eclipse.pde.ui.templates.tests/pom.xml
index 558891c..aafcb1d 100644
--- a/ui/org.eclipse.pde.ui.templates.tests/pom.xml
+++ b/ui/org.eclipse.pde.ui.templates.tests/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.pde.ui.templates/pom.xml b/ui/org.eclipse.pde.ui.templates/pom.xml
index 9dabcd8..f6016a3 100644
--- a/ui/org.eclipse.pde.ui.templates/pom.xml
+++ b/ui/org.eclipse.pde.ui.templates/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.pde.ui.tests.smartimport/pom.xml b/ui/org.eclipse.pde.ui.tests.smartimport/pom.xml
index ace2719..8f3fb22 100644
--- a/ui/org.eclipse.pde.ui.tests.smartimport/pom.xml
+++ b/ui/org.eclipse.pde.ui.tests.smartimport/pom.xml
@@ -11,7 +11,7 @@
 	<parent>
 		<artifactId>tests-pom</artifactId>
 		<groupId>eclipse.pde.ui</groupId>
-		<version>4.14.0-SNAPSHOT</version>
+		<version>4.15.0-SNAPSHOT</version>
 		<relativePath>../../tests-pom/</relativePath>
 	</parent>
 	<groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.pde.ui.tests/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/META-INF/MANIFEST.MF
index c24f3f8..0a071ed5f 100644
--- a/ui/org.eclipse.pde.ui.tests/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde.ui.tests/META-INF/MANIFEST.MF
@@ -40,7 +40,8 @@
  org.eclipse.ui.views.log,
  org.eclipse.debug.core,
  org.eclipse.pde.genericeditor.extension,
- org.eclipse.equinox.simpleconfigurator.manipulator;bundle-version="2.1.300"
+ org.eclipse.equinox.simpleconfigurator.manipulator;bundle-version="2.1.300",
+ org.hamcrest.library;bundle-version="1.3.0"
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Eclipse-BundleShape: dir
diff --git a/ui/org.eclipse.pde.ui.tests/pom.xml b/ui/org.eclipse.pde.ui.tests/pom.xml
index 0dccbf1..10d84d0 100644
--- a/ui/org.eclipse.pde.ui.tests/pom.xml
+++ b/ui/org.eclipse.pde.ui.tests/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDEMinimalTests.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDEMinimalTests.java
index 113c674..5980b32 100644
--- a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDEMinimalTests.java
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDEMinimalTests.java
@@ -43,7 +43,8 @@
 	AllPDERuntimeTests.class,
 	// ExportBundleTests.class,
 	AllLauncherTests.class, AllLogViewTests.class, ProjectCreationTests.class, BundleRootTests.class,
-		PluginRegistryTestsMinimal.class, ClasspathResolverTest.class, PDESchemaHelperTest.class
+	PluginRegistryTestsMinimal.class, ClasspathResolverTest.class, PDESchemaHelperTest.class,
+	DynamicPluginProjectReferencesTest.class
 	// ClasspathContributorTest.class
 })
 public class AllPDEMinimalTests {
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDETests.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDETests.java
index dc3d154..78fd7d6 100644
--- a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDETests.java
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/AllPDETests.java
@@ -50,7 +50,8 @@
 	BundleRootTests.class,
 	PluginRegistryTests.class,
 	ClasspathResolverTest.class,
-	ClasspathContributorTest.class
+	ClasspathContributorTest.class,
+	DynamicPluginProjectReferencesTest.class
 })
 public class AllPDETests {
 
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/AbstractLaunchTest.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/AbstractLaunchTest.java
new file mode 100644
index 0000000..98f8184
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/AbstractLaunchTest.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ *  Copyright (c) 2019 Julian Honnen
+ *
+ *  This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *     Julian Honnen <julian.honnen@vector.com> - initial API and implementation
+ *     Andras Peteri <apeteri@b2international.com> - extracted common superclass
+ *******************************************************************************/
+package org.eclipse.pde.ui.tests.launcher;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.debug.core.*;
+import org.eclipse.pde.ui.tests.util.TargetPlatformUtil;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
+
+public abstract class AbstractLaunchTest {
+
+	private IProject project;
+
+	@BeforeClass
+	public static void setupTargetPlatform() throws Exception {
+		TargetPlatformUtil.setRunningPlatformAsTarget();
+	}
+
+	@Before
+	public void setupLaunchConfigurations() throws Exception {
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		project = workspace.getRoot().getProject(getClass().getSimpleName());
+		if (project.exists()) {
+			project.delete(true, null);
+		}
+
+		project.create(null);
+		project.open(null);
+		Bundle bundle = FrameworkUtil.getBundle(getClass());
+		ArrayList<URL> resources = Collections.list(bundle.findEntries("tests/launch", "*", false));
+		for (URL url : resources) {
+			Path path = Paths.get(FileLocator.toFileURL(url).toURI());
+			IFile file = project.getFile(path.getFileName().toString());
+			try (InputStream in = url.openStream()) {
+				file.create(in, true, null);
+			}
+		}
+	}
+
+	protected ILaunchConfiguration getLaunchConfiguration(String name) {
+		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
+		return launchManager.getLaunchConfiguration(project.getFile(name));
+	}
+}
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/AllLauncherTests.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/AllLauncherTests.java
index 084af7c..770cede 100644
--- a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/AllLauncherTests.java
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/AllLauncherTests.java
@@ -21,7 +21,8 @@
  * @since 3.5
  */
 @RunWith(Suite.class)
-@SuiteClasses({ FeatureBasedLaunchTest.class, LaunchConfigurationHelperTestCase.class })
+@SuiteClasses({ FeatureBasedLaunchTest.class, LaunchConfigurationHelperTestCase.class,
+		LaunchConfigurationMigrationTest.class })
 public class AllLauncherTests {
 
 }
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/FeatureBasedLaunchTest.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/FeatureBasedLaunchTest.java
index 9325221..a7e7d36 100644
--- a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/FeatureBasedLaunchTest.java
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/FeatureBasedLaunchTest.java
@@ -10,6 +10,7 @@
  *
  *  Contributors:
  *     Julian Honnen <julian.honnen@vector.com> - initial API and implementation
+ *     Andras Peteri <apeteri@b2international.com> - extracted common superclass
  *******************************************************************************/
 package org.eclipse.pde.ui.tests.launcher;
 
@@ -17,55 +18,22 @@
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsEqual.equalTo;
 
-import java.io.InputStream;
-import java.net.URL;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.*;
+import java.util.Map;
 import junit.framework.AssertionFailedError;
-import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.debug.core.*;
+import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
 import org.eclipse.pde.internal.launching.launcher.BundleLauncherHelper;
-import org.eclipse.pde.ui.tests.util.TargetPlatformUtil;
-import org.junit.*;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.FrameworkUtil;
+import org.junit.Before;
+import org.junit.Test;
 
-public class FeatureBasedLaunchTest {
+public class FeatureBasedLaunchTest extends AbstractLaunchTest {
 
 	private ILaunchConfiguration fFeatureBasedWithStartLevels;
 
-	@BeforeClass
-	public static void setupTargetPlatform() throws Exception {
-		TargetPlatformUtil.setRunningPlatformAsTarget();
-	}
-
 	@Before
 	public void setupLaunchConfig() throws Exception {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IProject project = workspace.getRoot().getProject(getClass().getSimpleName());
-		if (project.exists()) {
-			project.delete(true, null);
-		}
-
-		project.create(null);
-		project.open(null);
-		Bundle bundle = FrameworkUtil.getBundle(getClass());
-		ArrayList<URL> resources = Collections.list(bundle.findEntries("tests/launch", "*", false));
-		for (URL url : resources) {
-			Path path = Paths.get(FileLocator.toFileURL(url).toURI());
-			IFile file = project.getFile(path.getFileName().toString());
-			try (InputStream in = url.openStream()) {
-				file.create(in, true, null);
-			}
-		}
-
-		ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
-		fFeatureBasedWithStartLevels = launchManager
-				.getLaunchConfiguration(project.getFile("feature-based-with-startlevels.launch"));
+		fFeatureBasedWithStartLevels = getLaunchConfiguration("feature-based-with-startlevels.launch");
 	}
 
 	@Test
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/LaunchConfigurationMigrationTest.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/LaunchConfigurationMigrationTest.java
new file mode 100644
index 0000000..3a35bdc
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/launcher/LaunchConfigurationMigrationTest.java
@@ -0,0 +1,135 @@
+/**************************************************************************************
+ *  Copyright (c) 2019 Andras Peteri
+ *
+ *  This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *     Andras Peteri <apeteri@b2international.com> - initial API and implementation
+ **************************************************************************************/
+package org.eclipse.pde.ui.tests.launcher;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Map;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.pde.core.plugin.*;
+import org.eclipse.pde.core.project.IBundleProjectDescription;
+import org.eclipse.pde.internal.launching.launcher.BundleLauncherHelper;
+import org.eclipse.pde.launching.IPDELauncherConstants;
+import org.eclipse.pde.ui.tests.project.ProjectCreationTests;
+import org.junit.Before;
+import org.junit.Test;
+
+public class LaunchConfigurationMigrationTest extends AbstractLaunchTest {
+
+	@Before
+	public void setupPluginProjects() throws Exception {
+		createProject("org.eclipse.pde.plugin1");
+		createProject("org.eclipse.pde.plugin2");
+	}
+
+	private void createProject(String bundleName) throws CoreException {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(bundleName);
+		if (project.exists()) {
+			project.delete(true, null);
+		}
+
+		IBundleProjectDescription description = ProjectCreationTests.getBundleProjectService().getDescription(project);
+		description.setSymbolicName(project.getName());
+		description.apply(null);
+	}
+
+	@Test
+	public void testPluginBasedWithoutAutomaticAdd() throws Exception {
+		ILaunchConfiguration configuration = getLaunchConfiguration("plugin-based-without-automatic-add.launch");
+
+		ILaunchConfigurationWorkingCopy wc = configuration.getWorkingCopy();
+		BundleLauncherHelper.migrateLaunchConfiguration(wc);
+
+		assertOldPropertiesRemoved(wc);
+
+		Map<IPluginModelBase, String> workspaceBundles = BundleLauncherHelper.getWorkspaceBundleMap(wc);
+		assertEquals("default:true", workspaceBundles.get(findWorkspaceModel("org.eclipse.pde.plugin1")));
+		assertEquals("3:false", workspaceBundles.get(findWorkspaceModel("org.eclipse.pde.plugin2")));
+
+		Map<IPluginModelBase, String> targetBundles = BundleLauncherHelper.getTargetBundleMap(wc);
+		assertEquals("default:true", targetBundles.get(findTargetModel("org.eclipse.core.runtime")));
+		assertEquals("2:false", targetBundles.get(findTargetModel("org.eclipse.ui")));
+	}
+
+	@Test
+	public void testPluginBasedWithAutomaticAdd() throws Exception {
+		ILaunchConfiguration configuration = getLaunchConfiguration("plugin-based-with-automatic-add.launch");
+
+		ILaunchConfigurationWorkingCopy wc = configuration.getWorkingCopy();
+		BundleLauncherHelper.migrateLaunchConfiguration(wc);
+
+		assertOldPropertiesRemoved(wc);
+
+		Map<IPluginModelBase, String> workspaceBundles = BundleLauncherHelper.getWorkspaceBundleMap(wc);
+		assertEquals("default:default", workspaceBundles.get(findWorkspaceModel("org.eclipse.pde.plugin1")));
+
+		Map<IPluginModelBase, String> targetBundles = BundleLauncherHelper.getTargetBundleMap(wc);
+		assertEquals("default:true", targetBundles.get(findTargetModel("org.eclipse.core.runtime")));
+		assertEquals("2:false", targetBundles.get(findTargetModel("org.eclipse.ui")));
+	}
+
+	@Test
+	public void testBundleBased() throws Exception {
+		ILaunchConfiguration configuration = getLaunchConfiguration("bundle-based.launch");
+
+		ILaunchConfigurationWorkingCopy wc = configuration.getWorkingCopy();
+		BundleLauncherHelper.migrateOsgiLaunchConfiguration(wc);
+
+		assertOldOsgiPropertiesRemoved(wc);
+
+		Map<IPluginModelBase, String> workspaceBundles = BundleLauncherHelper.getWorkspaceBundleMap(wc);
+		assertEquals("default:true", workspaceBundles.get(findWorkspaceModel("org.eclipse.pde.plugin1")));
+		assertEquals("3:false", workspaceBundles.get(findWorkspaceModel("org.eclipse.pde.plugin2")));
+
+		Map<IPluginModelBase, String> targetBundles = BundleLauncherHelper.getTargetBundleMap(wc);
+		assertEquals("default:true", targetBundles.get(findTargetModel("org.eclipse.core.runtime")));
+		assertEquals("2:false", targetBundles.get(findTargetModel("org.eclipse.ui")));
+	}
+
+	@SuppressWarnings("deprecation")
+	private void assertOldPropertiesRemoved(ILaunchConfigurationWorkingCopy wc) throws CoreException {
+		assertFalse("selected_workspace_plugins should not be present",
+				wc.hasAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS));
+		assertFalse("selected_target_plugins should not be present",
+				wc.hasAttribute(IPDELauncherConstants.SELECTED_TARGET_PLUGINS));
+	}
+
+	@SuppressWarnings("deprecation")
+	private void assertOldOsgiPropertiesRemoved(ILaunchConfigurationWorkingCopy wc) throws CoreException {
+		assertFalse("workspace_bundles should not be present",
+				wc.hasAttribute(IPDELauncherConstants.WORKSPACE_BUNDLES));
+		assertFalse("target_bundles should not be present", wc.hasAttribute(IPDELauncherConstants.TARGET_BUNDLES));
+	}
+
+	private IPluginModelBase findWorkspaceModel(String id) {
+		ModelEntry entry = PluginRegistry.findEntry(id);
+		assertNotNull("entry '" + id + "' should be present in PluginRegistry", entry);
+		assertTrue("entry '" + id + "' should have workspace models", entry.hasWorkspaceModels());
+		return entry.getWorkspaceModels()[0];
+	}
+
+	private IPluginModelBase findTargetModel(String id) {
+		ModelEntry entry = PluginRegistry.findEntry(id);
+		assertNotNull("entry '" + id + "' should be present in PluginRegistry", entry);
+		assertTrue("entry '" + id + "' should have external models", entry.hasExternalModels());
+		return entry.getExternalModels()[0];
+	}
+}
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/project/DynamicPluginProjectReferencesTest.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/project/DynamicPluginProjectReferencesTest.java
new file mode 100644
index 0000000..7ac49aa
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/project/DynamicPluginProjectReferencesTest.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ *  Copyright (c) 2019 Julian Honnen
+ *
+ *  This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License 2.0
+ *  which accompanies this distribution, and is available at
+ *  https://www.eclipse.org/legal/epl-2.0/
+ *
+ *  SPDX-License-Identifier: EPL-2.0
+ *
+ *  Contributors:
+ *     Julian Honnen <julian.honnen@vector.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.pde.ui.tests.project;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.emptyArray;
+import static org.hamcrest.Matchers.is;
+
+import java.io.IOException;
+import java.util.Arrays;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.plugin.PluginRegistry;
+import org.eclipse.pde.internal.ui.wizards.imports.PluginImportOperation;
+import org.eclipse.pde.ui.tests.util.ProjectUtils;
+import org.junit.*;
+
+public class DynamicPluginProjectReferencesTest {
+
+	@After
+	public void clearWorkspace() throws Exception {
+		for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
+			project.delete(false, true, null);
+		}
+	}
+
+	@Test
+	public void testFragmentHost_required() throws Exception {
+		checkHostToFragmentDependencies("required");
+	}
+
+	@Test
+	public void testFragmentHost_imported() throws Exception {
+		checkHostToFragmentDependencies("imported");
+	}
+
+	private void checkHostToFragmentDependencies(String type) throws IOException, CoreException {
+		IProject host = ProjectUtils.importTestProject("tests/projects/host-fragment-" + type + "/bundle");
+		ProjectUtils.importTestProject("tests/projects/host-fragment-" + type + "/testfragment");
+		ProjectUtils.importTestProject("tests/projects/host-fragment-" + type + "/testframework");
+
+		IBuildConfiguration[] referenced = host.getReferencedBuildConfigs(host.getActiveBuildConfig().getName(), false);
+		assertThat(referenced, is(emptyArray()));
+	}
+
+	@Test
+	public void testHopViaTargetPlatform_required() throws Exception {
+		IPluginModelBase osgiModel = PluginRegistry.findModel("org.eclipse.osgi");
+		IPluginModelBase coreCommandsModel = PluginRegistry.findModel("org.eclipse.core.commands");
+
+		PluginImportOperation operation = new PluginImportOperation(
+				new IPluginModelBase[] { osgiModel, coreCommandsModel }, PluginImportOperation.IMPORT_BINARY, false);
+		operation.schedule();
+		operation.join();
+
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IProject coreCommandsProject = root.getProject(coreCommandsModel.getPluginBase().getId());
+		IProject osgiProject = root.getProject(osgiModel.getPluginBase().getId());
+
+		IBuildConfiguration[] referencedBuildConfigs = coreCommandsProject
+				.getReferencedBuildConfigs(coreCommandsProject.getActiveBuildConfig().getName(), false);
+		for (IBuildConfiguration reference : referencedBuildConfigs) {
+			if (reference.getProject() == osgiProject)
+				return;
+		}
+
+		Assert.fail("references should include local osgi project: " + Arrays.toString(referencedBuildConfigs));
+	}
+
+	@Test
+	public void testHopViaTargetPlatform_imported() throws Exception {
+		IPluginModelBase osgiModel = PluginRegistry.findModel("org.eclipse.osgi");
+
+		PluginImportOperation operation = new PluginImportOperation(new IPluginModelBase[] { osgiModel },
+				PluginImportOperation.IMPORT_BINARY, false);
+		operation.schedule();
+		operation.join();
+
+		IProject importingTargetBundle = ProjectUtils.importTestProject("tests/projects/importing.targetbundle");
+
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IProject osgiProject = root.getProject(osgiModel.getPluginBase().getId());
+
+		IBuildConfiguration[] referencedBuildConfigs = importingTargetBundle
+				.getReferencedBuildConfigs(importingTargetBundle.getActiveBuildConfig().getName(), false);
+		for (IBuildConfiguration reference : referencedBuildConfigs) {
+			if (reference.getProject() == osgiProject)
+				return;
+		}
+
+		Assert.fail("references should include local osgi project: " + Arrays.toString(referencedBuildConfigs));
+	}
+
+	@Test
+	public void testIgnoreCapabilities() throws Exception {
+		ProjectUtils.importTestProject("tests/projects/capabilities/capabilities.provider");
+		IProject consumer = ProjectUtils.importTestProject("tests/projects/capabilities/capabilities.consumer");
+
+		IBuildConfiguration[] referenced = consumer.getReferencedBuildConfigs(consumer.getActiveBuildConfig().getName(),
+				false);
+		assertThat(referenced, is(emptyArray()));
+	}
+
+}
diff --git a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/util/ProjectUtils.java b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/util/ProjectUtils.java
index 209b75d..0a1b088 100644
--- a/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/util/ProjectUtils.java
+++ b/ui/org.eclipse.pde.ui.tests/src/org/eclipse/pde/ui/tests/util/ProjectUtils.java
@@ -13,8 +13,9 @@
  *******************************************************************************/
 package org.eclipse.pde.ui.tests.util;
 
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
+import java.io.IOException;
+import java.net.URL;
+import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
@@ -26,6 +27,7 @@
 import org.eclipse.pde.ui.templates.AbstractNewPluginTemplateWizard;
 import org.eclipse.pde.ui.templates.ITemplateSection;
 import org.eclipse.pde.ui.tests.runtime.TestUtils;
+import org.osgi.framework.FrameworkUtil;
 
 /**
  * Utility class for project related operations
@@ -41,6 +43,7 @@
 		TestProjectProvider(String projectName) {
 			fProjectName = projectName;
 		}
+
 		@Override
 		public IPath getLocationPath() {
 			return ResourcesPlugin.getWorkspace().getRoot().getLocation();
@@ -90,7 +93,9 @@
 	 * Create a plugin project with the given name and execution environment.
 	 *
 	 * @param projectName
-	 * @param env environment for build path or <code>null</code> if default system JRE
+	 * @param env
+	 *            environment for build path or <code>null</code> if default
+	 *            system JRE
 	 * @return a new plugin project
 	 * @throws CoreException
 	 */
@@ -125,5 +130,21 @@
 		return javaProject;
 	}
 
+	public static IProject importTestProject(String path) throws IOException, CoreException {
+		URL entry = FileLocator.toFileURL(FrameworkUtil.getBundle(ProjectUtils.class).getEntry(path));
+		if (entry == null) {
+			throw new IllegalArgumentException(path + " does not exist");
+		}
+		Path src = new Path(entry.getPath());
+
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IProjectDescription projectDescription = ResourcesPlugin.getWorkspace()
+				.loadProjectDescription(src.append(IProjectDescription.DESCRIPTION_FILE_NAME));
+		IProject project = root.getProject(projectDescription.getName());
+		project.create(projectDescription, null);
+		project.open(null);
+
+		return project;
+	}
 
 }
diff --git a/ui/org.eclipse.pde.ui.tests/tests/launch/bundle-based.launch b/ui/org.eclipse.pde.ui.tests/tests/launch/bundle-based.launch
new file mode 100644
index 0000000..b1d1a3f
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/launch/bundle-based.launch
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+    <booleanAttribute key="append.args" value="true"/>
+    <booleanAttribute key="automaticAdd" value="false"/>
+    <booleanAttribute key="automaticValidate" value="true"/>
+    <stringAttribute key="bootstrap" value=""/>
+    <stringAttribute key="checked" value="[NONE]"/>
+    <booleanAttribute key="clearConfig" value="true"/>
+    <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/bundle-based"/>
+    <booleanAttribute key="default" value="true"/>
+    <booleanAttribute key="default_auto_start" value="true"/>
+    <intAttribute key="default_start_level" value="4"/>
+    <booleanAttribute key="includeOptional" value="true"/>
+    <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+    <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+    <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>
+    <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+    <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true"/>
+    <stringAttribute key="pde.version" value="3.3"/>
+    <booleanAttribute key="show_selected_only" value="false"/>
+    <stringAttribute key="target_bundles" value="org.eclipse.core.runtime@default:true,org.eclipse.ui@2:false"/>
+    <booleanAttribute key="tracing" value="false"/>
+    <booleanAttribute key="useCustomFeatures" value="false"/>
+    <booleanAttribute key="useDefaultConfigArea" value="true"/>
+    <stringAttribute key="workspace_bundles" value="org.eclipse.pde.plugin1@default:true,org.eclipse.pde.plugin2@3:false"/>
+</launchConfiguration>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/launch/plugin-based-with-automatic-add.launch b/ui/org.eclipse.pde.ui.tests/tests/launch/plugin-based-with-automatic-add.launch
new file mode 100644
index 0000000..31063da
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/launch/plugin-based-with-automatic-add.launch
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+	<booleanAttribute key="append.args" value="true" />
+	<booleanAttribute key="askclear" value="true" />
+	<booleanAttribute key="automaticAdd" value="true" />
+	<booleanAttribute key="automaticValidate" value="true" />
+	<stringAttribute key="bootstrap" value="" />
+	<stringAttribute key="checked" value="[NONE]" />
+	<booleanAttribute key="clearConfig" value="true" />
+	<booleanAttribute key="clearws" value="false" />
+	<booleanAttribute key="clearwslog" value="false" />
+	<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/plugin-based-without-automatic-add" />
+	<booleanAttribute key="default" value="false" />
+	<setAttribute key="deselected_workspace_bundles" />
+	<booleanAttribute key="includeOptional" value="true" />
+	<stringAttribute key="location"	value="${workspace_loc}\_Workspaces\runtime-plugin-based-without-automatic-add" />
+	<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true" />
+	<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" />
+	<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog" />
+	<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider" />
+	<stringAttribute key="pde.version" value="3.3" />
+	<stringAttribute key="product" value="org.eclipse.platform.ide" />
+	<stringAttribute key="selected_target_plugins" value="org.eclipse.core.runtime@default:true,org.eclipse.ui@2:false" />
+	<stringAttribute key="deselected_workspace_plugins" value="org.eclipse.pde.plugin2" />
+	<booleanAttribute key="show_selected_only" value="false" />
+	<stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini" />
+	<booleanAttribute key="tracing" value="false" />
+	<booleanAttribute key="useCustomFeatures" value="false" />
+	<booleanAttribute key="useDefaultConfig" value="true" />
+	<booleanAttribute key="useDefaultConfigArea" value="true" />
+	<booleanAttribute key="useProduct" value="true" />
+</launchConfiguration>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/launch/plugin-based-without-automatic-add.launch b/ui/org.eclipse.pde.ui.tests/tests/launch/plugin-based-without-automatic-add.launch
new file mode 100644
index 0000000..561284c
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/launch/plugin-based-without-automatic-add.launch
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+	<booleanAttribute key="append.args" value="true" />
+	<booleanAttribute key="askclear" value="true" />
+	<booleanAttribute key="automaticAdd" value="false" />
+	<booleanAttribute key="automaticValidate" value="true" />
+	<stringAttribute key="bootstrap" value="" />
+	<stringAttribute key="checked" value="[NONE]" />
+	<booleanAttribute key="clearConfig" value="true" />
+	<booleanAttribute key="clearws" value="false" />
+	<booleanAttribute key="clearwslog" value="false" />
+	<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/plugin-based-without-automatic-add" />
+	<booleanAttribute key="default" value="false" />
+	<setAttribute key="deselected_workspace_bundles" />
+	<booleanAttribute key="includeOptional" value="true" />
+	<stringAttribute key="location"	value="${workspace_loc}\_Workspaces\runtime-plugin-based-without-automatic-add" />
+	<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true" />
+	<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8" />
+	<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog" />
+	<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider" />
+	<stringAttribute key="pde.version" value="3.3" />
+	<stringAttribute key="product" value="org.eclipse.platform.ide" />
+	<stringAttribute key="selected_target_plugins" value="org.eclipse.core.runtime@default:true,org.eclipse.ui@2:false" />
+	<stringAttribute key="selected_workspace_plugins" value="org.eclipse.pde.plugin1@default:true,org.eclipse.pde.plugin2@3:false" />
+	<booleanAttribute key="show_selected_only" value="false" />
+	<stringAttribute key="templateConfig" value="${target_home}\configuration\config.ini" />
+	<booleanAttribute key="tracing" value="false" />
+	<booleanAttribute key="useCustomFeatures" value="false" />
+	<booleanAttribute key="useDefaultConfig" value="true" />
+	<booleanAttribute key="useDefaultConfigArea" value="true" />
+	<booleanAttribute key="useProduct" value="true" />
+</launchConfiguration>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/.gitignore b/ui/org.eclipse.pde.ui.tests/tests/projects/.gitignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/.gitignore
@@ -0,0 +1 @@
+bin
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.project
new file mode 100644
index 0000000..1bd3633
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>capabilities.consumer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59a6713
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Consumer
+Bundle-SymbolicName: capabilities.consumer
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: capabilities.consumer
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Capability: some.test.capability
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.consumer/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.project
new file mode 100644
index 0000000..b4738d1
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>capabilities.provider</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..62c9795
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Provider
+Bundle-SymbolicName: capabilities.provider
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: capabilities.provider
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Provide-Capability: some.test.capability
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/capabilities/capabilities.provider/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.project
new file mode 100644
index 0000000..d0ce078
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fragment.imported.bundle</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..42904d6
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Host
+Bundle-SymbolicName: fragment.imported.bundle
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: host_import
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: fragment.imported.bundle
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/src/fragment/imported/bundle/Test.java b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/src/fragment/imported/bundle/Test.java
new file mode 100644
index 0000000..06c4ecc
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/bundle/src/fragment/imported/bundle/Test.java
@@ -0,0 +1,5 @@
+package fragment.imported.bundle;
+
+public class Test {
+
+}
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.project
new file mode 100644
index 0000000..5b7e377
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fragment.imported.testfragment</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5082c9a
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Fragment
+Bundle-SymbolicName: fragment.imported.testfragment
+Bundle-Version: 1.0.0.qualifier
+Fragment-Host: fragment.imported.bundle
+Automatic-Module-Name: fragment_import
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: fragment.imported.testframework
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testfragment/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.project
new file mode 100644
index 0000000..5d670dd
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fragment.imported.testframework</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9c543ba
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Testframework
+Bundle-SymbolicName: fragment.imported.testframework
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: testframework_import
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: fragment.imported.testframework
+Import-Package: fragment.imported.bundle
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/src/fragment/imported/testframework/Test.java b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/src/fragment/imported/testframework/Test.java
new file mode 100644
index 0000000..169397c
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-imported/testframework/src/fragment/imported/testframework/Test.java
@@ -0,0 +1,5 @@
+package fragment.imported.testframework;
+
+public class Test {
+
+}
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.project
new file mode 100644
index 0000000..6aa781c
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fragment.required.bundle</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9862be1
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/META-INF/MANIFEST.MF
@@ -0,0 +1,7 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Host
+Bundle-SymbolicName: fragment.required.bundle
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: host
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/bundle/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.project
new file mode 100644
index 0000000..2de0bab
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fragment.required.testfragment</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..e401df2
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Fragment
+Bundle-SymbolicName: fragment.required.testfragment
+Bundle-Version: 1.0.0.qualifier
+Fragment-Host: fragment.required.bundle
+Automatic-Module-Name: fragment
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: fragment.required.testframework;bundle-version="1.0.0"
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testfragment/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.project
new file mode 100644
index 0000000..a484544
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>fragment.required.testframework</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3f2e7a8
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Testframework
+Bundle-SymbolicName: fragment.required.testframework
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: testframework
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: fragment.required.bundle;bundle-version="1.0.0"
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/host-fragment-required/testframework/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.classpath b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.classpath
@@ -0,0 +1,7 @@
+<?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/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.project b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.project
new file mode 100644
index 0000000..a6f6501
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importing.targetbundle</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.settings/org.eclipse.jdt.core.prefs b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..09a3207
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Targetbundle
+Bundle-SymbolicName: importing.targetbundle
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: importing.targetbundle
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Import-Package: org.eclipse.core.runtime;version="3.5.0"
diff --git a/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/build.properties b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/ui/org.eclipse.pde.ui.tests/tests/projects/importing.targetbundle/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF b/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF
index 99c613e..a18782d 100644
--- a/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %name
 Bundle-SymbolicName: org.eclipse.pde.ui; singleton:=true
-Bundle-Version: 3.11.200.qualifier
+Bundle-Version: 3.11.300.qualifier
 Bundle-Activator: org.eclipse.pde.internal.ui.PDEPlugin
 Bundle-Vendor: %provider-name
 Bundle-Localization: plugin
diff --git a/ui/org.eclipse.pde.ui/pom.xml b/ui/org.eclipse.pde.ui/pom.xml
index f00aa92..750f63f 100644
--- a/ui/org.eclipse.pde.ui/pom.xml
+++ b/ui/org.eclipse.pde.ui/pom.xml
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde.ui</artifactId>
-  <version>3.11.200-SNAPSHOT</version>
+  <version>3.11.300-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java
index 6a3f9d3..50f8107 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java
@@ -1835,6 +1835,8 @@
 	public static String compilers_s_create_docs;
 	public static String compilers_s_doc_folder;
 	public static String compilers_s_open_tags;
+	public static String compilers_p_exec_env_too_low;
+
 	public static String compilers_p_exported_pkgs;
 
 	public static String compilers_f_unresolved_plugins;
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/messages.properties b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/messages.properties
index 6193e6e..8bab5d8 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/messages.properties
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/correction/messages.properties
@@ -7,4 +7,4 @@
 #  Contributors:
 #     Andrew Obuchowicz <aobuchow@redhat.com>
 ###############################################################################
-ReplaceExecEnvironment_Marker_Label=Replace Bundle Execution Environment with ''{0}''
\ No newline at end of file
+ReplaceExecEnvironment_Marker_Label=Replace plug-in execution environment with ''{0}''
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/AbstractPluginBlock.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/AbstractPluginBlock.java
index 7ddb0fa..f709041 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/AbstractPluginBlock.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/AbstractPluginBlock.java
@@ -20,7 +20,6 @@
 import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
 
 import java.util.*;
-import java.util.List;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;
 import org.eclipse.core.resources.IProject;
@@ -104,15 +103,15 @@
 	private PluginStatusDialog fDialog;
 
 	class PluginModelNameBuffer {
-		private List<String> nameList;
+		private Set<String> nameSet;
 
 		PluginModelNameBuffer() {
 			super();
-			nameList = new ArrayList<>();
+			nameSet = new HashSet<>();
 		}
 
 		void add(IPluginModelBase model) {
-			nameList.add(getPluginName(model));
+			nameSet.add(getPluginName(model));
 		}
 
 		private String getPluginName(IPluginModelBase model) {
@@ -125,22 +124,13 @@
 			return BundleLauncherHelper.writeBundleEntry(model, startLevel, autoStart);
 		}
 
+		public Set<String> getNameSet() {
+			return nameSet;
+		}
+
 		@Override
 		public String toString() {
-			Collections.sort(nameList);
-			StringBuilder result = new StringBuilder();
-			for (String name : nameList) {
-				if (result.length() > 0) {
-					result.append(',');
-				}
-				result.append(name);
-			}
-
-			if (result.length() == 0) {
-				return null;
-			}
-
-			return result.toString();
+			return String.join(",", nameSet); //$NON-NLS-1$
 		}
 	}
 
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java
index efd3463..80066d7 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/LaunchAction.java
@@ -101,8 +101,8 @@
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, getVMArguments(os, arch));
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS, getProgramArguments(os, arch));
 		wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_JRE_CONTAINER_PATH, getJREContainer(os));
-		StringBuilder wsplugins = new StringBuilder();
-		StringBuilder explugins = new StringBuilder();
+		Set<String> wsplugins = new HashSet<>();
+		Set<String> explugins = new HashSet<>();
 		IPluginModelBase[] models = getModels();
 		for (IPluginModelBase model : models) {
 			if (model.getUnderlyingResource() == null) {
@@ -111,8 +111,8 @@
 				appendBundle(wsplugins, model);
 			}
 		}
-		wc.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS, wsplugins.toString());
-		wc.setAttribute(IPDELauncherConstants.SELECTED_TARGET_PLUGINS, explugins.toString());
+		wc.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES, wsplugins);
+		wc.setAttribute(IPDELauncherConstants.SELECTED_TARGET_BUNDLES, explugins);
 		String configIni = getTemplateConfigIni(os);
 		wc.setAttribute(IPDELauncherConstants.CONFIG_GENERATE_DEFAULT, configIni == null);
 		if (configIni != null)
@@ -138,12 +138,11 @@
 		wc.setAttribute(IPDELauncherConstants.ADDITIONAL_PLUGINS, additionalPlugins);
 	}
 
-	private void appendBundle(StringBuilder buffer, IPluginModelBase model) {
+	private void appendBundle(Set<String> plugins, IPluginModelBase model) {
 		AdditionalPluginData configuration = getPluginConfiguration(model).orElse(FeatureBlock.DEFAULT_PLUGIN_DATA);
 		String entry = BundleLauncherHelper.writeBundleEntry(model, configuration.fStartLevel,
 				configuration.fAutoStart);
-		buffer.append(entry);
-		buffer.append(',');
+		plugins.add(entry);
 	}
 
 	private Optional<AdditionalPluginData> getPluginConfiguration(IPluginModelBase model) {
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/OSGiBundleBlock.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/OSGiBundleBlock.java
index a799959..1cdb967 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/OSGiBundleBlock.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/OSGiBundleBlock.java
@@ -50,8 +50,8 @@
 			}
 		}
 
-		config.setAttribute(IPDELauncherConstants.WORKSPACE_BUNDLES, wBuffer.toString());
-		config.setAttribute(IPDELauncherConstants.TARGET_BUNDLES, tBuffer.toString());
+		config.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES, wBuffer.getNameSet());
+		config.setAttribute(IPDELauncherConstants.SELECTED_TARGET_BUNDLES, tBuffer.getNameSet());
 
 		PluginModelNameBuffer buffer = new PluginModelNameBuffer();
 		if (fAddWorkspaceButton.getSelection()) {
@@ -62,7 +62,7 @@
 				}
 			}
 		}
-		config.setAttribute(IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS, buffer.toString());
+		config.setAttribute(IPDELauncherConstants.DESELECTED_WORKSPACE_BUNDLES, buffer.getNameSet());
 	}
 
 	public void initializeFrom(ILaunchConfiguration configuration) throws CoreException {
@@ -76,8 +76,7 @@
 	private void initializePluginsState(ILaunchConfiguration configuration) throws CoreException {
 		Map<IPluginModelBase, String> selected = new HashMap<>();
 		selected.putAll(BundleLauncherHelper.getWorkspaceBundleMap(configuration));
-		selected.putAll(
-				BundleLauncherHelper.getTargetBundleMap(configuration, null, IPDELauncherConstants.TARGET_BUNDLES));
+		selected.putAll(BundleLauncherHelper.getTargetBundleMap(configuration, null));
 
 		initializePluginsState(selected);
 	}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginBlock.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginBlock.java
index f4dff70..197ea87 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginBlock.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/launcher/PluginBlock.java
@@ -82,7 +82,9 @@
 	public void initialize(boolean enable) throws CoreException {
 		// To support lazy loading of the table we need to set some launch configuration attributes when the combo changes
 		if (fLaunchConfig != null) {
-			fInitDefaultCheckState = enable && !fLaunchConfig.hasAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS) && !fLaunchConfig.hasAttribute(IPDELauncherConstants.SELECTED_TARGET_PLUGINS);
+			fInitDefaultCheckState = enable
+					&& !fLaunchConfig.hasAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES)
+					&& !fLaunchConfig.hasAttribute(IPDELauncherConstants.SELECTED_TARGET_BUNDLES);
 			fTab.updateLaunchConfigurationDialog();
 			initializeFrom(fLaunchConfig, enable);
 		}
@@ -90,10 +92,8 @@
 
 	private void initializePluginsState(ILaunchConfiguration config) throws CoreException {
 		Map<IPluginModelBase, String> selected = new HashMap<>();
-		selected.putAll(BundleLauncherHelper.getWorkspaceBundleMap(config, null,
-				IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS));
-		selected.putAll(
-				BundleLauncherHelper.getTargetBundleMap(config, null, IPDELauncherConstants.SELECTED_TARGET_PLUGINS));
+		selected.putAll(BundleLauncherHelper.getWorkspaceBundleMap(config, null));
+		selected.putAll(BundleLauncherHelper.getTargetBundleMap(config, null));
 
 		initializePluginsState(selected);
 	}
@@ -145,8 +145,8 @@
 				}
 
 			}
-			config.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS, wBuffer.toString());
-			config.setAttribute(IPDELauncherConstants.SELECTED_TARGET_PLUGINS, tBuffer.toString());
+			config.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES, wBuffer.getNameSet());
+			config.setAttribute(IPDELauncherConstants.SELECTED_TARGET_BUNDLES, tBuffer.getNameSet());
 
 			PluginModelNameBuffer buffer = new PluginModelNameBuffer();
 			if (fAddWorkspaceButton.getSelection()) {
@@ -157,7 +157,7 @@
 					}
 				}
 			}
-			config.setAttribute(IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS, buffer.toString());
+			config.setAttribute(IPDELauncherConstants.DESELECTED_WORKSPACE_BUNDLES, buffer.getNameSet());
 		}
 	}
 
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties
index 75af0f3..fa60d65 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties
@@ -1611,6 +1611,7 @@
 compilers_p_no_automatic_module_name = No aut&omatic module name:
 compilers_p_deprecated = Usage of deprecated attributes and &elements:
 compilers_p_internal = Usage o&f internal extension points:
+compilers_p_exec_env_too_low=Bundle BREE lower than its dependencies:
 compilers_p_exported_pkgs = Unexported pac&kage:
 compilers_p_missing_exp_pkg = Missing versions on exported packages:
 compilers_p_missing_imp_pkg = Missing versions on imported packages:
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/PDECompilersConfigurationBlock.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/PDECompilersConfigurationBlock.java
index dffb9ce..c2cf8c7 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/PDECompilersConfigurationBlock.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/PDECompilersConfigurationBlock.java
@@ -239,6 +239,7 @@
 	private static final Key KEY_P_VERSION_EXP_PKG = getPDEPrefKey(CompilerFlags.P_MISSING_VERSION_EXP_PKG);
 	private static final Key KEY_P_VERSION_IMP_PKG = getPDEPrefKey(CompilerFlags.P_MISSING_VERSION_IMP_PKG);
 	private static final Key KEY_P_VERSION_REQ_BUNDLE = getPDEPrefKey(CompilerFlags.P_MISSING_VERSION_REQ_BUNDLE);
+	private static final Key KEY_P_VERSION_EXEC_ENV_TOO_LOW = getPDEPrefKey(CompilerFlags.P_EXEC_ENV_TOO_LOW);
 
 	private static final Key KEY_S_CREATE_DOCS = getPDEPrefKey(CompilerFlags.S_CREATE_DOCS);
 	private static final Key KEY_S_DOC_FOLDER = getPDEPrefKey(CompilerFlags.S_DOC_FOLDER);
@@ -246,7 +247,7 @@
 
 	private static String[] SEVERITIES = {PDEUIMessages.PDECompilersConfigurationBlock_error, PDEUIMessages.PDECompilersConfigurationBlock_warning, PDEUIMessages.PDECompilersConfigurationBlock_ignore};
 
-	private static Key[] fgAllKeys = {KEY_F_UNRESOLVED_FEATURES, KEY_F_UNRESOLVED_PLUGINS, KEY_P_BUILD, KEY_P_BUILD_MISSING_OUTPUT, KEY_P_BUILD_SOURCE_LIBRARY, KEY_P_BUILD_OUTPUT_LIBRARY, KEY_P_BUILD_SRC_INCLUDES, KEY_P_BUILD_BIN_INCLUDES, KEY_P_BUILD_JAVA_COMPLIANCE, KEY_P_BUILD_JAVA_COMPILER, KEY_P_BUILD_ENCODINGS, KEY_P_INTERNAL, KEY_P_SERVICE_COMP_WITHOUT_LAZY, KEY_P_NO_AUTOMATIC_MODULE_NAME, KEY_P_DEPRECATED, KEY_P_DISCOURAGED_CLASS, KEY_P_INCOMPATIBLE_ENV, KEY_P_MISSING_EXPORT_PKGS, KEY_P_NO_REQUIRED_ATT, KEY_P_NOT_EXTERNALIZED, KEY_P_UNKNOWN_ATTRIBUTE, KEY_P_UNKNOWN_CLASS, KEY_P_UNKNOWN_ELEMENT, KEY_P_UNKNOWN_IDENTIFIER, KEY_P_UNKNOWN_RESOURCE, KEY_P_UNRESOLVED_EX_POINTS, KEY_P_UNRESOLVED_IMPORTS, KEY_P_VERSION_EXP_PKG, KEY_P_VERSION_IMP_PKG, KEY_P_VERSION_REQ_BUNDLE, KEY_S_CREATE_DOCS, KEY_S_DOC_FOLDER, KEY_S_OPEN_TAGS };
+	private static Key[] fgAllKeys = {KEY_F_UNRESOLVED_FEATURES, KEY_F_UNRESOLVED_PLUGINS, KEY_P_BUILD, KEY_P_BUILD_MISSING_OUTPUT, KEY_P_BUILD_SOURCE_LIBRARY, KEY_P_BUILD_OUTPUT_LIBRARY, KEY_P_BUILD_SRC_INCLUDES, KEY_P_BUILD_BIN_INCLUDES, KEY_P_BUILD_JAVA_COMPLIANCE, KEY_P_BUILD_JAVA_COMPILER, KEY_P_BUILD_ENCODINGS, KEY_P_INTERNAL, KEY_P_SERVICE_COMP_WITHOUT_LAZY, KEY_P_NO_AUTOMATIC_MODULE_NAME, KEY_P_DEPRECATED, KEY_P_DISCOURAGED_CLASS, KEY_P_INCOMPATIBLE_ENV, KEY_P_MISSING_EXPORT_PKGS, KEY_P_NO_REQUIRED_ATT, KEY_P_NOT_EXTERNALIZED, KEY_P_UNKNOWN_ATTRIBUTE, KEY_P_UNKNOWN_CLASS, KEY_P_UNKNOWN_ELEMENT, KEY_P_UNKNOWN_IDENTIFIER, KEY_P_UNKNOWN_RESOURCE, KEY_P_UNRESOLVED_EX_POINTS, KEY_P_UNRESOLVED_IMPORTS, KEY_P_VERSION_EXP_PKG, KEY_P_VERSION_IMP_PKG, KEY_P_VERSION_REQ_BUNDLE, KEY_P_VERSION_EXEC_ENV_TOO_LOW, KEY_S_CREATE_DOCS, KEY_S_DOC_FOLDER, KEY_S_OPEN_TAGS };
 
 	/**
 	 * Constant representing the {@link IDialogSettings} section for this block
@@ -541,7 +542,7 @@
 				initializeComboControls(client, new String[] {PDEUIMessages.PDECompilersConfigurationBlock_1, PDEUIMessages.PDECompilersConfigurationBlock_2, PDEUIMessages.PDECompilersConfigurationBlock_0, PDEUIMessages.PDECompilersConfigurationBlock_3, PDEUIMessages.PDECompilersConfigurationBlock_4, PDEUIMessages.PDECompilersConfigurationBlock_5, PDEUIMessages.PDECompilersConfigurationBlock_6, PDEUIMessages.PDECompilersConfigurationBlock_7, PDEUIMessages.CompilersConfigurationTab_buildPropertiesErrors}, new Key[] {KEY_P_BUILD_SOURCE_LIBRARY, KEY_P_BUILD_OUTPUT_LIBRARY, KEY_P_BUILD_MISSING_OUTPUT, KEY_P_BUILD_BIN_INCLUDES, KEY_P_BUILD_SRC_INCLUDES, KEY_P_BUILD_JAVA_COMPLIANCE, KEY_P_BUILD_JAVA_COMPILER, KEY_P_BUILD_ENCODINGS, KEY_P_BUILD}, CompilerFlags.PLUGIN_FLAGS);
 				// Versioning
 				client = createExpansibleComposite(sbody, PDEUIMessages.PDECompilersConfigurationBlock_versioning);
-				initializeComboControls(client, new String[] {PDEUIMessages.compilers_p_missing_require_bundle, PDEUIMessages.compilers_p_missing_exp_pkg, PDEUIMessages.compilers_p_missing_imp_pkg}, new Key[] {KEY_P_VERSION_REQ_BUNDLE, KEY_P_VERSION_EXP_PKG, KEY_P_VERSION_IMP_PKG}, CompilerFlags.PLUGIN_FLAGS);
+				initializeComboControls(client, new String[] {PDEUIMessages.compilers_p_missing_require_bundle, PDEUIMessages.compilers_p_missing_exp_pkg, PDEUIMessages.compilers_p_missing_imp_pkg, PDEUIMessages.compilers_p_exec_env_too_low}, new Key[] {KEY_P_VERSION_REQ_BUNDLE, KEY_P_VERSION_EXP_PKG, KEY_P_VERSION_IMP_PKG, KEY_P_VERSION_EXEC_ENV_TOO_LOW}, CompilerFlags.PLUGIN_FLAGS);
 				// Usage
 				client = createExpansibleComposite(sbody, PDEUIMessages.PDECompilersConfigurationBlock_usage);
 				initializeComboControls(client, new String[] { PDEUIMessages.compilers_p_unresolved_import, PDEUIMessages.compilers_p_unresolved_ex_points, PDEUIMessages.compilers_p_internal, PDEUIMessages.compilers_p_deprecated, PDEUIMessages.compilers_p_not_externalized_att, PDEUIMessages.compilers_p_service_component_without_lazy_act }, new Key[] { KEY_P_UNRESOLVED_IMPORTS, KEY_P_UNRESOLVED_EX_POINTS, KEY_P_INTERNAL, KEY_P_DEPRECATED, KEY_P_NOT_EXTERNALIZED, KEY_P_SERVICE_COMP_WITHOUT_LAZY }, CompilerFlags.PLUGIN_FLAGS);
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/search/dependencies/ShowResultsAction.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/search/dependencies/ShowResultsAction.java
index cd44a08..d6fc480 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/search/dependencies/ShowResultsAction.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/search/dependencies/ShowResultsAction.java
@@ -16,7 +16,7 @@
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.pde.core.plugin.IPluginModelBase;
 import org.eclipse.pde.internal.ui.PDEPlugin;
 import org.eclipse.pde.internal.ui.PDEUIMessages;
@@ -58,14 +58,9 @@
 	private Dialog getUnusedDependeciesInfoDialog() {
 		ListDialog dialog = new ListDialog(PDEPlugin.getActiveWorkbenchShell());
 		dialog.setAddCancelButton(false);
-		dialog.setContentProvider(new IStructuredContentProvider() {
-			@Override
-			public Object[] getElements(Object inputElement) {
-				return fUnusedImports;
-			}
-		});
+		dialog.setContentProvider(ArrayContentProvider.getInstance());
 		dialog.setLabelProvider(PDEPlugin.getDefault().getLabelProvider());
-		dialog.setInput(this);
+		dialog.setInput(fUnusedImports);
 		dialog.create();
 		dialog.getTableViewer().setComparator(new UnusedImportsDialog.Comparator());
 		return dialog;
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/wizards/product/ProductFromConfigOperation.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/wizards/product/ProductFromConfigOperation.java
index 973ce48..0226657 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/wizards/product/ProductFromConfigOperation.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/wizards/product/ProductFromConfigOperation.java
@@ -74,15 +74,9 @@
 			}
 
 			// fetch the plug-ins models
-			String workspaceId = IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS;
-			String targetId = IPDELauncherConstants.SELECTED_TARGET_PLUGINS;
-			if (fLaunchConfiguration.getType().getIdentifier().equals(IPDELauncherConstants.OSGI_CONFIGURATION_TYPE)) {
-				workspaceId = IPDELauncherConstants.WORKSPACE_BUNDLES;
-				targetId = IPDELauncherConstants.TARGET_BUNDLES;
-			}
 			Set<String> set = new HashSet<>();
-			Map<IPluginModelBase, String> map = BundleLauncherHelper.getWorkspaceBundleMap(fLaunchConfiguration, set, workspaceId);
-			map.putAll(BundleLauncherHelper.getTargetBundleMap(fLaunchConfiguration, set, targetId));
+			Map<IPluginModelBase, String> map = BundleLauncherHelper.getWorkspaceBundleMap(fLaunchConfiguration, set);
+			map.putAll(BundleLauncherHelper.getTargetBundleMap(fLaunchConfiguration, set));
 
 			addPlugins(factory, product, map);
 
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/AbstractPDELaunchConfigurationTabGroup.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/AbstractPDELaunchConfigurationTabGroup.java
index 5fd59b6..fbe5d15 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/AbstractPDELaunchConfigurationTabGroup.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/AbstractPDELaunchConfigurationTabGroup.java
@@ -55,7 +55,7 @@
 		BusyIndicator.showWhile(Display.getCurrent(), () -> {
 			try {
 				if (config instanceof ILaunchConfigurationWorkingCopy) {
-					checkBackwardCompatibility((ILaunchConfigurationWorkingCopy) config);
+					migrateLaunchConfiguration((ILaunchConfigurationWorkingCopy) config);
 				}
 			} catch (CoreException e) {
 			}
@@ -74,7 +74,7 @@
 	 * 			a CoreException is thrown if there was an error retrieving launch
 	 * 			configuration attributes
 	 */
-	private void checkBackwardCompatibility(ILaunchConfigurationWorkingCopy wc) throws CoreException {
+	private void migrateLaunchConfiguration(ILaunchConfigurationWorkingCopy wc) throws CoreException {
 		String id = wc.getAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER, (String) null);
 		if (id == null) {
 			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER, PDESourcePathProvider.ID);
@@ -98,10 +98,7 @@
 			wc.setAttribute(IPDELauncherConstants.LOCATION, value);
 		}
 
-		BundleLauncherHelper.checkBackwardCompatibility(wc, false);
-		if (wc.isDirty()) {
-			wc.doSave();
-		}
+		BundleLauncherHelper.migrateLaunchConfiguration(wc);
 	}
 
 	/**
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/EclipseLaunchShortcut.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/EclipseLaunchShortcut.java
index d343e2f..8f855b0 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/EclipseLaunchShortcut.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/EclipseLaunchShortcut.java
@@ -284,8 +284,8 @@
 	}
 
 	private void initializePluginsList(ILaunchConfigurationWorkingCopy wc) {
-		StringBuilder wsplugins = new StringBuilder();
-		StringBuilder explugins = new StringBuilder();
+		Set<String> wsplugins = new HashSet<>();
+		Set<String> explugins = new HashSet<>();
 		Set<?> plugins = DependencyManager.getSelfAndDependencies(fModel, null);
 		Iterator<?> iter = plugins.iterator();
 		while (iter.hasNext()) {
@@ -299,15 +299,15 @@
 				appendPlugin(wsplugins, model);
 			}
 		}
-		wc.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS, wsplugins.toString());
-		wc.setAttribute(IPDELauncherConstants.SELECTED_TARGET_PLUGINS, explugins.toString());
+		wc.setAttribute(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES, wsplugins);
+		wc.setAttribute(IPDELauncherConstants.SELECTED_TARGET_BUNDLES, explugins);
 	}
 
-	private void appendPlugin(StringBuilder buffer, IPluginModelBase model) {
-		if (buffer.length() > 0)
-			buffer.append(',');
-		buffer.append(model.getPluginBase().getId());
-		buffer.append(BundleLauncherHelper.VERSION_SEPARATOR);
-		buffer.append(model.getPluginBase().getVersion());
+	private void appendPlugin(Set<String> plugins, IPluginModelBase model) {
+		final StringBuilder builder = new StringBuilder();
+		builder.append(model.getPluginBase().getId());
+		builder.append(BundleLauncherHelper.VERSION_SEPARATOR);
+		builder.append(model.getPluginBase().getVersion());
+		plugins.add(builder.toString());
 	}
 }
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/OSGiLauncherTabGroup.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/OSGiLauncherTabGroup.java
index d5afe21..b8992c5 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/OSGiLauncherTabGroup.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/OSGiLauncherTabGroup.java
@@ -13,11 +13,16 @@
  *******************************************************************************/
 package org.eclipse.pde.ui.launcher;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
 import org.eclipse.debug.ui.*;
 import org.eclipse.jdt.debug.ui.launchConfigurations.JavaArgumentsTab;
 import org.eclipse.pde.internal.launching.PDELaunchingPlugin;
+import org.eclipse.pde.internal.launching.launcher.BundleLauncherHelper;
 import org.eclipse.pde.internal.launching.launcher.OSGiFrameworkManager;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
 
 /**
  * Creates and initializes the tabs on the OSGi Framework launch configuration.
@@ -31,6 +36,26 @@
  */
 public class OSGiLauncherTabGroup extends AbstractLaunchConfigurationTabGroup {
 
+	/**
+	 * The tab group delegates to all tabs in the group. Prior to the
+	 * delegation, it migrates all launch configurations.
+	 *
+	 * @see org.eclipse.debug.ui.AbstractLaunchConfigurationTabGroup#initializeFrom(org.eclipse.debug.core.ILaunchConfiguration)
+	 */
+	@Override
+	public void initializeFrom(ILaunchConfiguration configuration) {
+		final ILaunchConfiguration config = configuration;
+		BusyIndicator.showWhile(Display.getCurrent(), () -> {
+			try {
+				if (config instanceof ILaunchConfigurationWorkingCopy) {
+					BundleLauncherHelper.migrateOsgiLaunchConfiguration(config);
+				}
+			} catch (CoreException e) {
+			}
+			super.initializeFrom(configuration);
+		});
+	}
+
 	@Override
 	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
 		ILaunchConfigurationTab[] tabs = new ILaunchConfigurationTab[] {new BundlesTab(), new JavaArgumentsTab(), new OSGiSettingsTab(), new TracingTab(), new EnvironmentTab(), new CommonTab()};
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/PluginsTab.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/PluginsTab.java
index 543ee27..3edd3ac 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/PluginsTab.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/ui/launcher/PluginsTab.java
@@ -240,11 +240,12 @@
 		getAttributesLabelsForPrototype().put(IPDELauncherConstants.USE_CUSTOM_FEATURES, PDEUIMessages.PluginsTab_AttributeLabel_UseCustomFeatures);
 		getAttributesLabelsForPrototype().put(IPDELauncherConstants.DEFAULT_AUTO_START, PDEUIMessages.PluginsTab_AttributeLabel_DefaultAutoStart);
 		getAttributesLabelsForPrototype().put(IPDELauncherConstants.DEFAULT_START_LEVEL, PDEUIMessages.PluginsTab_AttributeLabel_DefaultStartLevel);
-		getAttributesLabelsForPrototype().put(IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS, PDEUIMessages.PluginsTab_AttributeLabel_DeselectedWorkspacePlugins);
-		getAttributesLabelsForPrototype().put(IPDELauncherConstants.WORKSPACE_BUNDLES, PDEUIMessages.PluginsTab_AttributeLabel_WorkspaceBundles);
-		getAttributesLabelsForPrototype().put(IPDELauncherConstants.TARGET_BUNDLES, PDEUIMessages.PluginsTab_AttributeLabel_TargetBundles);
-		getAttributesLabelsForPrototype().put(IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS, PDEUIMessages.PluginsTab_AttributeLabel_SelectedWorkspacePlugins);
-		getAttributesLabelsForPrototype().put(IPDELauncherConstants.SELECTED_TARGET_PLUGINS, PDEUIMessages.PluginsTab_AttributeLabel_SelectedTargetPlugins);
+		getAttributesLabelsForPrototype().put(IPDELauncherConstants.DESELECTED_WORKSPACE_BUNDLES,
+				PDEUIMessages.PluginsTab_AttributeLabel_DeselectedWorkspacePlugins);
+		getAttributesLabelsForPrototype().put(IPDELauncherConstants.SELECTED_WORKSPACE_BUNDLES,
+				PDEUIMessages.PluginsTab_AttributeLabel_SelectedWorkspacePlugins);
+		getAttributesLabelsForPrototype().put(IPDELauncherConstants.SELECTED_TARGET_BUNDLES,
+				PDEUIMessages.PluginsTab_AttributeLabel_SelectedTargetPlugins);
 		getAttributesLabelsForPrototype().put(IPDELauncherConstants.FEATURE_PLUGIN_RESOLUTION, PDEUIMessages.PluginsTab_AttributeLabel_FeaturePluginResolution);
 		getAttributesLabelsForPrototype().put(IPDELauncherConstants.FEATURE_DEFAULT_LOCATION, PDEUIMessages.PluginsTab_AttributeLabel_FeatureDefaultLocation);
 		getAttributesLabelsForPrototype().put(IPDELauncherConstants.AUTOMATIC_VALIDATE, PDEUIMessages.PluginsTab_AttributeLabel_AutomaticValidate);
diff --git a/ui/org.eclipse.pde/META-INF/MANIFEST.MF b/ui/org.eclipse.pde/META-INF/MANIFEST.MF
index 5ba261a..b70492a 100644
--- a/ui/org.eclipse.pde/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.pde/META-INF/MANIFEST.MF
@@ -2,6 +2,6 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.pde;singleton:=true
-Bundle-Version: 3.13.800.qualifier
+Bundle-Version: 3.13.900.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/ui/org.eclipse.pde/pom.xml b/ui/org.eclipse.pde/pom.xml
index 4717bfc..51b8820 100644
--- a/ui/org.eclipse.pde/pom.xml
+++ b/ui/org.eclipse.pde/pom.xml
@@ -14,12 +14,12 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
   <artifactId>org.eclipse.pde</artifactId>
-  <version>3.13.800-SNAPSHOT</version>
+  <version>3.13.900-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/ui/org.eclipse.tools.layout.spy/pom.xml b/ui/org.eclipse.tools.layout.spy/pom.xml
index 3683fd6..0d73073 100644
--- a/ui/org.eclipse.tools.layout.spy/pom.xml
+++ b/ui/org.eclipse.tools.layout.spy/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.pde</groupId>
diff --git a/ui/org.eclipse.ui.trace/META-INF/MANIFEST.MF b/ui/org.eclipse.ui.trace/META-INF/MANIFEST.MF
index b1ee776..fb0979b 100644
--- a/ui/org.eclipse.ui.trace/META-INF/MANIFEST.MF
+++ b/ui/org.eclipse.ui.trace/META-INF/MANIFEST.MF
@@ -2,14 +2,13 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ui.trace;singleton:=true
-Bundle-Version: 1.1.700.qualifier
+Bundle-Version: 1.1.800.qualifier
 Bundle-Activator: org.eclipse.ui.trace.internal.TracingUIActivator
 Bundle-Vendor: %providerName
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Bundle-Localization: plugin
-Require-Bundle: org.eclipse.osgi;bundle-version="[3.6.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
  org.eclipse.ui;bundle-version="[3.6.0,4.0.0)"
 Export-Package: org.eclipse.ui.trace.internal;x-internal:=true,
  org.eclipse.ui.trace.internal.datamodel;x-internal:=true,
diff --git a/ui/org.eclipse.ui.trace/pom.xml b/ui/org.eclipse.ui.trace/pom.xml
index e79f9c8..ad170db 100644
--- a/ui/org.eclipse.ui.trace/pom.xml
+++ b/ui/org.eclipse.ui.trace/pom.xml
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>eclipse.pde.ui</artifactId>
     <groupId>eclipse.pde.ui</groupId>
-    <version>4.14.0-SNAPSHOT</version>
+    <version>4.15.0-SNAPSHOT</version>
     <relativePath>../../</relativePath>
   </parent>
   <groupId>org.eclipse.ui</groupId>
   <artifactId>org.eclipse.ui.trace</artifactId>
-  <version>1.1.700-SNAPSHOT</version>
+  <version>1.1.800-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>