diff --git a/plugins/org.eclipse.wst.server.discovery/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.server.discovery/META-INF/MANIFEST.MF
index 9e20e8d..180f2ce 100644
--- a/plugins/org.eclipse.wst.server.discovery/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.server.discovery/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %bundleName
 Bundle-Vendor: %bundleVendor
 Bundle-SymbolicName: org.eclipse.wst.server.discovery;singleton:=true
-Bundle-Version: 1.0.600.qualifier
+Bundle-Version: 1.0.700.qualifier
 Bundle-Activator: org.eclipse.wst.server.discovery.internal.Activator
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0)",
  org.eclipse.ui;bundle-version="[3.5.0,4.0)",
diff --git a/plugins/org.eclipse.wst.server.discovery/pom.xml b/plugins/org.eclipse.wst.server.discovery/pom.xml
index 1330ae0..87a0dbc 100644
--- a/plugins/org.eclipse.wst.server.discovery/pom.xml
+++ b/plugins/org.eclipse.wst.server.discovery/pom.xml
@@ -22,6 +22,6 @@
 
   <groupId>org.eclipse.webtools.servertools</groupId>
   <artifactId>org.eclipse.wst.server.discovery</artifactId>
-  <version>1.0.600-SNAPSHOT</version>
+  <version>1.0.700-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/ExtensionUpdateSite.java b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/ExtensionUpdateSite.java
index d340c14..27312f3 100644
--- a/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/ExtensionUpdateSite.java
+++ b/plugins/org.eclipse.wst.server.discovery/src/org/eclipse/wst/server/discovery/internal/model/ExtensionUpdateSite.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008, 2010 IBM Corporation and others.
+ * Copyright (c) 2008, 2015 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
@@ -16,14 +16,15 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.equinox.internal.p2.updatesite.metadata.UpdateSiteMetadataRepositoryFactory;
-import org.eclipse.equinox.p2.engine.IProfile;
-import org.eclipse.equinox.p2.engine.IProfileRegistry;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.core.ProvisionException;
 import org.eclipse.equinox.p2.metadata.IInstallableUnit;
 import org.eclipse.equinox.p2.metadata.IRequirement;
 import org.eclipse.equinox.p2.metadata.expression.IMatchExpression;
 import org.eclipse.equinox.p2.query.*;
 import org.eclipse.equinox.p2.repository.IRepositoryManager;
 import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
+import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
 import org.eclipse.wst.server.discovery.internal.ExtensionUtility;
 import org.eclipse.wst.server.discovery.internal.Trace;
 import org.osgi.framework.BundleContext;
