diff --git a/org.eclipse.pde.build/META-INF/MANIFEST.MF b/org.eclipse.pde.build/META-INF/MANIFEST.MF
index 620e9ba..1cc6deb 100644
--- a/org.eclipse.pde.build/META-INF/MANIFEST.MF
+++ b/org.eclipse.pde.build/META-INF/MANIFEST.MF
@@ -19,7 +19,6 @@
  org.eclipse.pde.internal.build.site.compatibility;x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
  org.eclipse.ant.core;bundle-version="[3.1.100,4.0.0)",
- org.eclipse.update.configurator;bundle-version="[3.1.0,4.0.0)",
  org.eclipse.osgi;bundle-version="[3.3.0,4.0.0)",
  org.eclipse.equinox.p2.jarprocessor;bundle-version="[1.0.1,2.0.0)",
  org.eclipse.equinox.p2.publisher;bundle-version="1.1.0",
diff --git a/org.eclipse.pde.build/src/org/eclipse/pde/internal/build/site/PluginPathFinder.java b/org.eclipse.pde.build/src/org/eclipse/pde/internal/build/site/PluginPathFinder.java
index 2f766c2..95972e5 100644
--- a/org.eclipse.pde.build/src/org/eclipse/pde/internal/build/site/PluginPathFinder.java
+++ b/org.eclipse.pde.build/src/org/eclipse/pde/internal/build/site/PluginPathFinder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2013 IBM Corporation and others.
+ * Copyright (c) 2004, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,19 +11,14 @@
 package org.eclipse.pde.internal.build.site;
 
 import java.io.*;
-import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.*;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.pde.internal.build.IPDEBuildConstants;
 import org.eclipse.pde.internal.build.Utils;
-import org.eclipse.update.configurator.ConfiguratorUtils;
-import org.eclipse.update.configurator.IPlatformConfiguration;
 
 public class PluginPathFinder {
-	private static final String URL_PROPERTY = "org.eclipse.update.resolution_url"; //$NON-NLS-1$
-	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
 	private static final String DROPINS = "dropins"; //$NON-NLS-1$
 	private static final String LINK = ".link"; //$NON-NLS-1$
 	private static final String ECLIPSE = "eclipse"; //$NON-NLS-1$
@@ -158,67 +153,11 @@
 			}
 		}
 
-		File file = new File(platformHome, "configuration/org.eclipse.update/platform.xml"); //$NON-NLS-1$
-		if (file.exists()) {
-			try {
-				String value = new Path(platformHome).toFile().toURL().toExternalForm();
-				System.setProperty(URL_PROPERTY, value);
-				try {
-					IPlatformConfiguration config = ConfiguratorUtils.getPlatformConfiguration(file.toURL());
-					return getConfiguredSitesPaths(platformHome, config, features);
-				} finally {
-					System.setProperty(URL_PROPERTY, EMPTY_STRING);
-				}
-			} catch (MalformedURLException e) {
-				//ignore
-			} catch (IOException e) {
-				//ignore
-			}
-		}
-
 		List<File> list = scanLocations(getSites(platformHome, features));
 		list.addAll(getDropins(platformHome, features));
 		return Utils.asFile(list);
 	}
 
-	private static File[] getConfiguredSitesPaths(String platformHome, IPlatformConfiguration configuration, boolean features) {
-		List<File> installPlugins = scanLocations(new File[] {new File(platformHome, features ? IPDEBuildConstants.DEFAULT_FEATURE_LOCATION : IPDEBuildConstants.DEFAULT_PLUGIN_LOCATION)});
-		List<File> extensionPlugins = getExtensionPlugins(configuration, features);
-		List<File> dropinsPlugins = getDropins(platformHome, features);
-
-		Set<File> all = new LinkedHashSet<File>();
-		all.addAll(installPlugins);
-		all.addAll(extensionPlugins);
-		all.addAll(dropinsPlugins);
-
-		return all.toArray(new File[all.size()]);
-	}
-
-	/**
-	 * 
-	 * @param config
-	 * @param features true for features false for plugins
-	 * @return List of Files for features or plugins on the site
-	 */
-	private static List<File> getExtensionPlugins(IPlatformConfiguration config, boolean features) {
-		ArrayList<File> extensionPlugins = new ArrayList<File>();
-		IPlatformConfiguration.ISiteEntry[] sites = config.getConfiguredSites();
-		for (int i = 0; i < sites.length; i++) {
-			URL url = sites[i].getURL();
-			if ("file".equalsIgnoreCase(url.getProtocol())) { //$NON-NLS-1$
-				String[] entries;
-				if (features)
-					entries = sites[i].getFeatures();
-				else
-					entries = sites[i].getPlugins();
-				for (int j = 0; j < entries.length; j++) {
-					extensionPlugins.add(new File(url.getFile(), entries[j]));
-				}
-			}
-		}
-		return extensionPlugins;
-	}
-
 	/**
 	 * Scan given plugin/feature directories or jars for existence
 	 * @param sites
