diff --git a/org.eclipse.mylyn.discovery.core/META-INF/MANIFEST.MF b/org.eclipse.mylyn.discovery.core/META-INF/MANIFEST.MF
index 63ae3e0..8a29e42 100644
--- a/org.eclipse.mylyn.discovery.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.mylyn.discovery.core/META-INF/MANIFEST.MF
@@ -8,6 +8,3 @@
 Require-Bundle: org.eclipse.core.runtime;bundle-version="3.3.0",
  org.eclipse.mylyn.commons.core;bundle-version="3.1.0",
  org.eclipse.mylyn.commons.net;bundle-version="3.1.0"
-Export-Package: org.eclipse.mylyn.internal.discovery.core;x-friends:="org.eclipse.mylyn.discovery.ui",
- org.eclipse.mylyn.internal.discovery.core.model;x-friends:="org.eclipse.mylyn.discovery.ui",
- org.eclipse.mylyn.internal.discovery.core.util;x-friends:="org.eclipse.mylyn.discovery.ui"
diff --git a/org.eclipse.mylyn.discovery.core/build.properties b/org.eclipse.mylyn.discovery.core/build.properties
index ff37585..163f55c 100644
--- a/org.eclipse.mylyn.discovery.core/build.properties
+++ b/org.eclipse.mylyn.discovery.core/build.properties
@@ -12,7 +12,4 @@
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
-               plugin.xml,\
-               about.html,\
-               xsd/,\
-               schema/
+               about.html
diff --git a/org.eclipse.mylyn.discovery.core/plugin.xml b/org.eclipse.mylyn.discovery.core/plugin.xml
deleted file mode 100644
index 2e2d22d..0000000
--- a/org.eclipse.mylyn.discovery.core/plugin.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?><!--
-    Copyright (c) 2009 Tasktop Technologies 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
-    http://www.eclipse.org/legal/epl-v10.html
-    
-    Contributors:
-        Tasktop Technologies - initial API and implementation
- -->
-<plugin>
-   <extension-point id="connectorDiscovery" name="Connector Discovery" schema="schema/connectorDiscovery.exsd"/>
-
-</plugin>
diff --git a/org.eclipse.mylyn.discovery.core/schema/connectorDiscovery.exsd b/org.eclipse.mylyn.discovery.core/schema/connectorDiscovery.exsd
deleted file mode 100644
index 666f940..0000000
--- a/org.eclipse.mylyn.discovery.core/schema/connectorDiscovery.exsd
+++ /dev/null
@@ -1,323 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.mylyn.discovery.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.mylyn.discovery.core" id="connectorDiscovery" name="Connector Discovery"/>
-      </appinfo>
-      <documentation>
-         An extension point for contributing to the Mylyn connector discovery mechanism.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="connectorCategory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="connectorDescriptor" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="connectorDescriptor">
-      <annotation>
-         <documentation>
-            A description of a connector, including kind, description, licensing and brand.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="icon" minOccurs="0" maxOccurs="1"/>
-            <element ref="overview" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="kind" use="required">
-            <annotation>
-               <documentation>
-                  must be one of &apos;document&apos;, &apos;task&apos;, &apos;vcs&apos;
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="document">
-                  </enumeration>
-                  <enumeration value="task">
-                  </enumeration>
-                  <enumeration value="vcs">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the connector including the name of the organization that produces the repository if appropriate, for example &apos;Mozilla Bugzilla&apos;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="provider" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The name of the organization that supplies the connector.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="license" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The short name of the license, for example &apos;EPL 1.0&apos;, &apos;GPL 2.0&apos;, or &apos;Commercial&apos;.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description of the connector.  Plug-ins should provide a description, especially if the description is not self-evident from the @name and @organization.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="siteUrl" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The URL of the update site containing the connector.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The id of the feature that installs this connector
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="categoryId" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the id of the connectorCategory in which this connector belongs
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="platformFilter" type="string">
-            <annotation>
-               <documentation>
-                  E.g., &quot;(&amp; (osgi.os=macosx) (osgi.ws=carbon))&quot;
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="connectorCategory">
-      <annotation>
-         <documentation>
-            a category of connectors, which is a way of organizing connectors in top-level groups.
-         </documentation>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="icon" minOccurs="0" maxOccurs="1"/>
-         </sequence>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  an id that uniquely identifies the category
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="identifier"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string" use="required">
-            <annotation>
-               <documentation>
-                  the name of the category, as it is displayed in the ui.
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  A description of the category
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="icon">
-      <complexType>
-         <attribute name="image16" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="image32" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="image48" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="image64" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="image128" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="overview">
-      <complexType>
-         <attribute name="summary" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="url" type="string">
-            <annotation>
-               <documentation>
-                  HTML
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="screenshot" type="string">
-            <annotation>
-               <documentation>
-                  320x240 PNG, JPEG or GIF
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="resource"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         3.2
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         [Enter extension point usage example here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         [Enter API information here.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-
-</schema>
diff --git a/org.eclipse.mylyn.discovery.core/src/.placeholder b/org.eclipse.mylyn.discovery.core/src/.placeholder
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.mylyn.discovery.core/src/.placeholder
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/DiscoveryCore.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/DiscoveryCore.java
deleted file mode 100644
index 7e198be..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/DiscoveryCore.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core;
-
-/**
- * 
- * @author David Green
- */
-public abstract class DiscoveryCore {
-	public static final String ID_PLUGIN = "org.eclipse.mylyn.discovery.core"; //$NON-NLS-1$
-
-	private DiscoveryCore() {
-	}
-
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoverySource.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoverySource.java
deleted file mode 100644
index d1812be..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoverySource.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.net.URL;
-
-/**
- * 
- * @author David Green
- */
-public abstract class AbstractDiscoverySource {
-	/**
-	 * an identifier that can be used to determine the origin of the source, typically for logging purposes.
-	 */
-	public abstract Object getId();
-
-	/**
-	 * get a resource by an URL relative to the root of the source.
-	 * 
-	 * @param relativeUrl
-	 *            the relative resource name
-	 * @return an URL to the resource, or null if it is known that the resource does not exist.
-	 */
-	public abstract URL getResource(String resourceName);
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoveryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoveryStrategy.java
deleted file mode 100644
index c46ea89..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/AbstractDiscoveryStrategy.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-
-/**
- * An abstraction of a strategy for discovering connectors and categories. Strategy design pattern. Note that strategies
- * are not reusable and must be disposed.
- * 
- * @author David Green
- */
-public abstract class AbstractDiscoveryStrategy {
-
-	protected List<DiscoveryCategory> categories;
-
-	protected List<DiscoveryConnector> connectors;
-
-	/**
-	 * Perform discovery and add discovered items to {@link #getCategories() categories} and {@link #getConnectors()}.
-	 * 
-	 * @param monitor
-	 *            the monitor
-	 */
-	public abstract void performDiscovery(IProgressMonitor monitor) throws CoreException;
-
-	public List<DiscoveryCategory> getCategories() {
-		return categories;
-	}
-
-	public void setCategories(List<DiscoveryCategory> categories) {
-		this.categories = categories;
-	}
-
-	public List<DiscoveryConnector> getConnectors() {
-		return connectors;
-	}
-
-	public void setConnectors(List<DiscoveryConnector> connectors) {
-		this.connectors = connectors;
-	}
-
-	public void dispose() {
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoverySource.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoverySource.java
deleted file mode 100644
index 1204cbc..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoverySource.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.net.URL;
-
-import org.osgi.framework.Bundle;
-
-/**
- * @author David Green
- */
-public class BundleDiscoverySource extends AbstractDiscoverySource {
-
-	private final Bundle bundle;
-
-	public BundleDiscoverySource(Bundle bundle) {
-		if (bundle == null) {
-			throw new IllegalArgumentException();
-		}
-		this.bundle = bundle;
-	}
-
-	@Override
-	public Object getId() {
-		return "bundle:" + bundle.getSymbolicName(); //$NON-NLS-1$
-	}
-
-	@Override
-	public URL getResource(String relativeUrl) {
-		return bundle.getEntry(relativeUrl);
-	}
-
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoveryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoveryStrategy.java
deleted file mode 100644
index 39759a0..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/BundleDiscoveryStrategy.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IContributor;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * a strategy for discovering via installed platform {@link Bundle bundles}.
- * 
- * @author David Green
- */
-public class BundleDiscoveryStrategy extends AbstractDiscoveryStrategy {
-
-	@Override
-	public void performDiscovery(IProgressMonitor monitor) throws CoreException {
-		if (connectors == null || categories == null) {
-			throw new IllegalStateException();
-		}
-		IExtensionPoint extensionPoint = getExtensionRegistry().getExtensionPoint(
-				ConnectorDiscoveryExtensionReader.EXTENSION_POINT_ID);
-		IExtension[] extensions = extensionPoint.getExtensions();
-		monitor.beginTask(Messages.BundleDiscoveryStrategy_task_loading_local_extensions, extensions.length == 0 ? 1
-				: extensions.length);
-		try {
-			if (extensions.length > 0) {
-				processExtensions(new SubProgressMonitor(monitor, extensions.length), extensions);
-			}
-		} finally {
-			monitor.done();
-		}
-	}
-
-	protected void processExtensions(IProgressMonitor monitor, IExtension[] extensions) {
-		monitor.beginTask(Messages.BundleDiscoveryStrategy_task_processing_extensions, extensions.length == 0 ? 1
-				: extensions.length);
-		try {
-			ConnectorDiscoveryExtensionReader extensionReader = new ConnectorDiscoveryExtensionReader();
-
-			for (IExtension extension : extensions) {
-				AbstractDiscoverySource discoverySource = computeDiscoverySource(extension.getContributor());
-				IConfigurationElement[] elements = extension.getConfigurationElements();
-				for (IConfigurationElement element : elements) {
-					if (monitor.isCanceled()) {
-						return;
-					}
-					try {
-						if (ConnectorDiscoveryExtensionReader.CONNECTOR_DESCRIPTOR.equals(element.getName())) {
-							DiscoveryConnector descriptor = extensionReader.readConnectorDescriptor(element,
-									DiscoveryConnector.class);
-							descriptor.setSource(discoverySource);
-							connectors.add(descriptor);
-						} else if (ConnectorDiscoveryExtensionReader.CONNECTOR_CATEGORY.equals(element.getName())) {
-							DiscoveryCategory category = extensionReader.readConnectorCategory(element,
-									DiscoveryCategory.class);
-							category.setSource(discoverySource);
-							categories.add(category);
-						} else {
-							throw new ValidationException(NLS.bind(Messages.BundleDiscoveryStrategy_unexpected_element,
-									element.getName()));
-						}
-					} catch (ValidationException e) {
-						StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
-								NLS.bind(Messages.BundleDiscoveryStrategy_3, element.getContributor().getName(),
-										e.getMessage()), e));
-					}
-				}
-				monitor.worked(1);
-			}
-		} finally {
-			monitor.done();
-		}
-	}
-
-	protected AbstractDiscoverySource computeDiscoverySource(IContributor contributor) {
-		return new BundleDiscoverySource(Platform.getBundle(contributor.getName()));
-	}
-
-	protected IExtensionRegistry getExtensionRegistry() {
-		return Platform.getExtensionRegistry();
-	}
-
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorCategory.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorCategory.java
deleted file mode 100644
index aae4714..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorCategory.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-/**
- * a category of connectors, which is a way of organizing connectors in top-level groups.
- * 
- * @author David Green
- */
-public class ConnectorCategory {
-
-	protected String id;
-
-	protected String name;
-
-	protected String description;
-
-	protected Icon icon;
-
-	public ConnectorCategory() {
-	}
-
-	/**
-	 * an id that uniquely identifies the category
-	 */
-	public String getId() {
-		return id;
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	/**
-	 * the name of the category, as it is displayed in the ui.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * A description of the category
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	public Icon getIcon() {
-		return icon;
-	}
-
-	public void setIcon(Icon icon) {
-		this.icon = icon;
-	}
-
-	public void validate() throws ValidationException {
-		if (id == null || id.length() == 0) {
-			throw new ValidationException(Messages.ConnectorCategory_must_specify_connectorCategory_id);
-		}
-		if (name == null || name.length() == 0) {
-			throw new ValidationException(Messages.ConnectorCategory_must_specify_connectorCategory_name);
-		}
-		if (icon != null) {
-			icon.validate();
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptor.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptor.java
deleted file mode 100644
index 1fa6114..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptor.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.net.MalformedURLException;
-
-/**
- * A description of a connector, including kind, description, licensing and brand.
- * 
- * @author David Green
- */
-public class ConnectorDescriptor {
-
-	protected ConnectorDescriptorKind kind;
-
-	protected String name;
-
-	protected String provider;
-
-	protected String license;
-
-	protected String description;
-
-	protected String siteUrl;
-
-	protected String id;
-
-	protected String categoryId;
-
-	protected String platformFilter;
-
-	protected Icon icon;
-
-	protected Overview overview;
-
-	public ConnectorDescriptor() {
-	}
-
-	/**
-	 * must be one of 'document', 'task', 'vcs'
-	 */
-	public ConnectorDescriptorKind getKind() {
-		return kind;
-	}
-
-	public void setKind(ConnectorDescriptorKind kind) {
-		this.kind = kind;
-	}
-
-	/**
-	 * the name of the connector including the name of the organization that produces the repository if appropriate, for
-	 * example 'Mozilla Bugzilla'.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	/**
-	 * The name of the organization that supplies the connector.
-	 */
-	public String getProvider() {
-		return provider;
-	}
-
-	public void setProvider(String provider) {
-		this.provider = provider;
-	}
-
-	/**
-	 * The short name of the license, for example 'EPL 1.0', 'GPL 2.0', or 'Commercial'.
-	 */
-	public String getLicense() {
-		return license;
-	}
-
-	public void setLicense(String license) {
-		this.license = license;
-	}
-
-	/**
-	 * A description of the connector. Plug-ins should provide a description, especially if the description is not
-	 * self-evident from the @name and
-	 * 
-	 * @organization.
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	/**
-	 * The URL of the update site containing the connector.
-	 */
-	public String getSiteUrl() {
-		return siteUrl;
-	}
-
-	public void setSiteUrl(String siteUrl) {
-		this.siteUrl = siteUrl;
-	}
-
-	/**
-	 * The id of the feature that installs this connector
-	 */
-	public String getId() {
-		return id;
-	}
-
-	public void setId(String id) {
-		this.id = id;
-	}
-
-	/**
-	 * the id of the connectorCategory in which this connector belongs
-	 */
-	public String getCategoryId() {
-		return categoryId;
-	}
-
-	public void setCategoryId(String categoryId) {
-		this.categoryId = categoryId;
-	}
-
-	/**
-	 * E.g., "(& (osgi.os=macosx) (osgi.ws=carbon))"
-	 */
-	public String getPlatformFilter() {
-		return platformFilter;
-	}
-
-	public void setPlatformFilter(String platformFilter) {
-		this.platformFilter = platformFilter;
-	}
-
-	public Icon getIcon() {
-		return icon;
-	}
-
-	public void setIcon(Icon icon) {
-		this.icon = icon;
-	}
-
-	public Overview getOverview() {
-		return overview;
-	}
-
-	public void setOverview(Overview overview) {
-		this.overview = overview;
-	}
-
-	public void validate() throws ValidationException {
-		if (kind == null) {
-			throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_kind);
-		}
-		if (name == null || name.length() == 0) {
-			throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_name);
-		}
-		if (provider == null || provider.length() == 0) {
-			throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_provider);
-		}
-		if (license == null || license.length() == 0) {
-			throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_license);
-		}
-		if (siteUrl == null || siteUrl.length() == 0) {
-			throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_siteUrl);
-		}
-		try {
-			new java.net.URL(siteUrl);
-		} catch (MalformedURLException e) {
-			throw new ValidationException(Messages.ConnectorDescriptor_invalid_connectorDescriptor_siteUrl);
-		}
-		if (id == null || id.length() == 0) {
-			throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_id);
-		}
-		if (categoryId == null || categoryId.length() == 0) {
-			throw new ValidationException(Messages.ConnectorDescriptor_must_specify_connectorDescriptor_categoryId);
-		}
-		if (icon != null) {
-			icon.validate();
-		}
-		if (overview != null) {
-			overview.validate();
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptorKind.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptorKind.java
deleted file mode 100644
index 6b5afc8..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDescriptorKind.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-/**
- * @author David Green
- */
-public enum ConnectorDescriptorKind {
-
-	DOCUMENT("document"), //$NON-NLS-1$
-	TASK("task"), //$NON-NLS-1$
-	VCS("vcs"); //$NON-NLS-1$
-
-	private final String value;
-
-	private ConnectorDescriptorKind(String value) {
-		this.value = value;
-	}
-
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * return the enum constant whose {@link #getValue() value} is the same as the given value.
-	 * 
-	 * @param value
-	 *            the string value, or null
-	 * 
-	 * @return the corresponding enum constant or null if the given value was null
-	 * 
-	 * @throws IllegalArgumentException
-	 *             if the given value does not correspond to any enum constant
-	 */
-	public static ConnectorDescriptorKind fromValue(String value) throws IllegalArgumentException {
-		if (value == null) {
-			return null;
-		}
-		for (ConnectorDescriptorKind e : values()) {
-			if (e.getValue().equals(value)) {
-				return e;
-			}
-		}
-		throw new IllegalArgumentException(value);
-	}
-
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscovery.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscovery.java
deleted file mode 100644
index c57040a..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscovery.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Dictionary;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.InvalidSyntaxException;
-
-/**
- * A means of discovering connectors.
- * 
- * @author David Green
- */
-public class ConnectorDiscovery {
-
-	private List<DiscoveryConnector> connectors = Collections.emptyList();
-
-	private List<DiscoveryCategory> categories = Collections.emptyList();
-
-	private final List<AbstractDiscoveryStrategy> discoveryStrategies = new ArrayList<AbstractDiscoveryStrategy>();
-
-	private Dictionary<Object, Object> environment = System.getProperties();
-
-	public ConnectorDiscovery() {
-	}
-
-	/**
-	 * get the discovery strategies to use.
-	 */
-	public List<AbstractDiscoveryStrategy> getDiscoveryStrategies() {
-		return discoveryStrategies;
-	}
-
-	/**
-	 * Initialize this by performing discovery. Discovery may take a long time as it involves network access.
-	 * PRECONDITION: must add at least one {@link #getDiscoveryStrategies() discovery strategy} prior to calling.
-	 * 
-	 */
-	public void performDiscovery(IProgressMonitor monitor) throws CoreException {
-		if (discoveryStrategies.isEmpty()) {
-			throw new IllegalStateException();
-		}
-		connectors = new ArrayList<DiscoveryConnector>();
-		categories = new ArrayList<DiscoveryCategory>();
-
-		final int totalTicks = 10000;
-		monitor.beginTask(Messages.ConnectorDiscovery_task_discovering_connectors, totalTicks);
-		try {
-			// FIXME: policy for where categories can be declared
-			for (AbstractDiscoveryStrategy discoveryStrategy : discoveryStrategies) {
-				discoveryStrategy.setCategories(categories);
-				discoveryStrategy.setConnectors(connectors);
-				discoveryStrategy.performDiscovery(new SubProgressMonitor(monitor, totalTicks
-						/ discoveryStrategies.size()));
-			}
-
-			filterDescriptors();
-			connectCategoriesToDescriptors();
-		} finally {
-			monitor.done();
-		}
-	}
-
-	/**
-	 * get the top-level categories
-	 * 
-	 * @return the categories, or an empty list if there are none.
-	 */
-	public List<DiscoveryCategory> getCategories() {
-		return categories;
-	}
-
-	/**
-	 * get the connectors
-	 * 
-	 * @return the connectors, or an empty list if there are none.
-	 */
-	public List<DiscoveryConnector> getConnectors() {
-		return connectors;
-	}
-
-	/**
-	 * The environment used to resolve {@link ConnectorDescriptor#getPlatformFilter() platform filters}. Defaults to the
-	 * current environment.
-	 */
-	public Dictionary<Object, Object> getEnvironment() {
-		return environment;
-	}
-
-	/**
-	 * The environment used to resolve {@link ConnectorDescriptor#getPlatformFilter() platform filters}. Defaults to the
-	 * current environment.
-	 */
-	public void setEnvironment(Dictionary<Object, Object> environment) {
-		if (environment == null) {
-			throw new IllegalArgumentException();
-		}
-		this.environment = environment;
-	}
-
-	private void connectCategoriesToDescriptors() {
-		Map<String, DiscoveryCategory> idToCategory = new HashMap<String, DiscoveryCategory>();
-		for (DiscoveryCategory category : categories) {
-			DiscoveryCategory previous = idToCategory.put(category.getId(), category);
-			if (previous != null) {
-				StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
-						Messages.ConnectorDiscovery_duplicate_category_id, new Object[] { category.getId(),
-								category.getSource().getId(), previous.getSource().getId() })));
-			}
-		}
-
-		for (DiscoveryConnector connector : connectors) {
-			DiscoveryCategory category = idToCategory.get(connector.getCategoryId());
-			if (category != null) {
-				category.getConnectors().add(connector);
-				connector.setCategory(category);
-			} else {
-				StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
-						Messages.ConnectorDiscovery_bundle_references_unknown_category, new Object[] {
-								connector.getCategoryId(), connector.getId(), connector.getSource().getId() })));
-			}
-		}
-	}
-
-	/**
-	 * eliminate any connectors whose {@link ConnectorDescriptor#getPlatformFilter() platform filters} don't match
-	 */
-	private void filterDescriptors() {
-		for (DiscoveryConnector connector : new ArrayList<DiscoveryConnector>(connectors)) {
-			if (connector.getPlatformFilter() != null && connector.getPlatformFilter().trim().length() > 0) {
-				boolean match = false;
-				try {
-					Filter filter = FrameworkUtil.createFilter(connector.getPlatformFilter());
-					match = filter.match(environment);
-				} catch (InvalidSyntaxException e) {
-					StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
-							Messages.ConnectorDiscovery_illegal_filter_syntax, new Object[] {
-									connector.getPlatformFilter(), connector.getId(), connector.getSource().getId() })));
-				}
-				if (!match) {
-					connectors.remove(connector);
-				}
-			}
-		}
-	}
-
-	public void dispose() {
-		for (final AbstractDiscoveryStrategy strategy : discoveryStrategies) {
-			SafeRunner.run(new ISafeRunnable() {
-
-				public void run() throws Exception {
-					strategy.dispose();
-				}
-
-				public void handleException(Throwable exception) {
-					StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
-							"exception disposing " + strategy.getClass().getName(), exception)); //$NON-NLS-1$
-				}
-			});
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscoveryExtensionReader.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscoveryExtensionReader.java
deleted file mode 100644
index 6b28331..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ConnectorDiscoveryExtensionReader.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-
-/**
- * Connector Discovery extension point reader, for extension points of type
- * <tt>org.eclipse.mylyn.discovery.core.connectorDiscovery</tt>
- * 
- * @author David Green
- */
-public class ConnectorDiscoveryExtensionReader {
-
-	public static final String EXTENSION_POINT_ID = "org.eclipse.mylyn.discovery.core.connectorDiscovery"; //$NON-NLS-1$
-
-	public static final String CONNECTOR_DESCRIPTOR = "connectorDescriptor"; //$NON-NLS-1$
-
-	public static final String CONNECTOR_CATEGORY = "connectorCategory"; //$NON-NLS-1$
-
-	public static final String ICON = "icon"; //$NON-NLS-1$
-
-	public static final String OVERVIEW = "overview"; //$NON-NLS-1$
-
-	public ConnectorDescriptor readConnectorDescriptor(IConfigurationElement element) throws ValidationException {
-		return readConnectorDescriptor(element, ConnectorDescriptor.class);
-	}
-
-	public <T extends ConnectorDescriptor> T readConnectorDescriptor(IConfigurationElement element, Class<T> clazz)
-			throws ValidationException {
-		T connectorDescriptor;
-		try {
-			connectorDescriptor = clazz.newInstance();
-		} catch (Exception e) {
-			throw new IllegalStateException(e);
-		}
-
-		try {
-			connectorDescriptor.setKind(ConnectorDescriptorKind.fromValue(element.getAttribute("kind"))); //$NON-NLS-1$
-		} catch (IllegalArgumentException e) {
-			throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_value_kind);
-		}
-		connectorDescriptor.setName(element.getAttribute("name")); //$NON-NLS-1$
-		connectorDescriptor.setProvider(element.getAttribute("provider")); //$NON-NLS-1$
-		connectorDescriptor.setLicense(element.getAttribute("license")); //$NON-NLS-1$
-		connectorDescriptor.setDescription(element.getAttribute("description")); //$NON-NLS-1$
-		connectorDescriptor.setSiteUrl(element.getAttribute("siteUrl")); //$NON-NLS-1$
-		connectorDescriptor.setId(element.getAttribute("id")); //$NON-NLS-1$
-		connectorDescriptor.setCategoryId(element.getAttribute("categoryId")); //$NON-NLS-1$
-		connectorDescriptor.setPlatformFilter(element.getAttribute("platformFilter")); //$NON-NLS-1$
-
-		for (IConfigurationElement child : element.getChildren("icon")) { //$NON-NLS-1$
-			Icon iconItem = readIcon(child);
-			iconItem.setConnectorDescriptor(connectorDescriptor);
-			if (connectorDescriptor.getIcon() != null) {
-				throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_element_icon);
-			}
-			connectorDescriptor.setIcon(iconItem);
-		}
-		for (IConfigurationElement child : element.getChildren("overview")) { //$NON-NLS-1$
-			Overview overviewItem = readOverview(child);
-			overviewItem.setConnectorDescriptor(connectorDescriptor);
-			if (connectorDescriptor.getOverview() != null) {
-				throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_element_overview);
-			}
-			connectorDescriptor.setOverview(overviewItem);
-		}
-
-		connectorDescriptor.validate();
-
-		return connectorDescriptor;
-	}
-
-	public ConnectorCategory readConnectorCategory(IConfigurationElement element) throws ValidationException {
-		return readConnectorCategory(element, ConnectorCategory.class);
-	}
-
-	public <T extends ConnectorCategory> T readConnectorCategory(IConfigurationElement element, Class<T> clazz)
-			throws ValidationException {
-		T connectorCategory;
-		try {
-			connectorCategory = clazz.newInstance();
-		} catch (Exception e) {
-			throw new IllegalStateException(e);
-		}
-
-		connectorCategory.setId(element.getAttribute("id")); //$NON-NLS-1$
-		connectorCategory.setName(element.getAttribute("name")); //$NON-NLS-1$
-		connectorCategory.setDescription(element.getAttribute("description")); //$NON-NLS-1$
-
-		for (IConfigurationElement child : element.getChildren("icon")) { //$NON-NLS-1$
-			Icon iconItem = readIcon(child);
-			iconItem.setConnectorCategory(connectorCategory);
-			if (connectorCategory.getIcon() != null) {
-				throw new ValidationException(Messages.ConnectorDiscoveryExtensionReader_unexpected_element_icon);
-			}
-			connectorCategory.setIcon(iconItem);
-		}
-
-		connectorCategory.validate();
-
-		return connectorCategory;
-	}
-
-	public Icon readIcon(IConfigurationElement element) throws ValidationException {
-		Icon icon = new Icon();
-
-		icon.setImage16(element.getAttribute("image16")); //$NON-NLS-1$
-		icon.setImage32(element.getAttribute("image32")); //$NON-NLS-1$
-		icon.setImage48(element.getAttribute("image48")); //$NON-NLS-1$
-		icon.setImage64(element.getAttribute("image64")); //$NON-NLS-1$
-		icon.setImage128(element.getAttribute("image128")); //$NON-NLS-1$
-
-		icon.validate();
-
-		return icon;
-	}
-
-	public Overview readOverview(IConfigurationElement element) throws ValidationException {
-		Overview overview = new Overview();
-
-		overview.setSummary(element.getAttribute("summary")); //$NON-NLS-1$
-		overview.setUrl(element.getAttribute("url")); //$NON-NLS-1$
-		overview.setScreenshot(element.getAttribute("screenshot")); //$NON-NLS-1$
-
-		overview.validate();
-
-		return overview;
-	}
-
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Directory.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Directory.java
deleted file mode 100644
index 37c33c7..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Directory.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A directory representing locations of discovery sources.
- * 
- * @author David Green
- */
-public class Directory {
-	/**
-	 * an entry in the directory, which represents a specific discovery source. Future versions of this class may
-	 * include policy or other attributes declared by the directory.
-	 */
-	public static final class Entry {
-		private String location;
-
-		public Entry() {
-		}
-
-		public String getLocation() {
-			return location;
-		}
-
-		public void setLocation(String location) {
-			this.location = location;
-		}
-	}
-
-	private final List<Entry> entries = new ArrayList<Entry>();
-
-	public List<Entry> getEntries() {
-		return entries;
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DirectoryParser.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DirectoryParser.java
deleted file mode 100644
index d431e4f..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DirectoryParser.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.io.IOException;
-import java.io.Reader;
-
-import org.eclipse.mylyn.internal.discovery.core.model.Directory.Entry;
-import org.eclipse.mylyn.internal.discovery.core.util.DefaultSaxErrorHandler;
-import org.eclipse.mylyn.internal.discovery.core.util.IOWithCauseException;
-import org.eclipse.osgi.util.NLS;
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- * A parser for {@link Directory directories}.
- * 
- * @author David Green
- */
-public class DirectoryParser {
-	/**
-	 * parse the contents of a directory. The caller must close the given reader.
-	 * 
-	 * @param directoryContents
-	 *            the contents of the directory
-	 * @return a directory with 0 or more entries
-	 * @throws IOException
-	 *             if the directory cannot be read.
-	 */
-	public Directory parse(Reader directoryContents) throws IOException {
-		XMLReader xmlReader;
-		try {
-			xmlReader = XMLReaderFactory.createXMLReader();
-		} catch (SAXException e) {
-			throw new IOWithCauseException(e.getMessage(), e);
-		}
-		xmlReader.setErrorHandler(new DefaultSaxErrorHandler());
-
-		DirectoryContentHandler contentHandler = new DirectoryContentHandler();
-		xmlReader.setContentHandler(contentHandler);
-
-		try {
-			xmlReader.parse(new InputSource(directoryContents));
-		} catch (SAXException e) {
-			throw new IOWithCauseException(e.getMessage(), e);
-		}
-
-		if (contentHandler.directory == null) {
-			throw new IOException(Messages.DirectoryParser_no_directory);
-		}
-
-		return contentHandler.directory;
-	}
-
-	private class DirectoryContentHandler implements ContentHandler {
-
-		Directory directory;
-
-		public void characters(char[] ch, int start, int length) throws SAXException {
-			// ignore
-		}
-
-		public void endDocument() throws SAXException {
-			// ignore
-		}
-
-		public void endElement(String uri, String localName, String qName) throws SAXException {
-			// ignore
-		}
-
-		public void endPrefixMapping(String prefix) throws SAXException {
-			// ignore
-		}
-
-		public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
-			// ignore
-		}
-
-		public void processingInstruction(String target, String data) throws SAXException {
-			// ignore
-		}
-
-		public void setDocumentLocator(Locator locator) {
-			// ignore
-		}
-
-		public void skippedEntity(String name) throws SAXException {
-			// ignore
-		}
-
-		public void startDocument() throws SAXException {
-			// ignore
-		}
-
-		public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
-			if ("directory".equals(localName)) { //$NON-NLS-1$
-				if (directory != null) {
-					unexpectedElement(localName);
-				}
-				directory = new Directory();
-			} else if (directory != null && "entry".equals(localName)) { //$NON-NLS-1$
-				String url = atts.getValue("", "url"); //$NON-NLS-1$ //$NON-NLS-2$
-				if (url != null && url.length() > 0) {
-					Entry entry = new Entry();
-					entry.setLocation(url);
-					directory.getEntries().add(entry);
-				}
-			}
-			// else ignore
-		}
-
-		private void unexpectedElement(String localName) throws SAXException {
-			throw new SAXException(NLS.bind(Messages.DirectoryParser_unexpected_element, localName));
-		}
-
-		public void startPrefixMapping(String prefix, String uri) throws SAXException {
-			// ignore
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryCategory.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryCategory.java
deleted file mode 100644
index 453e808..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryCategory.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 
- * @author David Green
- */
-public class DiscoveryCategory extends ConnectorCategory {
-	private AbstractDiscoverySource source;
-
-	private List<DiscoveryConnector> connectors = new ArrayList<DiscoveryConnector>();
-
-	public List<DiscoveryConnector> getConnectors() {
-		return connectors;
-	}
-
-	public AbstractDiscoverySource getSource() {
-		return source;
-	}
-
-	public void setSource(AbstractDiscoverySource source) {
-		this.source = source;
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryConnector.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryConnector.java
deleted file mode 100644
index d9faab8..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryConnector.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-/**
- * 
- * @author David Green
- */
-public class DiscoveryConnector extends ConnectorDescriptor {
-	private AbstractDiscoverySource source;
-
-	private DiscoveryCategory category;
-
-	private boolean selected;
-
-	public DiscoveryCategory getCategory() {
-		return category;
-	}
-
-	public void setCategory(DiscoveryCategory category) {
-		this.category = category;
-	}
-
-	public AbstractDiscoverySource getSource() {
-		return source;
-	}
-
-	public void setSource(AbstractDiscoverySource source) {
-		this.source = source;
-	}
-
-	/**
-	 * support selection
-	 * 
-	 * @return true if the item is selected, otherwise false
-	 */
-	public boolean isSelected() {
-		return selected;
-	}
-
-	/**
-	 * support selection
-	 * 
-	 * @param selected
-	 *            true if the item is selected, otherwise false
-	 */
-	public void setSelected(boolean selected) {
-		this.selected = selected;
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryRegistryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryRegistryStrategy.java
deleted file mode 100644
index 74d346e..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/DiscoveryRegistryStrategy.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.PropertyResourceBundle;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
-import org.eclipse.core.runtime.IContributor;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.spi.IDynamicExtensionRegistry;
-import org.eclipse.core.runtime.spi.RegistryContributor;
-import org.eclipse.core.runtime.spi.RegistryStrategy;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
-import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.Bundle;
-
-/**
- * 
- * @author David Green
- */
-public class DiscoveryRegistryStrategy extends RegistryStrategy {
-
-	private Set<File> bundleFiles = new HashSet<File>();
-
-	private final List<JarFile> jars = new ArrayList<JarFile>();
-
-	private final Map<IContributor, File> contributorToJarFile = new HashMap<IContributor, File>();
-
-	private final Object token;
-
-	public DiscoveryRegistryStrategy(File[] storageDirs, boolean[] cacheReadOnly, Object token) {
-		super(storageDirs, cacheReadOnly);
-		this.token = token;
-	}
-
-	@Override
-	public void onStart(IExtensionRegistry registry, boolean loadedFromCache) {
-		super.onStart(registry, loadedFromCache);
-		if (!loadedFromCache) {
-			processDiscoveryCoreBundle(registry);
-			processBundles(registry);
-		}
-	}
-
-	private void processDiscoveryCoreBundle(IExtensionRegistry registry) {
-		// we must add a contribution from the core bundle so that we get the
-		// extension point itself
-		try {
-			Bundle bundle = Platform.getBundle(DiscoveryCore.ID_PLUGIN);
-			IContributor contributor = new RegistryContributor(bundle.getSymbolicName(), bundle.getSymbolicName(),
-					null, null);
-
-			InputStream inputStream = bundle.getEntry("plugin.xml").openStream(); //$NON-NLS-1$
-			try {
-				registry.addContribution(inputStream, contributor, false, bundle.getSymbolicName(), null, token);
-			} finally {
-				inputStream.close();
-			}
-		} catch (IOException e) {
-			throw new IllegalStateException();
-		}
-	}
-
-	public Set<File> getBundleFiles() {
-		return bundleFiles;
-	}
-
-	public void setBundleFiles(Set<File> bundleFiles) {
-		this.bundleFiles = bundleFiles;
-	}
-
-	private void processBundles(IExtensionRegistry registry) {
-		if (bundleFiles == null) {
-			throw new IllegalStateException();
-		}
-		for (File bundleFile : bundleFiles) {
-			try {
-				processBundle(registry, bundleFile);
-			} catch (Exception e) {
-				StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
-						Messages.DiscoveryRegistryStrategy_cannot_load_bundle, bundleFile.getName(), e.getMessage()), e));
-			}
-		}
-	}
-
-	private void processBundle(IExtensionRegistry registry, File bundleFile) throws IOException {
-		JarFile jarFile = new JarFile(bundleFile);
-		jars.add(jarFile);
-
-		ZipEntry pluginXmlEntry = jarFile.getEntry("plugin.xml"); //$NON-NLS-1$
-		if (pluginXmlEntry == null) {
-			throw new IOException(Messages.DiscoveryRegistryStrategy_missing_pluginxml);
-		}
-		IContributor contributor = new RegistryContributor(bundleFile.getName(), bundleFile.getName(), null, null);
-		if (((IDynamicExtensionRegistry) registry).hasContributor(contributor)) {
-			jarFile.close();
-			return;
-		}
-		contributorToJarFile.put(contributor, bundleFile);
-
-		ResourceBundle translationBundle = loadTranslationBundle(jarFile);
-
-		InputStream inputStream = jarFile.getInputStream(pluginXmlEntry);
-		try {
-			registry.addContribution(inputStream, contributor, false, bundleFile.getPath(), translationBundle, token);
-		} finally {
-			inputStream.close();
-		}
-	}
-
-	private ResourceBundle loadTranslationBundle(JarFile jarFile) throws IOException {
-		List<String> bundleNames = computeBundleNames("plugin"); //$NON-NLS-1$
-		for (String bundleName : bundleNames) {
-			ZipEntry entry = jarFile.getEntry(bundleName);
-			if (entry != null) {
-				InputStream inputStream = jarFile.getInputStream(entry);
-				try {
-					PropertyResourceBundle resourceBundle = new PropertyResourceBundle(inputStream);
-					return resourceBundle;
-				} finally {
-					inputStream.close();
-				}
-			}
-		}
-		return null;
-	}
-
-	private List<String> computeBundleNames(String baseName) {
-		String suffix = ".properties"; //$NON-NLS-1$
-		String name = baseName;
-		List<String> bundleNames = new ArrayList<String>();
-		Locale locale = Locale.getDefault();
-		bundleNames.add(name + suffix);
-		if (locale.getLanguage() != null && locale.getLanguage().length() > 0) {
-			name = name + '_' + locale.getLanguage();
-			bundleNames.add(0, name + suffix);
-		}
-		if (locale.getCountry() != null && locale.getCountry().length() > 0) {
-			name = name + '_' + locale.getCountry();
-			bundleNames.add(0, name + suffix);
-		}
-		if (locale.getVariant() != null && locale.getVariant().length() > 0) {
-			name = name + '_' + locale.getVariant();
-			bundleNames.add(0, name + suffix);
-		}
-		return bundleNames;
-	}
-
-	@Override
-	public void onStop(IExtensionRegistry registry) {
-		try {
-			super.onStop(registry);
-		} finally {
-			for (JarFile jar : jars) {
-				try {
-					jar.close();
-				} catch (Exception e) {
-				}
-			}
-			jars.clear();
-		}
-	}
-
-	/**
-	 * get the jar file that corresponds to the given contributor.
-	 * 
-	 * @throws IllegalArgumentException
-	 *             if the given contributor is unknown
-	 */
-	public File getJarFile(IContributor contributor) {
-		File file = contributorToJarFile.get(contributor);
-		if (file == null) {
-			throw new IllegalArgumentException(contributor.getName());
-		}
-		return file;
-	}
-
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Icon.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Icon.java
deleted file mode 100644
index 4058f60..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Icon.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-/**
- * @author David Green
- */
-public class Icon {
-
-	protected String image16;
-
-	protected String image32;
-
-	protected String image48;
-
-	protected String image64;
-
-	protected String image128;
-
-	protected ConnectorDescriptor connectorDescriptor;
-
-	protected ConnectorCategory connectorCategory;
-
-	public Icon() {
-	}
-
-	public String getImage16() {
-		return image16;
-	}
-
-	public void setImage16(String image16) {
-		this.image16 = image16;
-	}
-
-	public String getImage32() {
-		return image32;
-	}
-
-	public void setImage32(String image32) {
-		this.image32 = image32;
-	}
-
-	public String getImage48() {
-		return image48;
-	}
-
-	public void setImage48(String image48) {
-		this.image48 = image48;
-	}
-
-	public String getImage64() {
-		return image64;
-	}
-
-	public void setImage64(String image64) {
-		this.image64 = image64;
-	}
-
-	public String getImage128() {
-		return image128;
-	}
-
-	public void setImage128(String image128) {
-		this.image128 = image128;
-	}
-
-	public ConnectorDescriptor getConnectorDescriptor() {
-		return connectorDescriptor;
-	}
-
-	public void setConnectorDescriptor(ConnectorDescriptor connectorDescriptor) {
-		this.connectorDescriptor = connectorDescriptor;
-	}
-
-	public ConnectorCategory getConnectorCategory() {
-		return connectorCategory;
-	}
-
-	public void setConnectorCategory(ConnectorCategory connectorCategory) {
-		this.connectorCategory = connectorCategory;
-	}
-
-	public void validate() throws ValidationException {
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/JarDiscoverySource.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/JarDiscoverySource.java
deleted file mode 100644
index 5c44acd..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/JarDiscoverySource.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLEncoder;
-
-/**
- * 
- * @author David Green
- */
-public class JarDiscoverySource extends AbstractDiscoverySource {
-
-	private final String id;
-
-	private final File jarFile;
-
-	public JarDiscoverySource(String id, File jarFile) {
-		this.id = id;
-		this.jarFile = jarFile;
-	}
-
-	@Override
-	public Object getId() {
-		return id;
-	}
-
-	@Override
-	public URL getResource(String resourceName) {
-		try {
-			String prefix = jarFile.toURI().toURL().toExternalForm();
-
-			return new URL("jar:" + prefix + "!/" + URLEncoder.encode(resourceName, "utf-8")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		} catch (MalformedURLException e) {
-			throw new IllegalStateException(e);
-		} catch (UnsupportedEncodingException e) {
-			throw new IllegalStateException(e);
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Messages.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Messages.java
deleted file mode 100644
index a692e9c..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Messages.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- * @author David Green
- */
-class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.discovery.core.model.messages"; //$NON-NLS-1$
-
-	public static String BundleDiscoveryStrategy_3;
-
-	public static String BundleDiscoveryStrategy_task_loading_local_extensions;
-
-	public static String BundleDiscoveryStrategy_task_processing_extensions;
-
-	public static String BundleDiscoveryStrategy_unexpected_element;
-
-	public static String ConnectorCategory_must_specify_connectorCategory_id;
-
-	public static String ConnectorCategory_must_specify_connectorCategory_name;
-
-	public static String ConnectorDescriptor_invalid_connectorDescriptor_siteUrl;
-
-	public static String ConnectorDescriptor_must_specify_connectorDescriptor_categoryId;
-
-	public static String ConnectorDescriptor_must_specify_connectorDescriptor_id;
-
-	public static String ConnectorDescriptor_must_specify_connectorDescriptor_kind;
-
-	public static String ConnectorDescriptor_must_specify_connectorDescriptor_license;
-
-	public static String ConnectorDescriptor_must_specify_connectorDescriptor_name;
-
-	public static String ConnectorDescriptor_must_specify_connectorDescriptor_provider;
-
-	public static String ConnectorDescriptor_must_specify_connectorDescriptor_siteUrl;
-
-	public static String ConnectorDiscovery_bundle_references_unknown_category;
-
-	public static String ConnectorDiscovery_duplicate_category_id;
-
-	public static String ConnectorDiscovery_illegal_filter_syntax;
-
-	public static String ConnectorDiscovery_task_discovering_connectors;
-
-	public static String ConnectorDiscoveryExtensionReader_unexpected_element_icon;
-
-	public static String ConnectorDiscoveryExtensionReader_unexpected_element_overview;
-
-	public static String ConnectorDiscoveryExtensionReader_unexpected_value_kind;
-
-	public static String DirectoryParser_no_directory;
-
-	public static String DirectoryParser_unexpected_element;
-
-	public static String DiscoveryRegistryStrategy_cannot_load_bundle;
-
-	public static String DiscoveryRegistryStrategy_missing_pluginxml;
-
-	public static String RemoteBundleDiscoveryStrategy_cannot_download_bundle;
-
-	public static String RemoteBundleDiscoveryStrategy_empty_directory;
-
-	public static String RemoteBundleDiscoveryStrategy_io_failure_discovery_directory;
-
-	public static String RemoteBundleDiscoveryStrategy_io_failure_temp_storage;
-
-	public static String RemoteBundleDiscoveryStrategy_task_remote_discovery;
-
-	public static String RemoteBundleDiscoveryStrategy_unrecognized_discovery_url;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Overview.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Overview.java
deleted file mode 100644
index ba3f9bd..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/Overview.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-/**
- * @author David Green
- */
-public class Overview {
-
-	protected String summary;
-
-	protected String url;
-
-	protected String screenshot;
-
-	protected ConnectorDescriptor connectorDescriptor;
-
-	public Overview() {
-	}
-
-	public String getSummary() {
-		return summary;
-	}
-
-	public void setSummary(String summary) {
-		this.summary = summary;
-	}
-
-	/**
-	 * HTML
-	 */
-	public String getUrl() {
-		return url;
-	}
-
-	public void setUrl(String url) {
-		this.url = url;
-	}
-
-	/**
-	 * 320x240 PNG, JPEG or GIF
-	 */
-	public String getScreenshot() {
-		return screenshot;
-	}
-
-	public void setScreenshot(String screenshot) {
-		this.screenshot = screenshot;
-	}
-
-	public ConnectorDescriptor getConnectorDescriptor() {
-		return connectorDescriptor;
-	}
-
-	public void setConnectorDescriptor(ConnectorDescriptor connectorDescriptor) {
-		this.connectorDescriptor = connectorDescriptor;
-	}
-
-	public void validate() throws ValidationException {
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/RemoteBundleDiscoveryStrategy.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/RemoteBundleDiscoveryStrategy.java
deleted file mode 100644
index 604d453..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/RemoteBundleDiscoveryStrategy.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.internal.registry.ExtensionRegistry;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IContributor;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.commons.net.WebLocation;
-import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
-import org.eclipse.mylyn.internal.discovery.core.util.WebUtil;
-import org.eclipse.mylyn.internal.discovery.core.util.WebUtil.TextContentProcessor;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * A discovery strategy that downloads a simple directory of remote jars. The directory is first downloaded, then each
- * remote jar is downloaded.
- * 
- * @author David Green
- */
-@SuppressWarnings("restriction")
-public class RemoteBundleDiscoveryStrategy extends BundleDiscoveryStrategy {
-
-	private String directoryUrl;
-
-	private DiscoveryRegistryStrategy registryStrategy;
-
-	private File temporaryStorage;
-
-	@Override
-	public void performDiscovery(IProgressMonitor monitor) throws CoreException {
-		if (connectors == null || categories == null || directoryUrl == null) {
-			throw new IllegalStateException();
-		}
-		if (registryStrategy != null) {
-			throw new IllegalStateException();
-		}
-
-		final int totalTicks = 100000;
-		final int ticksTenPercent = totalTicks / 10;
-		monitor.beginTask(Messages.RemoteBundleDiscoveryStrategy_task_remote_discovery, totalTicks);
-		try {
-			File registryCacheFolder;
-			try {
-				if (temporaryStorage != null && temporaryStorage.exists()) {
-					delete(temporaryStorage);
-				}
-				temporaryStorage = File.createTempFile(RemoteBundleDiscoveryStrategy.class.getSimpleName(), ".tmp"); //$NON-NLS-1$
-				temporaryStorage.delete();
-				if (!temporaryStorage.mkdirs()) {
-					throw new IOException();
-				}
-				registryCacheFolder = new File(temporaryStorage, ".rcache"); //$NON-NLS-1$
-				if (!registryCacheFolder.mkdirs()) {
-					throw new IOException();
-				}
-			} catch (IOException e) {
-				throw new CoreException(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
-						Messages.RemoteBundleDiscoveryStrategy_io_failure_temp_storage, e));
-			}
-			if (monitor.isCanceled()) {
-				return;
-			}
-
-			Directory directory;
-
-			// FIXME: Eclipse network/proxy settings
-			WebLocation webLocation = new WebLocation(directoryUrl);
-			try {
-				final Directory[] temp = new Directory[1];
-				WebUtil.readResource(webLocation, new TextContentProcessor() {
-					public void process(Reader reader) throws IOException {
-						DirectoryParser parser = new DirectoryParser();
-						temp[0] = parser.parse(reader);
-					}
-				}, new SubProgressMonitor(monitor, ticksTenPercent));
-				directory = temp[0];
-				if (directory == null) {
-					throw new IllegalStateException();
-				}
-			} catch (IOException e) {
-				throw new CoreException(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
-						Messages.RemoteBundleDiscoveryStrategy_io_failure_discovery_directory, e));
-			}
-			if (monitor.isCanceled()) {
-				return;
-			}
-			if (directory.getEntries().isEmpty()) {
-				throw new CoreException(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN,
-						Messages.RemoteBundleDiscoveryStrategy_empty_directory));
-			}
-
-			Set<File> bundles = new HashSet<File>();
-
-			// TODO: multithreaded downloading
-			for (Directory.Entry entry : directory.getEntries()) {
-				String bundleUrl = entry.getLocation();
-				try {
-					if (!bundleUrl.startsWith("http://") && !bundleUrl.startsWith("https://")) { //$NON-NLS-1$//$NON-NLS-2$
-						StatusHandler.log(new Status(IStatus.WARNING, DiscoveryCore.ID_PLUGIN, NLS.bind(
-								Messages.RemoteBundleDiscoveryStrategy_unrecognized_discovery_url, bundleUrl)));
-						continue;
-					}
-					String lastPathElement = bundleUrl.lastIndexOf('/') == -1 ? bundleUrl
-							: bundleUrl.substring(bundleUrl.lastIndexOf('/'));
-					File target = File.createTempFile(
-							lastPathElement.replaceAll("^[a-zA-Z0-9_.]", "_") + "_", ".jar", temporaryStorage); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
-
-					if (monitor.isCanceled()) {
-						return;
-					}
-
-					// FIXME: Eclipse network/proxy settings
-					WebUtil.downloadResource(target, new WebLocation(bundleUrl), new SubProgressMonitor(monitor,
-							ticksTenPercent * 4 / directory.getEntries().size()));
-					bundles.add(target);
-				} catch (IOException e) {
-					StatusHandler.log(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, NLS.bind(
-							Messages.RemoteBundleDiscoveryStrategy_cannot_download_bundle, bundleUrl, e.getMessage()),
-							e));
-				}
-			}
-			try {
-				registryStrategy = new DiscoveryRegistryStrategy(new File[] { registryCacheFolder },
-						new boolean[] { false }, this);
-				registryStrategy.setBundleFiles(bundles);
-				IExtensionRegistry extensionRegistry = new ExtensionRegistry(registryStrategy, this, this);
-				try {
-					IExtensionPoint extensionPoint = extensionRegistry.getExtensionPoint(ConnectorDiscoveryExtensionReader.EXTENSION_POINT_ID);
-					if (extensionPoint != null) {
-						IExtension[] extensions = extensionPoint.getExtensions();
-						if (extensions.length > 0) {
-							processExtensions(new SubProgressMonitor(monitor, ticksTenPercent * 3), extensions);
-						}
-					}
-				} finally {
-					extensionRegistry.stop(this);
-				}
-			} finally {
-				registryStrategy = null;
-			}
-		} finally {
-			monitor.done();
-		}
-	}
-
-	private void delete(File file) {
-		if (file.exists()) {
-			if (file.isDirectory()) {
-				File[] children = file.listFiles();
-				if (children != null) {
-					for (File child : children) {
-						delete(child);
-					}
-				}
-			}
-			if (!file.delete()) {
-				// fail quietly
-			}
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		if (temporaryStorage != null) {
-			delete(temporaryStorage);
-		}
-	}
-
-	public String getDirectoryUrl() {
-		return directoryUrl;
-	}
-
-	public void setDirectoryUrl(String directoryUrl) {
-		this.directoryUrl = directoryUrl;
-	}
-
-	@Override
-	protected AbstractDiscoverySource computeDiscoverySource(IContributor contributor) {
-		return new JarDiscoverySource(contributor.getName(), registryStrategy.getJarFile(contributor));
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ValidationException.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ValidationException.java
deleted file mode 100644
index 1b59235..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/ValidationException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.model;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.internal.discovery.core.DiscoveryCore;
-
-/**
- * Indicate that a validation has occurred on the model.
- * 
- * @author David Green
- */
-public class ValidationException extends CoreException {
-
-	private static final long serialVersionUID = -7542361242327905294L;
-
-	public ValidationException(String message) {
-		super(new Status(IStatus.ERROR, DiscoveryCore.ID_PLUGIN, message));
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/messages.properties b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/messages.properties
deleted file mode 100644
index 73a4867..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/model/messages.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-BundleDiscoveryStrategy_3={0}: {1}
-BundleDiscoveryStrategy_task_loading_local_extensions=Loading local extensions
-BundleDiscoveryStrategy_task_processing_extensions=Processing extensions
-BundleDiscoveryStrategy_unexpected_element=unexpected element ''{0}''
-ConnectorCategory_must_specify_connectorCategory_id=Must specify connectorCategory/@id
-ConnectorCategory_must_specify_connectorCategory_name=Must specify connectorCategory/@name
-ConnectorDescriptor_invalid_connectorDescriptor_siteUrl=Invalid connectorDescriptor/@siteUrl
-ConnectorDescriptor_must_specify_connectorDescriptor_categoryId=Must specify connectorDescriptor/@categoryId
-ConnectorDescriptor_must_specify_connectorDescriptor_id=Must specify connectorDescriptor/@id
-ConnectorDescriptor_must_specify_connectorDescriptor_kind=Must specify connectorDescriptor/@kind
-ConnectorDescriptor_must_specify_connectorDescriptor_license=Must specify connectorDescriptor/@license
-ConnectorDescriptor_must_specify_connectorDescriptor_name=Must specify connectorDescriptor/@name
-ConnectorDescriptor_must_specify_connectorDescriptor_provider=Must specify connectorDescriptor/@provider
-ConnectorDescriptor_must_specify_connectorDescriptor_siteUrl=Must specify connectorDescriptor/@siteUrl
-ConnectorDiscovery_bundle_references_unknown_category=Unknown category ''{0}'' referenced by connector ''{1}'' declared in {2}
-ConnectorDiscovery_duplicate_category_id=Duplicate category id ''{0}'': declaring sources: {1}, {2}
-ConnectorDiscovery_illegal_filter_syntax=Illegal filter syntax ''{0}'' in connector ''{1}'' declared in {2}
-ConnectorDiscovery_task_discovering_connectors=Discovering connectors
-ConnectorDiscoveryExtensionReader_unexpected_element_icon=Unexpected element icon
-ConnectorDiscoveryExtensionReader_unexpected_element_overview=Unexpected element overview
-ConnectorDiscoveryExtensionReader_unexpected_value_kind=Unexpected value for kind
-DirectoryParser_no_directory=Unexpected content: no directory available
-DirectoryParser_unexpected_element=Unexpected element ''{0}''
-DiscoveryRegistryStrategy_cannot_load_bundle=Cannot load bundle {0}: {1}
-DiscoveryRegistryStrategy_missing_pluginxml=no plugin.xml in bundle
-RemoteBundleDiscoveryStrategy_cannot_download_bundle=Cannot download bundle at {0}: {1}
-RemoteBundleDiscoveryStrategy_empty_directory=Discovery directory is empty
-RemoteBundleDiscoveryStrategy_io_failure_discovery_directory=IO failure: cannot load discovery directory
-RemoteBundleDiscoveryStrategy_io_failure_temp_storage=IO failure: cannot create temporary storage area
-RemoteBundleDiscoveryStrategy_task_remote_discovery=remote discovery
-RemoteBundleDiscoveryStrategy_unrecognized_discovery_url=Unrecognized discovery bundle URL: {0}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DefaultSaxErrorHandler.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DefaultSaxErrorHandler.java
deleted file mode 100644
index b3756d9..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/DefaultSaxErrorHandler.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.discovery.core.util;
-
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-/**
- * A default implementation of an error handler that throws exceptions on all errors.
- * 
- * @author David Green
- */
-public class DefaultSaxErrorHandler implements ErrorHandler {
-	public void warning(SAXParseException exception) throws SAXException {
-		// ignore
-	}
-
-	public void fatalError(SAXParseException exception) throws SAXException {
-		throw exception;
-	}
-
-	public void error(SAXParseException exception) throws SAXException {
-		throw exception;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/IOWithCauseException.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/IOWithCauseException.java
deleted file mode 100644
index f28aed0..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/IOWithCauseException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.discovery.core.util;
-
-import java.io.IOException;
-
-/**
- * An IO Exception that allows for {@link #getCause() a cause}.
- * 
- * @author David Green
- */
-public class IOWithCauseException extends IOException {
-
-	private static final long serialVersionUID = 1L;
-
-	private final Throwable cause;
-
-	public IOWithCauseException(String message, Throwable cause) {
-		super(message);
-		this.cause = cause;
-	}
-
-	public IOWithCauseException(Throwable cause) {
-		this.cause = cause;
-	}
-
-	@Override
-	public Throwable getCause() {
-		return cause;
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/Messages.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/Messages.java
deleted file mode 100644
index b43f64b..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/Messages.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.discovery.core.util;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- * @author David Green
- */
-class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.mylyn.internal.discovery.core.util.messages"; //$NON-NLS-1$
-
-	public static String WebUtil_cannotDownload;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/WebUtil.java b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/WebUtil.java
deleted file mode 100644
index dfb213d..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/WebUtil.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 Tasktop Technologies 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
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Tasktop Technologies - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.internal.discovery.core.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-
-import org.apache.commons.httpclient.HostConfiguration;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.mylyn.commons.net.AbstractWebLocation;
-import org.eclipse.mylyn.commons.net.Policy;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * A utility for accessing web resources
- * 
- * @author David Green
- */
-public class WebUtil {
-	/**
-	 * implementors are capable of processing character content
-	 * 
-	 * @see WebUtil#readResource(AbstractWebLocation, TextContentProcessor, IProgressMonitor)
-	 */
-	public interface TextContentProcessor {
-		public void process(Reader reader) throws IOException;
-	}
-
-	/**
-	 * Download an HTTP-based resource
-	 * 
-	 * @param target
-	 *            the target file to which the content is saved
-	 * @param location
-	 *            the web location of the content
-	 * @param monitor
-	 *            the monitor
-	 * 
-	 * @throws IOException
-	 *             if a network or IO problem occurs
-	 */
-	public static void downloadResource(File target, AbstractWebLocation location, IProgressMonitor monitor)
-			throws IOException {
-		monitor = Policy.monitorFor(monitor);
-		monitor.beginTask("Retrieving " + location.getUrl(), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-		try {
-			HttpClient client = new HttpClient();
-			org.eclipse.mylyn.commons.net.WebUtil.configureHttpClient(client, ""); //$NON-NLS-1$
-
-			GetMethod method = new GetMethod(location.getUrl());
-			try {
-				HostConfiguration hostConfiguration = org.eclipse.mylyn.commons.net.WebUtil.createHostConfiguration(
-						client, location, monitor);
-				int result = org.eclipse.mylyn.commons.net.WebUtil.execute(client, hostConfiguration, method, monitor);
-				if (result == HttpStatus.SC_OK) {
-					InputStream in = org.eclipse.mylyn.commons.net.WebUtil.getResponseBodyAsStream(method, monitor);
-					try {
-						in = new BufferedInputStream(in);
-						OutputStream out = new BufferedOutputStream(new FileOutputStream(target));
-						try {
-							int i;
-							while ((i = in.read()) != -1) {
-								out.write(i);
-							}
-						} catch (IOException e) {
-							// avoid partial content
-							out.close();
-							target.delete();
-							throw e;
-						} finally {
-							out.close();
-						}
-					} finally {
-						in.close();
-					}
-				} else {
-					throw new IOException(NLS.bind(Messages.WebUtil_cannotDownload, location.getUrl(), result));
-				}
-			} finally {
-				method.releaseConnection();
-			}
-		} finally {
-			monitor.done();
-		}
-	}
-
-	public static void readResource(AbstractWebLocation location, TextContentProcessor processor,
-			IProgressMonitor monitor) throws IOException {
-		monitor = Policy.monitorFor(monitor);
-		monitor.beginTask("Retrieving " + location.getUrl(), IProgressMonitor.UNKNOWN); //$NON-NLS-1$
-		try {
-			HttpClient client = new HttpClient();
-			org.eclipse.mylyn.commons.net.WebUtil.configureHttpClient(client, ""); //$NON-NLS-1$
-
-			GetMethod method = new GetMethod(location.getUrl());
-			try {
-				HostConfiguration hostConfiguration = org.eclipse.mylyn.commons.net.WebUtil.createHostConfiguration(
-						client, location, monitor);
-				int result = org.eclipse.mylyn.commons.net.WebUtil.execute(client, hostConfiguration, method, monitor);
-				if (result == HttpStatus.SC_OK) {
-					InputStream in = org.eclipse.mylyn.commons.net.WebUtil.getResponseBodyAsStream(method, monitor);
-					try {
-						BufferedReader reader = new BufferedReader(new InputStreamReader(in,
-								method.getResponseCharSet()));
-						processor.process(reader);
-					} finally {
-						in.close();
-					}
-				}
-			} finally {
-				method.releaseConnection();
-			}
-		} finally {
-			monitor.done();
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/messages.properties b/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/messages.properties
deleted file mode 100644
index 18726fa..0000000
--- a/org.eclipse.mylyn.discovery.core/src/org/eclipse/mylyn/internal/discovery/core/util/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-WebUtil_cannotDownload=Cannot download {0}: HTTP response {1}
diff --git a/org.eclipse.mylyn.discovery.core/xsd/directory.xsd b/org.eclipse.mylyn.discovery.core/xsd/directory.xsd
deleted file mode 100644
index 25fe712..0000000
--- a/org.eclipse.mylyn.discovery.core/xsd/directory.xsd
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns:tns="http://www.eclipse.org/mylyn/discovery/directory/" 
-	xmlns="http://www.w3.org/2001/XMLSchema" 
-	targetNamespace="http://www.eclipse.org/mylyn/discovery/directory/">
-	
-	<annotation>
-		<documentation>
-		Describes the XML format used by a Mylyn discovery directory.
-		</documentation>
-	</annotation>
-	
-	<complexType name="OpenAttrsComplex">
-		<annotation>
-			<documentation>extend this type to allow for attributes from other namespaces</documentation>
-		</annotation>
-		<complexContent>
-			<restriction base="anyType">
-				<anyAttribute namespace="##other" processContents="lax"/>
-			</restriction>
-		</complexContent>
-	</complexType>
-	
-	
-    <element name="directory">
-    	<complexType>
-    		<complexContent>
-				<extension base="tns:OpenAttrsComplex">
-		    		<sequence>
-		    			<element ref="tns:entry" minOccurs="0" maxOccurs="unbounded"/>
-		    		</sequence>
-    			</extension>
-    		</complexContent>
-    	</complexType>
-    </element>
-    
-    <element name="entry">
-		<complexType>
- 			<complexContent>
-				<extension base="tns:OpenAttrsComplex">
-					<attribute name="url" type="anyURI"/>
-				</extension>
-			</complexContent>
-		</complexType>
-	</element>
-</schema>
\ No newline at end of file