@@ -34,6 +35,7 @@
 */
 public class ExtensionUpdateSite {
 	private static final List<String> EMPTY_LIST = new ArrayList<String>(0);
+	public static final String SERVER_ADAPTER_ID = "org.eclipse.wst.server.core.serverAdapter"; //$NON-NLS-1$
 
 	private String url;
 	private String featureId;
@@ -65,63 +67,104 @@
 
 	public List<Extension> getExtensions(IProgressMonitor monitor) throws CoreException {
 		try {
-			UpdateSiteMetadataRepositoryFactory mrf = new UpdateSiteMetadataRepositoryFactory();
-
+			/*
+			 * To discovery the server adapter, there are three methods:
+			 * 1. Looking at the site.xml (if it exists). This is the legacy method
+			 * 2. Looking for the org.eclipse.wst.server.core.serverAdapter property in a p2
+			 *    update site (that may not have a site.xml). The property is necessary to identify
+			 *    the InstallableUnit as a server type. Otherwise, all the InstallableUnits will show
+			 *    up regardless of whether it is a server or not
+			 * 3. If the user created the p2 update site using a category.xml file (migrating old site.xml
+			 *    to use category.xml)
+			 */	
 			BundleContext bd = org.eclipse.wst.server.discovery.internal.Activator.getDefault().getBundle().getBundleContext();			
-			mrf.setAgent(ExtensionUtility.getAgent(bd));
+			IProvisioningAgent agent = ExtensionUtility.getAgent(bd);
 			
 			URI url2 = new URI(url);
-			IMetadataRepository repo = mrf.load(url2, IRepositoryManager.REPOSITORIES_ALL, monitor);
-			//Query query = new InstallableUnitQuery("org.eclipse.wst.server.core.serverAdapter");
-			//Query query = CompoundQuery.createCompoundQuery(new Query[] {new
-			//		IUPropertyQuery(IInstallableUnit.PROP_TYPE_CATEGORY, Boolean.toString(true)),
-			//		new IUPropertyQuery(IInstallableUnit.PROP_NAME,"org.eclipse.wst.server.core.serverAdapter")}, true);
 			
-//---->>>>
-			IProfileRegistry profileRegistry = (IProfileRegistry) ExtensionUtility.getService(bd, IProfileRegistry.class.getName());
-			IProfile[] profiles = profileRegistry.getProfiles();
-			IProfile profile = profileRegistry.getProfile(IProfileRegistry.SELF);
-			
-			//IQuery<IInstallableUnit> query = QueryUtil.createIUAnyQuery();
-			//			IQuery<IInstallableUnit> query = QueryUtil.createIUQuery("org.eclipse.wst.server.core.serverAdapter");
-			//Query query = new InstallableUnitQuery("org.eclipse.wst.server.core.serverAdapter");
-			//List<String> list2 = new ArrayList();
-			//Query query = new ExtensionInstallableUnitQuery(list2);
-			//IQueryResult<IInstallableUnit> collector = profile.query(query, monitor);
-//<-------	
-			
-			//IQuery<IInstallableUnit> query = QueryUtil.createIUCategoryQuery();
-			IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery("id ~=/*org.eclipse.wst.server.core.serverAdapter/");
-
-			IQueryResult<IInstallableUnit> collector = repo.query(query, monitor);
-			
+			// Method 1: Looking at the site.xml
+			UpdateSiteMetadataRepositoryFactory mrf = new UpdateSiteMetadataRepositoryFactory();
+			mrf.setAgent(ExtensionUtility.getAgent(bd));
+			// If the site.xml does not exist, the load will throw a org.eclipse.equinox.p2.core.ProvisionException
 			List<Extension> list = new ArrayList<Extension>();
-			for (IInstallableUnit iu: collector.toUnmodifiableSet()) {
-				Collection<IRequirement> req = iu.getRequirements();
-				if (req != null) {
-					for (IRequirement requirement : req) {
-						
-						//IMatchExpression<IInstallableUnit> matches = requirement.getMatches();
-						//query = QueryUtil.createQuery(matches);
-						IMatchExpression<IInstallableUnit> matches = requirement.getMatches();
-						query = new ExpressionMatchQuery<IInstallableUnit>(IInstallableUnit.class, matches);
+			try {
+				IMetadataRepository repo = mrf.load(url2, IRepositoryManager.REPOSITORIES_ALL, monitor);
+				IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery("id ~=/*org.eclipse.wst.server.core.serverAdapter/"); //$NON-NLS-1$
+				
+				list = getInstallableUnits(repo,query,url2,monitor);			
+			}
+			catch (ProvisionException pe){
+				Trace.trace(Trace.WARNING, "Error getting update site information", pe); //$NON-NLS-1$
+			}
 
-					    IQueryResult<IInstallableUnit> collector2 = repo.query(query, monitor);						
-						Iterator<IInstallableUnit> iter2 = collector2.iterator();
-						while (iter2.hasNext()) {
-							IInstallableUnit iu2 = iter2.next();
-							if (!list.contains(iu2)) {
-								Extension ext = new Extension(iu2, url2);
-								list.add(ext);
+			// Call Method 2 if there are no results from Method 1 (e.g. if the site.xml exists without
+			// specifying any server adapters there or no site.xml exists)
+			if (list.isEmpty()){
+				IMetadataRepositoryManager manager = (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
+				manager.addRepository(url2);
+				// Need to query for all IUs
+				IQuery<IInstallableUnit> query = QueryUtil.createIUAnyQuery();
+				
+				IMetadataRepository repo = manager.loadRepository(url2, monitor);				
+				List<Extension> list2 = getInstallableUnits(repo,query,url2,monitor);
+				
+				int size = list2.size();
+				for (int i=0;i<size;i++){
+					Extension e = list2.get(i);
+					IInstallableUnit[] iuArr = e.getIUs();
+					if(iuArr != null && iuArr.length > 0){
+						if (iuArr[0] != null){
+							if (iuArr[0].getProperty(SERVER_ADAPTER_ID) != null){
+								list.add(e);
 							}
 						}
+						
+					}
+				}
+			}
+			
+			// Call Method 3 if no results from Method 2. Creating the p2 update site using the category.xml will generate
+			// a provider property with org.eclipse.wst.server.core.serverAdapter
+			if (list.isEmpty()){
+				IMetadataRepositoryManager manager = (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
+				manager.addRepository(url2);
+				IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery("id ~=/*org.eclipse.wst.server.core.serverAdapter/"); //$NON-NLS-1$
+				
+				IMetadataRepository repo = manager.loadRepository(url2, monitor);				
+				list = getInstallableUnits(repo,query,url2,monitor);
+			}			
+			
+			return list;
+		} catch (Exception e) {
+			Trace.trace(Trace.WARNING, "Error getting update info", e); //$NON-NLS-1$
+			return new ArrayList<Extension>(0);
+		}
+	}
+	
+	// Get the list of InstallableUnits and all its requirements
+	protected List<Extension> getInstallableUnits(IMetadataRepository repo, IQuery<IInstallableUnit> query, URI url, IProgressMonitor monitor){
+		List<Extension> list = new ArrayList<Extension>();
+		IQueryResult<IInstallableUnit> collector = repo.query(query, monitor);
+
+		for (IInstallableUnit iu: collector.toUnmodifiableSet()) {
+			Collection<IRequirement> req = iu.getRequirements();
+			if (req != null) {
+				for (IRequirement requirement : req) {
+					IMatchExpression<IInstallableUnit> matches = requirement.getMatches();
+					query = new ExpressionMatchQuery<IInstallableUnit>(IInstallableUnit.class, matches);
+
+				    IQueryResult<IInstallableUnit> collector2 = repo.query(query, monitor);						
+					Iterator<IInstallableUnit> iter2 = collector2.iterator();
+					while (iter2.hasNext()) {
+						IInstallableUnit iu2 = iter2.next();
+						if (!list.contains(iu2)) {
+							Extension ext = new Extension(iu2, url);
+							list.add(ext);
+						}
 					}
 				}
 			}
-			return list;
-		} catch (Exception e) {
-			Trace.trace(Trace.WARNING, "Error getting update info", e);
-			return new ArrayList<Extension>(0);
 		}
+		return list;
 	}
 }
\ No newline at end of file
