You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by re...@apache.org on 2015/03/26 19:52:39 UTC

[50/51] [partial] incubator-taverna-workbench git commit: all packages are moved to org.apache.taverna.*

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconManager.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconManager.java b/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconManager.java
deleted file mode 100644
index c92c4e8..0000000
--- a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconManager.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2011 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workbench.activityicons;
-
-import java.net.URI;
-
-import javax.swing.Icon;
-
-import org.apache.taverna.scufl2.api.activity.Activity;
-
-/**
- * Manager for activities' icons.
- * 
- * @author David Withers
- */
-public interface ActivityIconManager {
-	/** Returns an icon for the Activity. */
-	Icon iconForActivity(URI activityType);
-
-	Icon iconForActivity(Activity activity);
-
-	void resetIcon(URI activityType);
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconSPI.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconSPI.java b/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconSPI.java
deleted file mode 100644
index 7270dfc..0000000
--- a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/ActivityIconSPI.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workbench.activityicons;
-
-import java.net.URI;
-
-import javax.swing.Icon;
-
-/**
- * Defines an interface for getting an icon for an Activity.
- * 
- * @author Alex Nenadic
- */
-public interface ActivityIconSPI {
-	/**
-	 * A return value for {@link canProvideIconScore()} indicating an SPI cannot
-	 * provide an icon for a given activity.
-	 */
-	int NO_ICON = 0;
-
-	/**
-	 * {@link DefaultActivityIcon} returns this value that will be used when an
-	 * activity that has no other SPI providing an icon for. Any SPI shour
-	 * return value of at least DEFAULT_ICON + 1 if they want to 'override' the
-	 * default icon.
-	 */
-	int DEFAULT_ICON = 10;
-
-	/**
-	 * Returns a positive number if the class can provide an icon for the given
-	 * activity or {@link NO_ICON} otherwise. Out of two SPIs capable of
-	 * providing an icon for the same activity, the one returning a higher score
-	 * will be used.
-	 */
-	int canProvideIconScore(URI activityType);
-
-	/** Returns an icon for the Activity. */
-	Icon getIcon(URI activityType);
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/DefaultActivityIcon.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/DefaultActivityIcon.java b/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/DefaultActivityIcon.java
deleted file mode 100644
index c474e69..0000000
--- a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/DefaultActivityIcon.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workbench.activityicons;
-
-import java.net.URI;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-
-public class DefaultActivityIcon implements ActivityIconSPI {
-	private static final String ICON_RESOURCE = "/default-activity-icon.png";
-
-	@Override
-	public int canProvideIconScore(URI activityType) {
-		// For any activity we can provide a default icon
-		return DEFAULT_ICON;
-	}
-
-	@Override
-	public Icon getIcon(URI activityType) {
-		return getDefaultIcon();
-	}
-	
-	public static Icon getDefaultIcon() {
-		return IconLoader.icon;
-	}
-
-	private static class IconLoader {
-		static final Icon icon = loadDefaultIcon();
-
-		private static Icon loadDefaultIcon() {
-			return new ImageIcon(
-					DefaultActivityIcon.class.getResource(ICON_RESOURCE));
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/impl/ActivityIconManagerImpl.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/impl/ActivityIconManagerImpl.java b/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/impl/ActivityIconManagerImpl.java
deleted file mode 100644
index 762de69..0000000
--- a/taverna-activity-icons-api/src/main/java/net/sf/taverna/t2/workbench/activityicons/impl/ActivityIconManagerImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.workbench.activityicons.impl;
-
-import static net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI.NO_ICON;
-
-import java.net.URI;
-import java.util.List;
-import java.util.WeakHashMap;
-
-import javax.swing.Icon;
-
-import org.apache.taverna.scufl2.api.activity.Activity;
-import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
-import net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI;
-
-/**
- * Manager for activities' icons.
- *
- * @author Alex Nenadic
- * @author Alan R Williams
- */
-public class ActivityIconManagerImpl implements ActivityIconManager {
-	/** Cache of already obtained icons; maps activities to their icons*/
-	private WeakHashMap<URI, Icon> iconsMap = new WeakHashMap<>();
-
-	private List<ActivityIconSPI> activityIcons;
-
-	/** Returns an icon for the Activity. */
-	@Override
-	public Icon iconForActivity(URI activityType) {
-		Icon icon = iconsMap.get(activityType);
-		if (icon != null)
-			return icon;
-		int bestScore = NO_ICON;
-		ActivityIconSPI bestSPI = null;
-		for (ActivityIconSPI spi : activityIcons) {
-			int spiScore = spi.canProvideIconScore(activityType);
-			if (spiScore > bestScore) {
-				bestSPI = spi;
-				bestScore = spiScore;
-			}
-		}
-		if (bestSPI == null)
-			return null;
-		icon = bestSPI.getIcon(activityType);
-		iconsMap.put(activityType, icon);
-		return icon;
-	}
-
-	@Override
-	public Icon iconForActivity(Activity activity) {
-		return iconForActivity(activity.getType());
-	}
-
-	@Override
-	public void resetIcon(URI activityType) {
-		Icon icon = iconsMap.get(activityType);
-		if (icon != null)
-			iconsMap.remove(activityType);
-		iconForActivity(activityType);
-	}
-
-	public void setActivityIcons(List<ActivityIconSPI> activityIcons) {
-		this.activityIcons = activityIcons;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconManager.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconManager.java b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconManager.java
new file mode 100644
index 0000000..9a80fd3
--- /dev/null
+++ b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconManager.java
@@ -0,0 +1,40 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.activityicons;
+
+import java.net.URI;
+
+import javax.swing.Icon;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+
+/**
+ * Manager for activities' icons.
+ * 
+ * @author David Withers
+ */
+public interface ActivityIconManager {
+	/** Returns an icon for the Activity. */
+	Icon iconForActivity(URI activityType);
+
+	Icon iconForActivity(Activity activity);
+
+	void resetIcon(URI activityType);
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconSPI.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconSPI.java b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconSPI.java
new file mode 100644
index 0000000..59c6da0
--- /dev/null
+++ b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/ActivityIconSPI.java
@@ -0,0 +1,56 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.activityicons;
+
+import java.net.URI;
+
+import javax.swing.Icon;
+
+/**
+ * Defines an interface for getting an icon for an Activity.
+ * 
+ * @author Alex Nenadic
+ */
+public interface ActivityIconSPI {
+	/**
+	 * A return value for {@link canProvideIconScore()} indicating an SPI cannot
+	 * provide an icon for a given activity.
+	 */
+	int NO_ICON = 0;
+
+	/**
+	 * {@link DefaultActivityIcon} returns this value that will be used when an
+	 * activity that has no other SPI providing an icon for. Any SPI shour
+	 * return value of at least DEFAULT_ICON + 1 if they want to 'override' the
+	 * default icon.
+	 */
+	int DEFAULT_ICON = 10;
+
+	/**
+	 * Returns a positive number if the class can provide an icon for the given
+	 * activity or {@link NO_ICON} otherwise. Out of two SPIs capable of
+	 * providing an icon for the same activity, the one returning a higher score
+	 * will be used.
+	 */
+	int canProvideIconScore(URI activityType);
+
+	/** Returns an icon for the Activity. */
+	Icon getIcon(URI activityType);
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/DefaultActivityIcon.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/DefaultActivityIcon.java b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/DefaultActivityIcon.java
new file mode 100644
index 0000000..f061ded
--- /dev/null
+++ b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/DefaultActivityIcon.java
@@ -0,0 +1,53 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.activityicons;
+
+import java.net.URI;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class DefaultActivityIcon implements ActivityIconSPI {
+	private static final String ICON_RESOURCE = "/default-activity-icon.png";
+
+	@Override
+	public int canProvideIconScore(URI activityType) {
+		// For any activity we can provide a default icon
+		return DEFAULT_ICON;
+	}
+
+	@Override
+	public Icon getIcon(URI activityType) {
+		return getDefaultIcon();
+	}
+	
+	public static Icon getDefaultIcon() {
+		return IconLoader.icon;
+	}
+
+	private static class IconLoader {
+		static final Icon icon = loadDefaultIcon();
+
+		private static Icon loadDefaultIcon() {
+			return new ImageIcon(
+					DefaultActivityIcon.class.getResource(ICON_RESOURCE));
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/impl/ActivityIconManagerImpl.java
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/impl/ActivityIconManagerImpl.java b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/impl/ActivityIconManagerImpl.java
new file mode 100644
index 0000000..61dd6e4
--- /dev/null
+++ b/taverna-activity-icons-api/src/main/java/org/apache/taverna/workbench/activityicons/impl/ActivityIconManagerImpl.java
@@ -0,0 +1,84 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.workbench.activityicons.impl;
+
+import static org.apache.taverna.workbench.activityicons.ActivityIconSPI.NO_ICON;
+
+import java.net.URI;
+import java.util.List;
+import java.util.WeakHashMap;
+
+import javax.swing.Icon;
+
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.workbench.activityicons.ActivityIconManager;
+import org.apache.taverna.workbench.activityicons.ActivityIconSPI;
+
+/**
+ * Manager for activities' icons.
+ *
+ * @author Alex Nenadic
+ * @author Alan R Williams
+ */
+public class ActivityIconManagerImpl implements ActivityIconManager {
+	/** Cache of already obtained icons; maps activities to their icons*/
+	private WeakHashMap<URI, Icon> iconsMap = new WeakHashMap<>();
+
+	private List<ActivityIconSPI> activityIcons;
+
+	/** Returns an icon for the Activity. */
+	@Override
+	public Icon iconForActivity(URI activityType) {
+		Icon icon = iconsMap.get(activityType);
+		if (icon != null)
+			return icon;
+		int bestScore = NO_ICON;
+		ActivityIconSPI bestSPI = null;
+		for (ActivityIconSPI spi : activityIcons) {
+			int spiScore = spi.canProvideIconScore(activityType);
+			if (spiScore > bestScore) {
+				bestSPI = spi;
+				bestScore = spiScore;
+			}
+		}
+		if (bestSPI == null)
+			return null;
+		icon = bestSPI.getIcon(activityType);
+		iconsMap.put(activityType, icon);
+		return icon;
+	}
+
+	@Override
+	public Icon iconForActivity(Activity activity) {
+		return iconForActivity(activity.getType());
+	}
+
+	@Override
+	public void resetIcon(URI activityType) {
+		Icon icon = iconsMap.get(activityType);
+		if (icon != null)
+			iconsMap.remove(activityType);
+		iconForActivity(activityType);
+	}
+
+	public void setActivityIcons(List<ActivityIconSPI> activityIcons) {
+		this.activityIcons = activityIcons;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI b/taverna-activity-icons-api/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI
deleted file mode 100644
index d268c81..0000000
--- a/taverna-activity-icons-api/src/main/resources/META-INF/services/net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI
+++ /dev/null
@@ -1 +0,0 @@
-net.sf.taverna.t2.workbench.activityicons.DefaultActivityIcon
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/resources/META-INF/services/org.apache.taverna.workbench.activityicons.ActivityIconSPI
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/resources/META-INF/services/org.apache.taverna.workbench.activityicons.ActivityIconSPI b/taverna-activity-icons-api/src/main/resources/META-INF/services/org.apache.taverna.workbench.activityicons.ActivityIconSPI
new file mode 100644
index 0000000..5510f07
--- /dev/null
+++ b/taverna-activity-icons-api/src/main/resources/META-INF/services/org.apache.taverna.workbench.activityicons.ActivityIconSPI
@@ -0,0 +1 @@
+org.apache.taverna.workbench.activityicons.DefaultActivityIcon
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context-osgi.xml
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context-osgi.xml b/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context-osgi.xml
index 5c67640..e0e24ef 100644
--- a/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context-osgi.xml
+++ b/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context-osgi.xml
@@ -6,10 +6,10 @@
                       http://www.springframework.org/schema/osgi
                       http://www.springframework.org/schema/osgi/spring-osgi.xsd">
 
-	<service ref="DefaultActivityIcon" interface="net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI" />
+	<service ref="DefaultActivityIcon" interface="org.apache.taverna.workbench.activityicons.ActivityIconSPI" />
 
-	<service ref="ActivityIconManager" interface="net.sf.taverna.t2.workbench.activityicons.ActivityIconManager" />
+	<service ref="ActivityIconManager" interface="org.apache.taverna.workbench.activityicons.ActivityIconManager" />
 
-	<list id="activityIcons" interface="net.sf.taverna.t2.workbench.activityicons.ActivityIconSPI" cardinality="0..N" />
+	<list id="activityIcons" interface="org.apache.taverna.workbench.activityicons.ActivityIconSPI" cardinality="0..N" />
 
 </beans:beans>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context.xml
----------------------------------------------------------------------
diff --git a/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context.xml b/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context.xml
index 93c98c4..8ff584d 100644
--- a/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context.xml
+++ b/taverna-activity-icons-api/src/main/resources/META-INF/spring/activity-icons-api-context.xml
@@ -3,9 +3,9 @@
 	xsi:schemaLocation="http://www.springframework.org/schema/beans
                       http://www.springframework.org/schema/beans/spring-beans.xsd">
 
-	<bean id="DefaultActivityIcon" class="net.sf.taverna.t2.workbench.activityicons.DefaultActivityIcon" />
+	<bean id="DefaultActivityIcon" class="org.apache.taverna.workbench.activityicons.DefaultActivityIcon" />
 
-	<bean id="ActivityIconManager" class="net.sf.taverna.t2.workbench.activityicons.impl.ActivityIconManagerImpl">
+	<bean id="ActivityIconManager" class="org.apache.taverna.workbench.activityicons.impl.ActivityIconManagerImpl">
 		<property name="activityIcons" ref="activityIcons" />
 	</bean>
 

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractConfigurableServiceProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractConfigurableServiceProvider.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractConfigurableServiceProvider.java
deleted file mode 100644
index e3c4c54..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractConfigurableServiceProvider.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions;
-
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-
-public abstract class AbstractConfigurableServiceProvider extends
-		IdentifiedObject implements ConfigurableServiceProvider {
-	protected Configuration serviceProviderConfig;
-
-	/**
-	 * Construct configurable service provider.
-	 * 
-	 * @param configTemplate
-	 *            Template configuration
-	 */
-	public AbstractConfigurableServiceProvider(Configuration configTemplate) {
-		if (configTemplate == null)
-			throw new NullPointerException("Default config can't be null");
-		serviceProviderConfig = configTemplate;
-	}
-
-	/**
-	 * Package access constructor - only used with {@link #clone()} - otherwise
-	 * use {@link #AbstractConfigurableServiceProvider(Object)}
-	 */
-	AbstractConfigurableServiceProvider() {
-	}
-
-	@Override
-	public AbstractConfigurableServiceProvider clone() {
-		AbstractConfigurableServiceProvider provider = (AbstractConfigurableServiceProvider) newInstance();
-		Configuration configuration = getConfiguration();
-		if (configuration != null)
-			provider.configure(configuration);
-		return provider;
-	}
-
-	@Override
-	public synchronized void configure(Configuration conf) {
-		if (conf == null)
-			throw new IllegalArgumentException("Config can't be null");
-		this.serviceProviderConfig = conf;
-	}
-
-	@Override
-	public Configuration getConfiguration() {
-		return serviceProviderConfig;
-	}
-
-	@Override
-	public String toString() {
-		return getName() + " " + getConfiguration();
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractTemplateService.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractTemplateService.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractTemplateService.java
deleted file mode 100644
index b5b2a7c..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/AbstractTemplateService.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions;
-
-import static java.util.Collections.singleton;
-
-import java.net.URI;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.swing.Icon;
-
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-
-public abstract class AbstractTemplateService implements
-		ServiceDescriptionProvider {
-	protected TemplateServiceDescription templateService = new TemplateServiceDescription();
-
-	@Override
-	public void findServiceDescriptionsAsync(
-			FindServiceDescriptionsCallBack callBack) {
-		callBack.partialResults(singleton(templateService));
-		callBack.finished();
-	}
-
-	@Override
-	public abstract Icon getIcon();
-
-	public URI getActivityType() {
-		return null;
-	}
-
-	public abstract Configuration getActivityConfiguration();
-
-	public class TemplateServiceDescription extends ServiceDescription {
-		@Override
-		public Icon getIcon() {
-			return AbstractTemplateService.this.getIcon();
-		}
-
-		@Override
-		public String getName() {
-			return AbstractTemplateService.this.getName();
-		}
-
-		@Override
-		public List<String> getPath() {
-			return Arrays.asList(SERVICE_TEMPLATES);
-		}
-
-		@Override
-		public boolean isTemplateService() {
-			return true;
-		}
-
-		@Override
-		protected List<Object> getIdentifyingData() {
-			// Do it by object identity
-			return null;
-		}
-
-		@Override
-		public URI getActivityType() {
-			return AbstractTemplateService.this.getActivityType();
-		}
-
-		@Override
-		public Configuration getActivityConfiguration() {
-			return AbstractTemplateService.this.getActivityConfiguration();
-		}
-
-		@Override
-		public String getDescription() {
-			return AbstractTemplateService.this.getDescription();
-		}
-	}
-
-	@Override
-	public String toString() {
-		return "Template service " + getName();
-	}
-
-	public String getDescription() {
-		// Default to an empty string
-		return "";
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ConfigurableServiceProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ConfigurableServiceProvider.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ConfigurableServiceProvider.java
deleted file mode 100644
index d16afaa..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ConfigurableServiceProvider.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions;
-
-import org.apache.taverna.scufl2.api.common.Configurable;
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-
-public interface ConfigurableServiceProvider extends
-		ServiceDescriptionProvider, Configurable, Cloneable {
-	void configure(Configuration configuration) throws Exception;
-	Configuration getConfiguration();
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/CustomizedConfigurePanelProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/CustomizedConfigurePanelProvider.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/CustomizedConfigurePanelProvider.java
deleted file mode 100644
index f6bdd4a..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/CustomizedConfigurePanelProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2007 The University of Manchester   
- * 
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- * 
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *    
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *    
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.servicedescriptions;
-
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-
-public interface CustomizedConfigurePanelProvider extends
-		ConfigurableServiceProvider {
-	void createCustomizedConfigurePanel(CustomizedConfigureCallBack callBack);
-
-	interface CustomizedConfigureCallBack {
-		void newProviderConfiguration(Configuration providerConfig);
-
-		Configuration getTemplateConfig();
-
-		ServiceDescriptionRegistry getServiceDescriptionRegistry();
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/IdentifiedObject.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/IdentifiedObject.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/IdentifiedObject.java
deleted file mode 100644
index 596f502..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/IdentifiedObject.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions;
-
-import java.util.List;
-
-import net.sf.taverna.t2.lang.beans.PropertyAnnotated;
-
-public abstract class IdentifiedObject extends PropertyAnnotated {
-	@Override
-	public boolean equals(Object obj) {
-		if (!(obj instanceof IdentifiedObject))
-			return false;
-		List<? extends Object> myIdentifyingData = getIdentifyingData();
-		if (myIdentifyingData == null)
-			return super.equals(obj);
-		if (!getClass().isInstance(obj) && obj.getClass().isInstance(this))
-			return false;
-		IdentifiedObject id = (IdentifiedObject) obj;
-		return myIdentifyingData.equals(id.getIdentifyingData());
-	}
-
-	@Override
-	public int hashCode() {
-		List<? extends Object> identifyingData = getIdentifyingData();
-		if (identifyingData == null)
-			return super.hashCode();
-		return identifyingData.hashCode();
-	}
-
-	protected abstract List<? extends Object> getIdentifyingData();
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescription.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescription.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescription.java
deleted file mode 100644
index 72e1b2e..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescription.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions;
-
-import java.net.URI;
-import java.util.List;
-
-import javax.swing.Icon;
-
-import net.sf.taverna.t2.lang.beans.PropertyAnnotation;
-import net.sf.taverna.t2.workbench.edits.Edit;
-import org.apache.taverna.scufl2.api.activity.Activity;
-import org.apache.taverna.scufl2.api.configurations.Configuration;
-import org.apache.taverna.scufl2.api.core.Processor;
-import org.apache.taverna.scufl2.api.core.Workflow;
-
-public abstract class ServiceDescription extends IdentifiedObject {
-	public static final String SERVICE_TEMPLATES = "Service templates";
-	private static final String NAME = "Name";
-	private static final String SERVICE_CONFIGURATION = "Service configuration";
-	private static final String SERVICE_IMPLEMENTATION_URI = "Service implementation URI";
-	private static final String DESCRIPTION = "Description";
-	public static final String LOCAL_SERVICES = "Local services";
-
-	private String description = "";
-
-	@PropertyAnnotation(expert = true, displayName = SERVICE_IMPLEMENTATION_URI)
-	public abstract URI getActivityType();
-
-	@PropertyAnnotation(expert = true, displayName = SERVICE_CONFIGURATION)
-	public Configuration getActivityConfiguration() {
-		Configuration configuration = new Configuration();
-		configuration.setType(getActivityType().resolve("#Config"));
-		return configuration;
-	}
-
-	@PropertyAnnotation(displayName = DESCRIPTION)
-	public String getDescription() {
-		return this.description;
-	}
-
-	@PropertyAnnotation(expert = true)
-	public abstract Icon getIcon();
-
-	@PropertyAnnotation(displayName = NAME)
-	public abstract String getName();
-
-	@PropertyAnnotation(expert = true)
-	public abstract List<? extends Comparable<?>> getPath();
-
-	@PropertyAnnotation(hidden = true)
-	public boolean isTemplateService() {
-		return false;
-	}
-
-	/**
-	 * @param description
-	 *            the description to set
-	 */
-	public void setDescription(String description) {
-		this.description = description;
-	}
-
-	@Override
-	public String toString() {
-		return "Service description " + getName();
-	}
-
-	/**
-	 * Any additional edit that needs to be performed upon insertion of an
-	 * instance of the ServiceDescription into the {@link Workflow} within the
-	 * specified {@link Processor}
-	 * 
-	 * @param dataflow
-	 * @param p
-	 * @param a
-	 * @return
-	 */
-	public Edit<?> getInsertionEdit(Workflow dataflow, Processor p, Activity a) {
-		return null;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionProvider.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionProvider.java
deleted file mode 100644
index 8170819..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions;
-
-import java.util.Collection;
-
-import javax.swing.Icon;
-
-import net.sf.taverna.t2.lang.beans.PropertyAnnotation;
-
-/**
- * A provider of service descriptions
- * 
- * @author Stian Soiland-Reyes
- */
-public interface ServiceDescriptionProvider {
-	/**
-	 * Get all service descriptions.
-	 * 
-	 * @param callBack
-	 */
-	void findServiceDescriptionsAsync(FindServiceDescriptionsCallBack callBack);
-
-	/**
-	 * @author stain
-	 */
-	interface FindServiceDescriptionsCallBack {
-		void partialResults(
-				Collection<? extends ServiceDescription> serviceDescriptions);
-
-		void status(String message);
-
-		void warning(String message);
-
-		void finished();
-
-		void fail(String message, Throwable ex);
-	}
-
-	/**
-	 * Name of this service description provider, for instance "BioCatalogue" or
-	 * "WSDL". This name is typically used in a "Add service..." menu.
-	 * 
-	 * @return Name of provider
-	 */
-	String getName();
-
-	@PropertyAnnotation(expert = true)
-	abstract Icon getIcon();
-
-	/**
-	 * @return unique id of this provider.
-	 */
-	String getId();
-
-	/**
-	 * Create a new copy of this service provider. It <i>need not be
-	 * configured</i> at the point where it is returned.
-	 * 
-	 * @return The copy.
-	 */
-	ServiceDescriptionProvider newInstance();
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionRegistry.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionRegistry.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionRegistry.java
deleted file mode 100644
index c44b541..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionRegistry.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.taverna.lang.observer.Observable;
-import net.sf.taverna.t2.servicedescriptions.events.ServiceDescriptionRegistryEvent;
-
-public interface ServiceDescriptionRegistry extends
-		Observable<ServiceDescriptionRegistryEvent> {
-	void addServiceDescriptionProvider(ServiceDescriptionProvider provider);
-
-	Set<ServiceDescriptionProvider> getDefaultServiceDescriptionProviders();
-
-	Set<ServiceDescriptionProvider> getServiceDescriptionProviders();
-
-	Set<ServiceDescriptionProvider> getServiceDescriptionProviders(
-			ServiceDescription sd);
-
-	Set<ServiceDescription> getServiceDescriptions();
-
-	ServiceDescription getServiceDescription(URI activityType);
-
-	List<ConfigurableServiceProvider> getUnconfiguredServiceProviders();
-
-	Set<ServiceDescriptionProvider> getUserAddedServiceProviders();
-
-	Set<ServiceDescriptionProvider> getUserRemovedServiceProviders();
-
-	void loadServiceProviders();
-
-	void loadServiceProviders(File serviceProvidersURL);
-
-	void loadServiceProviders(URL serviceProvidersURL);
-
-	void refresh();
-
-	void removeServiceDescriptionProvider(ServiceDescriptionProvider provider);
-
-	void saveServiceDescriptions();
-
-	void saveServiceDescriptions(File serviceDescriptionsFile);
-
-	void exportCurrentServiceDescriptions(File serviceDescriptionsFile);
-
-	boolean isDefaultSystemConfigurableProvidersLoaded();
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionsConfiguration.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionsConfiguration.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionsConfiguration.java
deleted file mode 100644
index 7fbcbfc..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/ServiceDescriptionsConfiguration.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2012 The University of Manchester
- *
- *  Modifications to the initial code base are copyright of their
- *  respective authors, or their employers as appropriate.
- *
- *  This program is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public License
- *  as published by the Free Software Foundation; either version 2.1 of
- *  the License, or (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful, but
- *  WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- ******************************************************************************/
-package net.sf.taverna.t2.servicedescriptions;
-
-import uk.org.taverna.configuration.Configurable;
-
-/**
- * @author David Withers
- */
-public interface ServiceDescriptionsConfiguration extends Configurable {
-	public boolean isIncludeDefaults();
-
-	public void setIncludeDefaults(boolean includeDefaults);
-
-	public boolean isRemovePermanently();
-
-	public void setRemovePermanently(boolean removePermanently);
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderEvent.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderEvent.java
deleted file mode 100644
index 1fd224e..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderEvent.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public abstract class AbstractProviderEvent extends
-		ServiceDescriptionRegistryEvent {
-	private final ServiceDescriptionProvider provider;
-
-	public AbstractProviderEvent(ServiceDescriptionProvider provider) {
-		this.provider = provider;
-	}
-
-	public ServiceDescriptionProvider getProvider() {
-		return provider;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderNotification.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderNotification.java
deleted file mode 100644
index 2cabf90..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AbstractProviderNotification.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class AbstractProviderNotification extends AbstractProviderEvent {
-
-	private final String message;
-
-	public AbstractProviderNotification(ServiceDescriptionProvider provider, String message) {
-		super(provider);
-		this.message = message;
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AddedProviderEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AddedProviderEvent.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AddedProviderEvent.java
deleted file mode 100644
index 6e003d7..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/AddedProviderEvent.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class AddedProviderEvent extends AbstractProviderEvent {
-
-	public AddedProviderEvent(ServiceDescriptionProvider provider) {
-		super(provider);
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/PartialServiceDescriptionsNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/PartialServiceDescriptionsNotification.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/PartialServiceDescriptionsNotification.java
deleted file mode 100644
index 3bd8c7f..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/PartialServiceDescriptionsNotification.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import java.util.Collection;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class PartialServiceDescriptionsNotification extends
-		AbstractProviderNotification {
-	private final Collection<? extends ServiceDescription> serviceDescriptions;
-
-	public PartialServiceDescriptionsNotification(
-			ServiceDescriptionProvider provider,
-			Collection<? extends ServiceDescription> serviceDescriptions) {
-		super(provider, "Found " + serviceDescriptions.size() + " services");
-		this.serviceDescriptions = serviceDescriptions;
-	}
-
-	public Collection<? extends ServiceDescription> getServiceDescriptions() {
-		return serviceDescriptions;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderErrorNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderErrorNotification.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderErrorNotification.java
deleted file mode 100644
index a712124..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderErrorNotification.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class ProviderErrorNotification extends AbstractProviderNotification {
-
-	private final Throwable cause;
-
-	public ProviderErrorNotification(ServiceDescriptionProvider provider,
-			String message, Throwable cause) {
-		super(provider, message);
-		this.cause = cause;
-	}
-
-	public Throwable getCause() {
-		return cause;
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderStatusNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderStatusNotification.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderStatusNotification.java
deleted file mode 100644
index f094e47..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderStatusNotification.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class ProviderStatusNotification extends AbstractProviderNotification {
-
-	public ProviderStatusNotification(ServiceDescriptionProvider provider,
-			String message) {
-		super(provider, message);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderUpdatingNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderUpdatingNotification.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderUpdatingNotification.java
deleted file mode 100644
index e2947e1..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderUpdatingNotification.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class ProviderUpdatingNotification extends AbstractProviderNotification {
-
-	public ProviderUpdatingNotification(ServiceDescriptionProvider provider) {
-		super(provider, "Updating");
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderWarningNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderWarningNotification.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderWarningNotification.java
deleted file mode 100644
index d7476aa..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ProviderWarningNotification.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class ProviderWarningNotification extends AbstractProviderNotification {
-
-	public ProviderWarningNotification(ServiceDescriptionProvider provider,
-			String message) {
-		super(provider, message);
-	}
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/RemovedProviderEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/RemovedProviderEvent.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/RemovedProviderEvent.java
deleted file mode 100644
index a382bdf..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/RemovedProviderEvent.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class RemovedProviderEvent extends AbstractProviderEvent {
-
-	public RemovedProviderEvent(ServiceDescriptionProvider provider) {
-		super(provider);
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionProvidedEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionProvidedEvent.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionProvidedEvent.java
deleted file mode 100644
index 76ef22d..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionProvidedEvent.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-import java.util.Set;
-
-import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
-import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionProvider;
-
-public class ServiceDescriptionProvidedEvent extends AbstractProviderEvent {
-	private final Set<ServiceDescription> serviceDescriptions;
-
-	public ServiceDescriptionProvidedEvent(ServiceDescriptionProvider provider,
-			Set<ServiceDescription> serviceDescriptions) {
-		super(provider);
-		this.serviceDescriptions = serviceDescriptions;
-	}
-
-	public Set<ServiceDescription> getServiceDescriptions() {
-		return serviceDescriptions;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionRegistryEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionRegistryEvent.java b/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionRegistryEvent.java
deleted file mode 100644
index 0604510..0000000
--- a/taverna-activity-palette-api/src/main/java/net/sf/taverna/t2/servicedescriptions/events/ServiceDescriptionRegistryEvent.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package net.sf.taverna.t2.servicedescriptions.events;
-
-public abstract class ServiceDescriptionRegistryEvent {
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractConfigurableServiceProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractConfigurableServiceProvider.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractConfigurableServiceProvider.java
new file mode 100644
index 0000000..31fd372
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractConfigurableServiceProvider.java
@@ -0,0 +1,72 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+
+public abstract class AbstractConfigurableServiceProvider extends
+		IdentifiedObject implements ConfigurableServiceProvider {
+	protected Configuration serviceProviderConfig;
+
+	/**
+	 * Construct configurable service provider.
+	 * 
+	 * @param configTemplate
+	 *            Template configuration
+	 */
+	public AbstractConfigurableServiceProvider(Configuration configTemplate) {
+		if (configTemplate == null)
+			throw new NullPointerException("Default config can't be null");
+		serviceProviderConfig = configTemplate;
+	}
+
+	/**
+	 * Package access constructor - only used with {@link #clone()} - otherwise
+	 * use {@link #AbstractConfigurableServiceProvider(Object)}
+	 */
+	AbstractConfigurableServiceProvider() {
+	}
+
+	@Override
+	public AbstractConfigurableServiceProvider clone() {
+		AbstractConfigurableServiceProvider provider = (AbstractConfigurableServiceProvider) newInstance();
+		Configuration configuration = getConfiguration();
+		if (configuration != null)
+			provider.configure(configuration);
+		return provider;
+	}
+
+	@Override
+	public synchronized void configure(Configuration conf) {
+		if (conf == null)
+			throw new IllegalArgumentException("Config can't be null");
+		this.serviceProviderConfig = conf;
+	}
+
+	@Override
+	public Configuration getConfiguration() {
+		return serviceProviderConfig;
+	}
+
+	@Override
+	public String toString() {
+		return getName() + " " + getConfiguration();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractTemplateService.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractTemplateService.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractTemplateService.java
new file mode 100644
index 0000000..d42a72f
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/AbstractTemplateService.java
@@ -0,0 +1,104 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import static java.util.Collections.singleton;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+
+public abstract class AbstractTemplateService implements
+		ServiceDescriptionProvider {
+	protected TemplateServiceDescription templateService = new TemplateServiceDescription();
+
+	@Override
+	public void findServiceDescriptionsAsync(
+			FindServiceDescriptionsCallBack callBack) {
+		callBack.partialResults(singleton(templateService));
+		callBack.finished();
+	}
+
+	@Override
+	public abstract Icon getIcon();
+
+	public URI getActivityType() {
+		return null;
+	}
+
+	public abstract Configuration getActivityConfiguration();
+
+	public class TemplateServiceDescription extends ServiceDescription {
+		@Override
+		public Icon getIcon() {
+			return AbstractTemplateService.this.getIcon();
+		}
+
+		@Override
+		public String getName() {
+			return AbstractTemplateService.this.getName();
+		}
+
+		@Override
+		public List<String> getPath() {
+			return Arrays.asList(SERVICE_TEMPLATES);
+		}
+
+		@Override
+		public boolean isTemplateService() {
+			return true;
+		}
+
+		@Override
+		protected List<Object> getIdentifyingData() {
+			// Do it by object identity
+			return null;
+		}
+
+		@Override
+		public URI getActivityType() {
+			return AbstractTemplateService.this.getActivityType();
+		}
+
+		@Override
+		public Configuration getActivityConfiguration() {
+			return AbstractTemplateService.this.getActivityConfiguration();
+		}
+
+		@Override
+		public String getDescription() {
+			return AbstractTemplateService.this.getDescription();
+		}
+	}
+
+	@Override
+	public String toString() {
+		return "Template service " + getName();
+	}
+
+	public String getDescription() {
+		// Default to an empty string
+		return "";
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ConfigurableServiceProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ConfigurableServiceProvider.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ConfigurableServiceProvider.java
new file mode 100644
index 0000000..9f8e85a
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ConfigurableServiceProvider.java
@@ -0,0 +1,29 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import org.apache.taverna.scufl2.api.common.Configurable;
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+
+public interface ConfigurableServiceProvider extends
+		ServiceDescriptionProvider, Configurable, Cloneable {
+	void configure(Configuration configuration) throws Exception;
+	Configuration getConfiguration();
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/CustomizedConfigurePanelProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/CustomizedConfigurePanelProvider.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/CustomizedConfigurePanelProvider.java
new file mode 100644
index 0000000..8c9ddb6
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/CustomizedConfigurePanelProvider.java
@@ -0,0 +1,35 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+
+public interface CustomizedConfigurePanelProvider extends
+		ConfigurableServiceProvider {
+	void createCustomizedConfigurePanel(CustomizedConfigureCallBack callBack);
+
+	interface CustomizedConfigureCallBack {
+		void newProviderConfiguration(Configuration providerConfig);
+
+		Configuration getTemplateConfig();
+
+		ServiceDescriptionRegistry getServiceDescriptionRegistry();
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/IdentifiedObject.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/IdentifiedObject.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/IdentifiedObject.java
new file mode 100644
index 0000000..1d97dce
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/IdentifiedObject.java
@@ -0,0 +1,49 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import java.util.List;
+
+import org.apache.taverna.lang.beans.PropertyAnnotated;
+
+public abstract class IdentifiedObject extends PropertyAnnotated {
+	@Override
+	public boolean equals(Object obj) {
+		if (!(obj instanceof IdentifiedObject))
+			return false;
+		List<? extends Object> myIdentifyingData = getIdentifyingData();
+		if (myIdentifyingData == null)
+			return super.equals(obj);
+		if (!getClass().isInstance(obj) && obj.getClass().isInstance(this))
+			return false;
+		IdentifiedObject id = (IdentifiedObject) obj;
+		return myIdentifyingData.equals(id.getIdentifyingData());
+	}
+
+	@Override
+	public int hashCode() {
+		List<? extends Object> identifyingData = getIdentifyingData();
+		if (identifyingData == null)
+			return super.hashCode();
+		return identifyingData.hashCode();
+	}
+
+	protected abstract List<? extends Object> getIdentifyingData();
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescription.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescription.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescription.java
new file mode 100644
index 0000000..dda5fc6
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescription.java
@@ -0,0 +1,99 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import java.net.URI;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import org.apache.taverna.lang.beans.PropertyAnnotation;
+import org.apache.taverna.workbench.edits.Edit;
+import org.apache.taverna.scufl2.api.activity.Activity;
+import org.apache.taverna.scufl2.api.configurations.Configuration;
+import org.apache.taverna.scufl2.api.core.Processor;
+import org.apache.taverna.scufl2.api.core.Workflow;
+
+public abstract class ServiceDescription extends IdentifiedObject {
+	public static final String SERVICE_TEMPLATES = "Service templates";
+	private static final String NAME = "Name";
+	private static final String SERVICE_CONFIGURATION = "Service configuration";
+	private static final String SERVICE_IMPLEMENTATION_URI = "Service implementation URI";
+	private static final String DESCRIPTION = "Description";
+	public static final String LOCAL_SERVICES = "Local services";
+
+	private String description = "";
+
+	@PropertyAnnotation(expert = true, displayName = SERVICE_IMPLEMENTATION_URI)
+	public abstract URI getActivityType();
+
+	@PropertyAnnotation(expert = true, displayName = SERVICE_CONFIGURATION)
+	public Configuration getActivityConfiguration() {
+		Configuration configuration = new Configuration();
+		configuration.setType(getActivityType().resolve("#Config"));
+		return configuration;
+	}
+
+	@PropertyAnnotation(displayName = DESCRIPTION)
+	public String getDescription() {
+		return this.description;
+	}
+
+	@PropertyAnnotation(expert = true)
+	public abstract Icon getIcon();
+
+	@PropertyAnnotation(displayName = NAME)
+	public abstract String getName();
+
+	@PropertyAnnotation(expert = true)
+	public abstract List<? extends Comparable<?>> getPath();
+
+	@PropertyAnnotation(hidden = true)
+	public boolean isTemplateService() {
+		return false;
+	}
+
+	/**
+	 * @param description
+	 *            the description to set
+	 */
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	@Override
+	public String toString() {
+		return "Service description " + getName();
+	}
+
+	/**
+	 * Any additional edit that needs to be performed upon insertion of an
+	 * instance of the ServiceDescription into the {@link Workflow} within the
+	 * specified {@link Processor}
+	 * 
+	 * @param dataflow
+	 * @param p
+	 * @param a
+	 * @return
+	 */
+	public Edit<?> getInsertionEdit(Workflow dataflow, Processor p, Activity a) {
+		return null;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionProvider.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionProvider.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionProvider.java
new file mode 100644
index 0000000..582de92
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionProvider.java
@@ -0,0 +1,80 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import java.util.Collection;
+
+import javax.swing.Icon;
+
+import org.apache.taverna.lang.beans.PropertyAnnotation;
+
+/**
+ * A provider of service descriptions
+ * 
+ * @author Stian Soiland-Reyes
+ */
+public interface ServiceDescriptionProvider {
+	/**
+	 * Get all service descriptions.
+	 * 
+	 * @param callBack
+	 */
+	void findServiceDescriptionsAsync(FindServiceDescriptionsCallBack callBack);
+
+	/**
+	 * @author stain
+	 */
+	interface FindServiceDescriptionsCallBack {
+		void partialResults(
+				Collection<? extends ServiceDescription> serviceDescriptions);
+
+		void status(String message);
+
+		void warning(String message);
+
+		void finished();
+
+		void fail(String message, Throwable ex);
+	}
+
+	/**
+	 * Name of this service description provider, for instance "BioCatalogue" or
+	 * "WSDL". This name is typically used in a "Add service..." menu.
+	 * 
+	 * @return Name of provider
+	 */
+	String getName();
+
+	@PropertyAnnotation(expert = true)
+	abstract Icon getIcon();
+
+	/**
+	 * @return unique id of this provider.
+	 */
+	String getId();
+
+	/**
+	 * Create a new copy of this service provider. It <i>need not be
+	 * configured</i> at the point where it is returned.
+	 * 
+	 * @return The copy.
+	 */
+	ServiceDescriptionProvider newInstance();
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionRegistry.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionRegistry.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionRegistry.java
new file mode 100644
index 0000000..59f96be
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionRegistry.java
@@ -0,0 +1,69 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.taverna.lang.observer.Observable;
+import org.apache.taverna.servicedescriptions.events.ServiceDescriptionRegistryEvent;
+
+public interface ServiceDescriptionRegistry extends
+		Observable<ServiceDescriptionRegistryEvent> {
+	void addServiceDescriptionProvider(ServiceDescriptionProvider provider);
+
+	Set<ServiceDescriptionProvider> getDefaultServiceDescriptionProviders();
+
+	Set<ServiceDescriptionProvider> getServiceDescriptionProviders();
+
+	Set<ServiceDescriptionProvider> getServiceDescriptionProviders(
+			ServiceDescription sd);
+
+	Set<ServiceDescription> getServiceDescriptions();
+
+	ServiceDescription getServiceDescription(URI activityType);
+
+	List<ConfigurableServiceProvider> getUnconfiguredServiceProviders();
+
+	Set<ServiceDescriptionProvider> getUserAddedServiceProviders();
+
+	Set<ServiceDescriptionProvider> getUserRemovedServiceProviders();
+
+	void loadServiceProviders();
+
+	void loadServiceProviders(File serviceProvidersURL);
+
+	void loadServiceProviders(URL serviceProvidersURL);
+
+	void refresh();
+
+	void removeServiceDescriptionProvider(ServiceDescriptionProvider provider);
+
+	void saveServiceDescriptions();
+
+	void saveServiceDescriptions(File serviceDescriptionsFile);
+
+	void exportCurrentServiceDescriptions(File serviceDescriptionsFile);
+
+	boolean isDefaultSystemConfigurableProvidersLoaded();
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionsConfiguration.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionsConfiguration.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionsConfiguration.java
new file mode 100644
index 0000000..8aa62e3
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/ServiceDescriptionsConfiguration.java
@@ -0,0 +1,35 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions;
+
+import uk.org.taverna.configuration.Configurable;
+
+/**
+ * @author David Withers
+ */
+public interface ServiceDescriptionsConfiguration extends Configurable {
+	public boolean isIncludeDefaults();
+
+	public void setIncludeDefaults(boolean includeDefaults);
+
+	public boolean isRemovePermanently();
+
+	public void setRemovePermanently(boolean removePermanently);
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderEvent.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderEvent.java
new file mode 100644
index 0000000..8f58594
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderEvent.java
@@ -0,0 +1,35 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public abstract class AbstractProviderEvent extends
+		ServiceDescriptionRegistryEvent {
+	private final ServiceDescriptionProvider provider;
+
+	public AbstractProviderEvent(ServiceDescriptionProvider provider) {
+		this.provider = provider;
+	}
+
+	public ServiceDescriptionProvider getProvider() {
+		return provider;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderNotification.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderNotification.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderNotification.java
new file mode 100644
index 0000000..fa5bb48
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AbstractProviderNotification.java
@@ -0,0 +1,37 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class AbstractProviderNotification extends AbstractProviderEvent {
+
+	private final String message;
+
+	public AbstractProviderNotification(ServiceDescriptionProvider provider, String message) {
+		super(provider);
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a9a52bd5/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AddedProviderEvent.java
----------------------------------------------------------------------
diff --git a/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AddedProviderEvent.java b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AddedProviderEvent.java
new file mode 100644
index 0000000..e3e1655
--- /dev/null
+++ b/taverna-activity-palette-api/src/main/java/org/apache/taverna/servicedescriptions/events/AddedProviderEvent.java
@@ -0,0 +1,29 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+
+package org.apache.taverna.servicedescriptions.events;
+
+import org.apache.taverna.servicedescriptions.ServiceDescriptionProvider;
+
+public class AddedProviderEvent extends AbstractProviderEvent {
+
+	public AddedProviderEvent(ServiceDescriptionProvider provider) {
+		super(provider);
+	}
+}
\ No newline at end of file