diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfiguration.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfiguration.java
index 53050c1..5dbbf4e 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfiguration.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -90,39 +90,6 @@
 	 */
 	public static final String ATTR_SOURCE_LOCATOR_MEMENTO = DebugPlugin.getUniqueIdentifier() + ".source_locator_memento"; //$NON-NLS-1$
 	
-	
-	/**
-	 * Flag indicating that only this configuration is to be modified by an operation.
-	 * Any template children referring to this configuration will not be modified.
-	 * 
-	 * @since 3.6
-	 */
-	public static final int UPDATE_NONE = 0;
-	
-	/**
-	 * Flag indicating that this configuration and any effected template children of this template
-	 * should be updated when this configuration is modified.
-	 * 
-	 * @since 3.6
-	 */
-	public static final int UPDATE_TEMPLATE_CHILDREN = 1;
-	
-	/** 
-	 * Type constant (bit mask value 1) which identifies a launch configuration.
-	 * 
-	 * @see #getKind()
-	 * @since 3.6
-	 */
-	public static final int CONFIGURATION = 0x1;
-
-	/**
-	 * Type constant (bit mask value 2) which identifies a template.
-	 * 
-	 * @see #getKind()
-	 * @since 3.6
-	 */
-	public static final int TEMPLATE = 0x2;	
-	
 	/**
 	 * Returns whether the contents of this launch configuration are 
 	 * equal to the contents of the given launch configuration.
@@ -157,9 +124,7 @@
 	 * Deletes this launch configuration. This configuration's underlying
 	 * storage is deleted. Has no effect if this configuration
 	 * does not exist.
-	 * <p>
-	 * Equivalent to #delete(UPDATE_NONE)
-	 * </p>
+	 * 
 	 * @exception CoreException if this method fails. Reasons include:
 	 * <ul>
 	 * <li>An exception occurs while deleting this configuration's
@@ -169,24 +134,6 @@
 	public void delete() throws CoreException;
 	
 	/**
-	 * Deletes this launch configuration. This configuration's underlying
-	 * storage is deleted. Has no effect if this configuration
-	 * does not exist.
-	 * <p>
-	 * When UPDATE_TEMPLATE_CHILDREN is specified, back pointers to this template
-	 * are cleared in any template children.
-	 * </p>
-	 * @param flag one of UPDATE_NONE or UPDATE_TEMPLATE_CHILDREN
-	 * @exception CoreException if this method fails. Reasons include:
-	 * <ul>
-	 * <li>An exception occurs while deleting this configuration's
-	 *  underlying storage or updating any template children.</li>
-	 * </ul>
-	 * @since 3.6
-	 */
-	public void delete(int flag) throws CoreException;
-	
-	/**
 	 * Returns whether this launch configuration's underlying
 	 * storage exists. This is a handle-only method.
 	 * 
@@ -649,62 +596,4 @@
 	 * @since 3.3
 	 */
 	public boolean isReadOnly();	
-	
-	/**
-	 * Returns the template this launch configuration was created from
-	 * or <code>null</code> if none.
-	 * 
-	 * @return the template this launch configuration was created from
-	 *  or <code>null</code> if none
-	 * @throws CoreException if the template could not be retrieved
-	 *  or no longer exists
-	 * @since 3.6
-	 */
-	public ILaunchConfiguration getTemplate() throws CoreException;
-	
-	/**
-	 * Returns a map of attributes in this launch configuration that are
-	 * different from the specified attributes. Returns an empty map if
-	 * this launch configuration contains equivalent attributes. A <code>null</code>
-	 * value is returned for attributes not contained in this launch configuration.
-	 * 
-	 * @param attributes to compare to
-	 * @return a map of attributes in this launch configuration that 
-	 *  are different from the specified attributes
-	 * @throws CoreException if an exception occurs while comparing
-	 * @since 3.6
-	 */
-	public Map findDifferences(Map attributes) throws CoreException;
-	
-	/**
-	 * Returns whether this configuration is a template.
-	 * 
-	 * @return whether this configuration is a template
-	 * @throws CoreException if unable to determine if this configuration is a template
-	 * 	or if this configuration does not exist
-	 * @since 3.6
-	 */
-	public boolean isTemplate() throws CoreException;
-	
-	/**
-	 * Returns all configurations made from this template, possibly an
-	 * empty collection.
-	 * 
-	 * @return all configurations made from this template
-	 * @throws CoreException
-	 * @since 3.6
-	 */
-	public ILaunchConfiguration[] getTemplateChildren() throws CoreException;
-	
-	/**
-	 * Returns this configuration's kind. One of CONFIGURATION or TEMPLATE.
-	 * 
-	 * @see #CONFIGURATION
-	 * @see #TEMPLATE
-	 * 
-	 * @return this configuration's kind
-	 * @throws CoreException if unable to retrieve this configuration's kind
-	 * @since 3.6
-	 */
-	public int getKind() throws CoreException;
 }
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java
index d9b7441..ded6948 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -276,7 +276,7 @@
 	 * When <code>container</code> is </code>null</code>, the configuration
 	 * will reside locally in the metadata area.
 	 * Note: a launch configuration is not actually created until the working copy is saved.
-	 *
+	 * 
 	 * @param container the container in which the new configuration will
 	 *  reside, or <code>null</code> if the configuration should reside
 	 *  locally with the metadata.
@@ -289,25 +289,6 @@
 	public ILaunchConfigurationWorkingCopy newInstance(IContainer container, String name) throws CoreException;
 	
 	/**
-	 * Returns a new launch configuration template working copy of this type,
-	 * that resides in the specified container, with the given name.
-	 * When <code>container</code> is </code>null</code>, the configuration
-	 * will reside locally in the metadata area.
-	 * Note: a launch configuration is not actually created until the working copy is saved.
-	 *
-	 * @param container the container in which the new configuration will
-	 *  reside, or <code>null</code> if the configuration should reside
-	 *  locally with the metadata.
-	 * @param name name for the launch configuration
-	 * @return a new launch configuration working copy template of this type
-	 * @exception CoreException if an instance of this type
-	 *  of launch configuration could not be created for any
-	 *  reason
-	 * @since 3.6
-	 */
-	public ILaunchConfigurationWorkingCopy newTemplate(IContainer container, String name) throws CoreException;	
-	
-	/**
 	 * Returns whether this type of launch configuration supports
 	 * the specified mode.
 	 * 
@@ -325,36 +306,6 @@
 	 * @return name of contributing plug-in
 	 * @since 3.3
 	 */
-	public String getContributorName();	
-	
-	/**
-	 * Returns all launch configuration templates of the this type, possibly
-	 * an empty collection.
-	 * 
-	 * @return all launch configuration templates of the this type
-	 * @throws CoreException if unable to retrieve the templates 
-	 * @since 3.6
-	 */
-	public ILaunchConfiguration[] getTemplates() throws CoreException;	
-	
-	/**
-	 * Returns a new launch configuration working copy of this type,
-	 * that resides in the specified container, with the given name, initialized
-	 * with values from the given template.
-	 * When <code>container</code> is </code>null</code>, the configuration
-	 * will reside locally in the metadata area.
-	 * Note: a launch configuration is not actually created until the working copy is saved.
-	 * 
-	 * @param container the container in which the new configuration will
-	 *  reside, or <code>null</code> if the configuration should reside
-	 *  locally with the metadata.
-	 * @param name name for the launch configuration
-	 * @param template launch configuration template, or <code>null</code>
-	 * @return a new launch configuration working copy instance of this type
-	 * @exception CoreException if an instance of this type
-	 *  of launch configuration could not be created for any
-	 *  reason
-	 * @since 3.6
-	 */
-	public ILaunchConfigurationWorkingCopy newInstance(IContainer container, String name, ILaunchConfiguration template) throws CoreException;	
+	public String getContributorName();
+
 }
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationWorkingCopy.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationWorkingCopy.java
index d159545..2a8ac2a 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationWorkingCopy.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchConfigurationWorkingCopy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -64,40 +64,11 @@
 	 * saved to the parent working copy and the parent working copy is returned without
 	 * effecting the original launch configuration.
 	 * </p>
-	 * <p>
-	 * Equivalent to #doSave(UPDATE_NONE).
-	 * </p>
 	 * @return handle to saved launch configuration
 	 * @exception CoreException if an exception occurs while 
 	 *  writing this configuration to its underlying file.
-	 * @see #doSave(int)
 	 */
 	public ILaunchConfiguration doSave() throws CoreException;
-	
-	/**
-	 * Saves this working copy to its underlying file and returns
-	 * a handle to the resulting launch configuration.
-	 * Has no effect if this configuration does not need saving.
-	 * Creates the underlying file if not yet created.
-	 * <p>
-	 * Since 3.3, if this is a nested working copy, the contents of this working copy are
-	 * saved to the parent working copy and the parent working copy is returned without
-	 * effecting the original launch configuration.
-	 * </p>
-	 * <p>
-	 * Updates any affected template children based on the given flag. When a working
-	 * copy is renamed or moved to a new location, template children's back pointers
-	 * will be updated to refer the proper configuration.
-	 * </p>
-	 * @param flag one of {@link ILaunchConfiguration#UPDATE_NONE} or
-	 *  {@link ILaunchConfiguration#UPDATE_TEMPLATE_CHILDREN}
-	 * @return handle to saved launch configuration
-	 * @exception CoreException if an exception occurs while 
-	 *  writing this configuration or any of its affected template children
-	 *  to underlying storage
-	 * @since 3.6
-	 */
-	public ILaunchConfiguration doSave(int flag) throws CoreException;	
 			
 	/**
 	 * Sets the integer-valued attribute with the given name.  
@@ -292,35 +263,4 @@
 	 * @since 3.3
 	 */
 	public ILaunchConfigurationWorkingCopy getParent();
-	
-	/**
-	 * Copies all attributes from the given template to this working.
-	 * Overwrites any existing attributes with the same key.
-	 * 
-	 * @param template configuration template
-	 * @exception CoreException if unable to retrieve attributes from the template
-	 * @since 3.6
-	 */
-	public void copyAttributes(ILaunchConfiguration template) throws CoreException;
-	
-	/**
-	 * Sets the template that this configuration is based on, possibly <code>null</code>,
-	 * and optionally copies attributes from the template to this working copy.
-	 * <p>
-	 * When the specified template is <code>null</code>, this working copy is no longer
-	 * associated with any template.
-	 * </p>
-	 * @param template template or <code>null</code>
-	 * @param copy whether to copy attributes from the template to this working copy. Has
-	 *  no effect when template is <code>null</code>
-	 * @exception CoreException if
-	 * 	<ul>
-	 *  <li>unable to generate a memento for the given configuration
-	 * 	 or copy its attributes</li>
-	 *  <li>if attempting to set a template attribute on an existing template - templates
-	 *   cannot be nested</li>
-	 *  </ul>
-	 * @since 3.6
-	 */
-	public void setTemplate(ILaunchConfiguration template, boolean copy) throws CoreException;
 }
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java
index 4ed20fe..99c3b17 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/core/ILaunchManager.java
@@ -128,7 +128,7 @@
 	 * @param namePrefix the String that the returned name must begin with
 	 * @return launch configuration name
 	 * @since 2.0
-	 * @deprecated since 3.6 clients should use the {@link #generateLaunchConfigurationName(String)} method which
+	 * @deprecated since 3.5 clients should use the {@link #generateLaunchConfigurationName(String)} method which
 	 * will perform validation of the name and correct unsupported name parts. 
 	 */
 	public String generateUniqueLaunchConfigurationNameFrom(String namePrefix);
@@ -207,9 +207,7 @@
 	 * in the specified file. This method does not check if the specified <code>IFile</code> is 
 	 * a launch configuration file or that it exists in the local or
 	 * remote file system.
-	 * <p>
-	 * Since 3.6, the returned configuration may be a launch configuration template.
-	 * </p>
+	 * 
 	 * @param file launch configuration file
 	 * @return a handle to the launch configuration contained
 	 *  in the specified file
@@ -219,9 +217,7 @@
 	/**
 	 * Returns a handle to the launch configuration specified by
 	 * the given memento. The configuration may not exist.
-	 * <p>
-	 * Since 3.6, the returned configuration may be a launch configuration template.
-	 * </p>
+	 * 
 	 * @param memento launch configuration memento
 	 * @return a handle to the launch configuration specified by
 	 *  the given memento
@@ -233,64 +229,24 @@
 	public ILaunchConfiguration getLaunchConfiguration(String memento) throws CoreException;
 	/**
 	 * Returns all launch configurations defined in the workspace.
-	 * <p>
-	 * Does not include launch configuration templates. Equivalent to
-	 * #getLaunchConfigurations(ILaunchConfiguration.CONFIGURATION).
-	 * </p>
+	 * 
 	 * @return all launch configurations defined in the workspace
 	 * @exception CoreException if an exception occurs retrieving configurations
 	 * @since 2.0
-	 * @see ILaunchConfigurationType#getTemplates()
 	 */
 	public ILaunchConfiguration[] getLaunchConfigurations() throws CoreException;	
-	
-	/**
-	 * Returns all launch configurations defined in the workspace of the specified
-	 * kind(s) (configurations and/or templates).
-	 * 
-	 * @param kinds bit mask of kinds of configurations to consider
-	 * @return all launch configurations defined in the workspace
-	 * @exception CoreException if an exception occurs retrieving configurations
-	 * @since 3.6
-	 * @see ILaunchConfiguration#CONFIGURATION
-	 * @see ILaunchConfiguration#TEMPLATE
-	 * @see ILaunchConfiguration#getKind()
-	 * @see ILaunchConfigurationType#getTemplates()
-	 */
-	public ILaunchConfiguration[] getLaunchConfigurations(int kinds) throws CoreException;	
-	
 	/**
 	 * Returns all launch configurations of the specified type defined in the workspace
-	 * <p>
-	 * Does not include launch configuration templates.
-	 * </p>
+	 * 
 	 * @param type a launch configuration type
 	 * @return all launch configurations of the specified type defined in the workspace
 	 * @exception CoreException if an error occurs while retrieving
 	 *  a launch configuration
 	 * @since 2.0
-	 * @see ILaunchConfigurationType#getTemplates()
 	 */
 	public ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type) throws CoreException;
 	
 	/**
-	 * Returns all launch configurations of the specified type defined in the workspace
-	 * of the specified kind(s) (configurations and/or templates).
-	 * 
-	 * @param type a launch configuration type
-	 * @param kinds bit mask of kinds of configurations to consider
-	 * @return all launch configurations of the specified type defined in the workspace
-	 * @exception CoreException if an error occurs while retrieving
-	 *  a launch configuration
-	 * @since 3.6
-	 * @see ILaunchConfiguration#CONFIGURATION
-	 * @see ILaunchConfiguration#TEMPLATE
-	 * @see ILaunchConfiguration#getKind()
-	 * @see ILaunchConfigurationType#getTemplates()
-	 */
-	public ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type, int kinds) throws CoreException;	
-	
-	/**
 	 * Returns the launch configuration type extension with the specified
 	 * id, or <code>null</code> if it does not exist.
 	 * 
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
index 4e5c8a7..141f43e 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
@@ -17,13 +17,10 @@
 import java.io.StringReader;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.Map.Entry;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -110,14 +107,6 @@
 	 * @since 3.3
 	 */
 	public static final String ATTR_PREFERRED_LAUNCHERS = DebugPlugin.getUniqueIdentifier() + ".preferred_launchers"; //$NON-NLS-1$	
-		
-	/**
-	 * Launch configuration attribute storing a memento identifying the template
-	 * this configuration was made from, possibly <code>null</code>.
-	 * 
-	 *  @since 3.6
-	 */
-	public static final String ATTR_TEMPLATE = DebugPlugin.getUniqueIdentifier() + ".ATTR_TEMPLATE"; //$NON-NLS-1$
 	
 	/**
 	 * Status handler to prompt in the UI thread
@@ -312,22 +301,6 @@
 		}
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#delete(int)
-	 */
-	public void delete(int flag) throws CoreException {
-		if (flag == UPDATE_TEMPLATE_CHILDREN && isTemplate()) {
-			// clear back pointers to this configuration
-			ILaunchConfiguration[] children = getTemplateChildren();
-			for (int i = 0; i < children.length; i++) {
-				ILaunchConfigurationWorkingCopy child = children[i].getWorkingCopy();
-				child.setTemplate(null, false);
-				child.doSave();
-			}
-		}
-		delete();
-	}
-	
 	/**
 	 * Returns whether this configuration is equal to the
 	 * given configuration. Two configurations are equal if
@@ -977,69 +950,6 @@
 	public String toString() {
 		return getName();
 	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getTemplate()
-	 */
-	public ILaunchConfiguration getTemplate() throws CoreException {
-		String memento = getAttribute(ATTR_TEMPLATE, (String)null);
-		if (memento != null) {
-			return new LaunchConfiguration(memento);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getTemplateChildren()
-	 */
-	public ILaunchConfiguration[] getTemplateChildren() throws CoreException {
-		ILaunchConfiguration[] configurations = getLaunchManager().getLaunchConfigurations(getType());
-		List proteges = new ArrayList();
-		for (int i = 0; i < configurations.length; i++) {
-			ILaunchConfiguration config = configurations[i];
-			if (this.equals(config.getTemplate())) {
-				proteges.add(config);
-			}
-		}
-		return (ILaunchConfiguration[]) proteges.toArray(new ILaunchConfiguration[proteges.size()]);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#isTemplate()
-	 */
-	public boolean isTemplate() throws CoreException {
-		return getInfo().isTemplate();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#getKind()
-	 */
-	public int getKind() throws CoreException {
-		if (isTemplate()) {
-			return TEMPLATE;
-		}
-		return CONFIGURATION;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfiguration#findDifferences(java.util.Map)
-	 */
-	public Map findDifferences(Map attributes) throws CoreException {
-		Map result = new HashMap();
-		Set entries = attributes.entrySet();
-		Iterator iterator = entries.iterator();
-		LaunchConfigurationInfo info = getInfo();
-		while (iterator.hasNext()) {
-			Entry entry = (Entry) iterator.next();
-			String key = (String) entry.getKey();
-			Object attr1 = entry.getValue();
-			Object attr2 = info.getObjectAttribute(key);
-			if (!LaunchConfigurationInfo.compareAttribute(key, attr1, attr2)) {
-				result.put(key, attr2);
-			}
-		}
-		return result;
-	}
 	
 }
 
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
index 5bbac3f..db79a6a 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
@@ -59,7 +59,6 @@
 	private static final String INT_ATTRIBUTE = "intAttribute"; //$NON-NLS-1$
 	private static final String STRING_ATTRIBUTE = "stringAttribute"; //$NON-NLS-1$
 	private static final String TYPE = "type"; //$NON-NLS-1$
-	private static final String TEMPLATE = "template"; //$NON-NLS-1$
 	
 	/**
 	 * This configurations attribute table. Keys are <code>String</code>s and
@@ -74,16 +73,6 @@
 	private ILaunchConfigurationType fType;
 	
 	/**
-	 * Whether this configuration is a template
-	 */
-	private boolean fIsTemplate = false;
-	
-	/**
-	 * Static access to the launch manager.
-	 */
-	private static LaunchManager fgLaunchManager = (LaunchManager)DebugPlugin.getDefault().getLaunchManager(); 
-	
-	/**
 	 * Whether running on Sun 1.4 VM - see bug 110215
 	 */
 	private static boolean fgIsSun14x = false;
@@ -265,16 +254,6 @@
 	}
 	
 	/**
-	 * Returns the raw object from the attribute table or <code>null</code> if none.
-	 * 
-	 * @param key attribute key
-	 * @return raw attribute value 
-	 */
-	protected Object getObjectAttribute(String key) {
-		return getAttributeTable().get(key);
-	}
-	
-	/**
 	 * Returns the <code>java.util.Map</code> attribute with the given key or
 	 * the given default value if undefined.
 	 * 
@@ -328,7 +307,6 @@
 		LaunchConfigurationInfo copy = new LaunchConfigurationInfo();
 		copy.setType(getType());
 		copy.setAttributeTable(getAttributes());
-		copy.setTemplate(isTemplate());
 		return copy;
 	}
 	
@@ -378,9 +356,6 @@
 		doc.appendChild(configRootElement);
 		
 		configRootElement.setAttribute(TYPE, getType().getIdentifier()); 
-		if (isTemplate()) {
-			configRootElement.setAttribute(TEMPLATE, Boolean.TRUE.toString());
-		}
 		
 		Iterator keys = getAttributeTable().keySet().iterator();
 		while (keys.hasNext()) {
@@ -532,13 +507,6 @@
 		}
 		setType(type);
 		
-		String template = root.getAttribute(TEMPLATE);
-		boolean is = false;
-		if (template != null && template.length() > 0) {
-			is = Boolean.valueOf(template).booleanValue();
-		}
-		setTemplate(is);
-		
 		NodeList list = root.getChildNodes();
 		Node node = null;
 		Element element = null;
@@ -751,15 +719,38 @@
 	 * @return whether the two attribute maps are equal
 	 */
 	protected boolean compareAttributes(TreeMap map1, TreeMap map2) {
+		LaunchManager manager = (LaunchManager)DebugPlugin.getDefault().getLaunchManager();
 		if (map1.size() == map2.size()) {
 			Iterator attributes = map1.keySet().iterator();
 			while (attributes.hasNext()) {
 				String key = (String)attributes.next();
 				Object attr1 = map1.get(key);
 				Object attr2 = map2.get(key);
-				if (!compareAttribute(key, attr1, attr2)) {
+				if (attr2 == null) {
 					return false;
 				}
+				Comparator comp = manager.getComparator(key);
+				if (comp == null) {
+					if (fgIsSun14x) {
+						if(attr2 instanceof String & attr1 instanceof String) {
+							// this is a hack for bug 110215, on SUN 1.4.x, \r
+							// is stripped off when the stream is written to the
+							// DOM
+							// this is not the case for 1.5.x, so to be safe we
+							// are stripping \r off all strings before we
+							// compare for equality
+							attr1 = ((String)attr1).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
+							attr2 = ((String)attr2).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
+						}
+					}
+					if (!attr1.equals(attr2)) {
+						return false;
+					}
+				} else {
+					if (comp.compare(attr1, attr2) != 0) {
+						return false;
+					}
+				}
 			}
 			return true;	
 		}
@@ -767,43 +758,6 @@
 	}
 	
 	/**
-	 * Returns whether the two attributes are equal, considering comparator extensions.
-	 * 
-	 * @param key attribute key
-	 * @param attr1 attribute value
-	 * @param attr2 attribute value to compare to, possibly <code>null</code>
-	 * @return whether equivalent
-	 */
-	protected static boolean compareAttribute(String key, Object attr1, Object attr2) {
-		if (attr2 == null) {
-			return false;
-		}
-		Comparator comp = fgLaunchManager.getComparator(key);
-		if (comp == null) {
-			if (fgIsSun14x) {
-				if(attr2 instanceof String & attr1 instanceof String) {
-					// this is a hack for bug 110215, on SUN 1.4.x, \r
-					// is stripped off when the stream is written to the
-					// DOM
-					// this is not the case for 1.5.x, so to be safe we
-					// are stripping \r off all strings before we
-					// compare for equality
-					attr1 = ((String)attr1).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
-					attr2 = ((String)attr2).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
-				}
-			}
-			if (!attr1.equals(attr2)) {
-				return false;
-			}
-		} else {
-			if (comp.compare(attr1, attr2) != 0) {
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	/**
 	 * @see java.lang.Object#hashCode()
 	 */
 	public int hashCode() {
@@ -836,24 +790,5 @@
 		}
 		return null;
 	}
-	
-	/**
-	 * Sets whether this info is a template.
-	 * 
-	 * @param isTemplate
-	 * @throws CoreException
-	 */
-	void setTemplate(boolean isTemplate) {
-		fIsTemplate = isTemplate;
-	}	
-	
-	/**
-	 * Returns whether this info is a template.
-	 * 
-	 * @return whether a template
-	 */
-	boolean isTemplate() {
-		return fIsTemplate;
-	}
 }
 
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
index ef31b20..a33a579 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2009 IBM Corporation and others.
+ * Copyright (c) 2000, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -487,31 +487,5 @@
 		return fModeCombinations.contains(modes);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#getTemplates()
-	 */
-	public ILaunchConfiguration[] getTemplates() throws CoreException {
-		return DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(this, ILaunchConfiguration.TEMPLATE);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#newTemplate(org.eclipse.core.resources.IContainer, java.lang.String)
-	 */
-	public ILaunchConfigurationWorkingCopy newTemplate(IContainer container, String name) throws CoreException {
-		LaunchConfigurationWorkingCopy wc = new LaunchConfigurationWorkingCopy(container, name, this);
-		wc.setTemplate(true);
-		return wc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationType#newInstance(org.eclipse.core.resources.IContainer, java.lang.String, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public ILaunchConfigurationWorkingCopy newInstance(IContainer container, String name, ILaunchConfiguration template) throws CoreException {
-		ILaunchConfigurationWorkingCopy wc = newInstance(container, name);
-		if (template != null) {
-			wc.setTemplate(template, true);
-		}
-		return wc;
-	}
 }
 
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
index d65760f..fffc54a 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
@@ -17,11 +17,9 @@
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.Map.Entry;
 
 import org.eclipse.core.filesystem.EFS;
 import org.eclipse.core.filesystem.IFileStore;
@@ -717,73 +715,5 @@
 	public Object removeAttribute(String attributeName) {
 		return getInfo().removeAttribute(attributeName);
 	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#copyAttributes(org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	public void copyAttributes(ILaunchConfiguration template) throws CoreException {
-		Map map = template.getAttributes();
-		Iterator iterator = map.entrySet().iterator();
-		LaunchConfigurationInfo info = getInfo();
-		while (iterator.hasNext()) {
-			Entry entry = (Entry) iterator.next();
-			String attr = (String) entry.getKey();
-			info.setAttribute(attr, entry.getValue());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#setTemplate(org.eclipse.debug.core.ILaunchConfiguration, boolean)
-	 */
-	public void setTemplate(ILaunchConfiguration template, boolean copy) throws CoreException {
-		if (template != null && !template.isTemplate()) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugCoreMessages.LaunchConfigurationWorkingCopy_8));
-		}
-		if (template != null && template.isWorkingCopy()) {
-			throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugCoreMessages.LaunchConfigurationWorkingCopy_6));
-		}
-		if (template == null) {
-			removeAttribute(ATTR_TEMPLATE);
-		} else {
-			if (isTemplate()) {
-				throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugCoreMessages.LaunchConfigurationWorkingCopy_7));
-			}
-			if (copy) {
-				copyAttributes(template);
-			}
-			setAttribute(ATTR_TEMPLATE, template.getMemento());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#doSave(int)
-	 */
-	public ILaunchConfiguration doSave(int flag) throws CoreException {
-		ILaunchConfiguration[] children = null;
-		if (UPDATE_TEMPLATE_CHILDREN == flag) {
-			if (!isNew() && isMoved() && getParent() == null) {
-				children = getOriginal().getTemplateChildren();
-			}
-		}
-		ILaunchConfiguration saved = doSave();
-		if (children != null) {
-			for (int i = 0; i < children.length; i++) {
-				ILaunchConfigurationWorkingCopy wc = children[i].getWorkingCopy();
-				wc.setTemplate(saved, false);
-				wc.doSave();
-			}
-		}
-		return saved;
-	}
-	
-	/**
-	 * Sets whether this working copy is a template.
-	 * 
-	 * @param template whether a template
-	 * @since 3.6
-	 */
-	void setTemplate(boolean template) {
-		getInfo().setTemplate(template);
-	}
 }
 
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
index c0d1d62..8ad00cb 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
@@ -1108,8 +1108,7 @@
 	 */
 	protected synchronized String[] getAllSortedConfigNames() {
 		if (fSortedConfigNames == null) {
-			List collection = getAllLaunchConfigurations();
-			ILaunchConfiguration[] configs = (ILaunchConfiguration[]) collection.toArray(new ILaunchConfiguration[collection.size()]);
+			ILaunchConfiguration[] configs = getLaunchConfigurations();
 			fSortedConfigNames = new String[configs.length];
 			for (int i = 0; i < configs.length; i++) {
 				fSortedConfigNames[i] = configs[i].getName();
@@ -1377,53 +1376,26 @@
 	/**
 	 * @see ILaunchManager#getLaunchConfigurations()
 	 */
-	public synchronized ILaunchConfiguration[] getLaunchConfigurations() throws CoreException {
-		return getLaunchConfigurations(ILaunchConfiguration.CONFIGURATION);
-	}	
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getLaunchConfigurations(int)
-	 */
-	public ILaunchConfiguration[] getLaunchConfigurations(int kinds) throws CoreException {
+	public synchronized ILaunchConfiguration[] getLaunchConfigurations() {
 		List allConfigs = getAllLaunchConfigurations();
-		if (((kinds & ILaunchConfiguration.CONFIGURATION) > 0) && ((kinds & ILaunchConfiguration.TEMPLATE) > 0)) {
-			// all kinds
-			return (ILaunchConfiguration[])allConfigs.toArray(new ILaunchConfiguration[allConfigs.size()]);
-		} else {
-			List select = new ArrayList(allConfigs.size());
-			Iterator iterator = allConfigs.iterator();
-			while (iterator.hasNext()) {
-				ILaunchConfiguration config = (ILaunchConfiguration) iterator.next();
-				if ((config.getKind() & kinds) > 0) {
-					select.add(config);
-				}
-			}
-			return (ILaunchConfiguration[]) select.toArray(new ILaunchConfiguration[select.size()]);
-		}
-	}
+		return (ILaunchConfiguration[])allConfigs.toArray(new ILaunchConfiguration[allConfigs.size()]);
+	}	
 	
 	/**
 	 * @see ILaunchManager#getLaunchConfigurations(ILaunchConfigurationType)
 	 */
 	public synchronized ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type) throws CoreException {
-		return getLaunchConfigurations(type, ILaunchConfiguration.CONFIGURATION);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchManager#getLaunchConfigurations(org.eclipse.debug.core.ILaunchConfigurationType, int)
-	 */
-	public synchronized ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type, int kinds) throws CoreException {
 		Iterator iter = getAllLaunchConfigurations().iterator();
 		List configs = new ArrayList();
 		ILaunchConfiguration config = null;
 		while (iter.hasNext()) {
 			config = (ILaunchConfiguration)iter.next();
-			if (config.getType().equals(type) && ((config.getKind() & kinds) > 0)) {
+			if (config.getType().equals(type)) {
 				configs.add(config);
 			}
 		}
 		return (ILaunchConfiguration[])configs.toArray(new ILaunchConfiguration[configs.size()]);
-	}	
+	}
 	
 	/**
 	 * Returns all launch configurations that are stored as resources
diff --git a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java
index c9de10c..71d9ad5 100644
--- a/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java
+++ b/org.eclipse.debug.tests/src/org/eclipe/debug/tests/launching/LaunchConfigurationTests.java
@@ -140,28 +140,7 @@
 		 assertTrue("Should need saving", wc.isDirty()); //$NON-NLS-1$
 		 return wc;
 	}
-	
-	/** 
-	 * Creates and returns a new launch config the given name, local
-	 * or shared, with 4 attributes:
-	 *  - String1 = "String1"
-	 *  - Int1 = 1
-	 *  - Boolean1 = true
-	 *  - Boolean2 = false
-	 */
-	protected ILaunchConfigurationWorkingCopy newTemplate(IContainer container, String name) throws CoreException {
-		 ILaunchConfigurationType type = getLaunchManager().getLaunchConfigurationType(ID_TEST_LAUNCH_TYPE);
-		 assertTrue("Should support debug mode", type.supportsMode(ILaunchManager.DEBUG_MODE)); //$NON-NLS-1$
-		 assertTrue("Should support run mode", type.supportsMode(ILaunchManager.RUN_MODE)); //$NON-NLS-1$
-		 ILaunchConfigurationWorkingCopy wc = type.newTemplate(container, name);
-		 wc.setAttribute("String1", "String1"); //$NON-NLS-1$ //$NON-NLS-2$
-		 wc.setAttribute("Int1", 1); //$NON-NLS-1$
-		 wc.setAttribute("Boolean1", true); //$NON-NLS-1$
-		 wc.setAttribute("Boolean2", false); //$NON-NLS-1$
-		 assertTrue("Should need saving", wc.isDirty()); //$NON-NLS-1$
-		 return wc;
-	}	
-	
+		
 	/** 
 	 * Creates and returns a new launch configuration with the given name, local
 	 * or shared, with no attributes
@@ -172,17 +151,6 @@
 		 assertEquals("Should have no attributes", 0, wc.getAttributes().size());
 		 return wc;
 	}	
-	
-	/** 
-	 * Creates and returns a new launch configuration template with the given name, local
-	 * or shared, with no attributes
-	 */
-	protected ILaunchConfigurationWorkingCopy newEmptyTemplate(IContainer container, String name) throws CoreException {
-		 ILaunchConfigurationType type = getLaunchManager().getLaunchConfigurationType(ID_TEST_LAUNCH_TYPE);
-		 ILaunchConfigurationWorkingCopy wc = type.newTemplate(container, name);
-		 assertEquals("Should have no attributes", 0, wc.getAttributes().size());
-		 return wc;
-	}	
 		
 	/**
 	 * Returns whether the given handle is contained in the specified
@@ -1077,228 +1045,7 @@
 		IPath location = workingCopy.getLocation();
 		assertEquals("Wrong path for local working copy", LaunchManager.LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH.append("test-get-location.launch"), location);
 	}
-	
-	/**
-	 * Test copying attributes from one configuration to another.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testCopyAttributes() throws CoreException {
-		ILaunchConfigurationWorkingCopy source = newConfiguration(null, "test-copy-attributes-source");
-		ILaunchConfigurationWorkingCopy dest = newEmptyConfiguration(null, "test-copy-attributes-dest");
-		dest.copyAttributes(source);
-		assertTrue("String1 should be String1", dest.getAttribute("String1", "Missing").equals("String1")); 
-		assertTrue("Int1 should be 1", dest.getAttribute("Int1", 0) == 1);
-		assertTrue("Boolean1 should be true", dest.getAttribute("Boolean1", false));
-		assertTrue("Boolean2 should be false", !dest.getAttribute("Boolean2", true));
-	}
-	
-	/**
-	 * Tests that creation from a template works.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testCreationFromTemplate() throws CoreException {
-		ILaunchConfigurationWorkingCopy temp = newTemplate(null, "test-creation-from-template");
-		temp.setAttribute("TEMPLATE", "TEMPLATE");
-		ILaunchConfiguration template = temp.doSave();
-		ILaunchConfigurationType type = temp.getType();
-		
-		// create a new configuration in project scope priority
-		ILaunchConfigurationWorkingCopy config = type.newInstance(null, "test-scopes", template);
-		assertNotNull("Made from wrong template", config.getAttribute("TEMPLATE", (String)null));
-		assertEquals("Should refer to creation template", template, config.getTemplate());
-	}	
-	
-	/**
-	 * Tests setting the 'isTemplate' attribute.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testIsTemplate() throws CoreException {
-		ILaunchConfigurationWorkingCopy wc = newTemplate(null, "test-is-template");
-		ILaunchConfiguration template = wc.doSave();
-		assertTrue("Should be a template", template.isTemplate());
-		ILaunchConfiguration[] templates = wc.getType().getTemplates();
-		List list = new ArrayList();
-		for (int i = 0; i < templates.length; i++) {
-			list.add(templates[i]);
-		}
-		assertFalse("Expecting at least template", list.isEmpty());
-		assertTrue("Missing created template", list.contains(template));
-	}
-	
-	/**
-	 * Tests finding references to a template.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testTemplateChildren() throws CoreException {
-		ILaunchConfigurationWorkingCopy wc = newTemplate(null, "test-references");
-		ILaunchConfiguration template = wc.doSave();
-		
-		ILaunchConfigurationWorkingCopy r1 = newConfiguration(null, "referee-1");
-		ILaunchConfigurationWorkingCopy r2 = newConfiguration(null, "referee-2");
-		
-		r1.setTemplate(template, false);
-		r2.setTemplate(template, false);
-		
-		ILaunchConfiguration s1 = r1.doSave();
-		ILaunchConfiguration s2 = r2.doSave();
-		
-		ILaunchConfiguration[] children = template.getTemplateChildren();
-		assertEquals("Wrong number of template children", 2, children.length);
-		List list = new ArrayList();
-		for (int i = 0; i < children.length; i++) {
-			list.add(children[i]);		
-		}
-		assertTrue("Missing reference", list.contains(s1));
-		assertTrue("Missing reference", list.contains(s2));
-	}
-	
-	/**
-	 * Tests that when an attribute is removed from a working copy, it does not
-	 * get inherited from its template.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testTemplateRemoveBehavior() throws CoreException {
-		ILaunchConfigurationWorkingCopy wc = newConfiguration(null, "test-remove");
-		ILaunchConfigurationWorkingCopy t1 = newEmptyTemplate(null, "template-1");
-		t1.setAttribute("COMMON", "TEMPLATE-1");
-		t1.setAttribute("T1", "T1");
-		t1.setAttribute("String1", "String2");
-		ILaunchConfiguration template = t1.doSave();
-		
-		assertEquals("String1", wc.getAttribute("String1", "wrong"));
-		
-		wc.setTemplate(template, true);
-		wc.removeAttribute("String1");
-		assertEquals("TEMPLATE-1", wc.getAttribute("COMMON", (String)null));
-		assertEquals("T1", wc.getAttribute("T1", (String)null));
-		assertNull(wc.getAttribute("String1", (String)null));
-		
-	}	
-	
-	/**
-	 * Tests that setting a configuration's template to null cleans its template
-	 * association.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testUnTemplate() throws CoreException {
-		ILaunchConfigurationWorkingCopy wc = newConfiguration(null, "test-un-template");
-		ILaunchConfigurationWorkingCopy t1 = newEmptyTemplate(null, "template-un");
-		t1.setAttribute("COMMON", "TEMPLATE-1");
-		t1.setAttribute("T1", "T1");
-		t1.setAttribute("String1", "String2");
-		ILaunchConfiguration template = t1.doSave();
-		wc.setTemplate(template, true);
-		ILaunchConfiguration configuration = wc.doSave();
-		assertEquals(template, configuration.getTemplate());
-		wc = configuration.getWorkingCopy();
-		wc.setTemplate(null, false);
-		configuration = wc.doSave();
-		assertNull(configuration.getTemplate());
-		ILaunchConfiguration[] children = t1.getTemplateChildren();
-		assertEquals(0, children.length);
-	}
-	
-	/**
-	 * Tests that nested templates are not allowed.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testNestedTemplates() throws CoreException {
-		ILaunchConfigurationWorkingCopy t1 = newTemplate(null, "test-nest-root");
-		ILaunchConfigurationWorkingCopy t2 = newTemplate(null, "template-nested");
-		ILaunchConfiguration template = t1.doSave();
-		try {
-			t2.setTemplate(template, true);
-		} catch (CoreException e) {
-			return;
-		}
-		assertTrue("Shoud not be able to nest templates", false);
-	}
-	
-	/**
-	 * Test that you cannot set a config's template to be a non-template.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testIllegalTemplate() throws CoreException {
-		ILaunchConfigurationWorkingCopy c1 = newConfiguration(null, "test-config");
-		ILaunchConfigurationWorkingCopy t1 = newConfiguration(null, "test-not-a-template");
-		ILaunchConfiguration config = t1.doSave();
-		try {
-			c1.setTemplate(config, true);
-		} catch (CoreException e) {
-			// expected
-			return;
-		}
-		assertTrue("Should not be able to set configration as template", false);
-	}
-	
-	/**
-	 * Test that a template can be duplicated (and results in a template).
-	 * 
-	 * @throws CoreException
-	 */
-	public void testCopyTemplate() throws CoreException {
-		ILaunchConfigurationWorkingCopy t1 = newEmptyTemplate(null, "template-to-duplicate");
-		ILaunchConfigurationWorkingCopy t2 = t1.copy("duplicate-template");
-		assertTrue(t2.isTemplate());
-	}
-	
-	/**
-	 * Tests that a template that adds an attribute is not considered to override any template
-	 * values.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testTemplateNoOverride() throws CoreException {
-		ILaunchConfigurationWorkingCopy t1 = newTemplate(null, "2-b-the-same");
-		ILaunchConfiguration template = t1.doSave();
-		ILaunchConfigurationWorkingCopy wc = template.getType().newInstance(null, "will-b-the-same", template);
-		wc.setAttribute("EXTEND-ATTRIBUTES", "EXTEND-ATTRIBUTES");
-		Map dif = wc.findDifferences(template.getAttributes());
-		assertTrue("Should not override any values", dif.isEmpty());
-	}
-	
-	/**
-	 * Tests that a template that changes an attribute is considered to override its template
-	 * values.
-	 * 
-	 * @throws CoreException
-	 */
-	public void testTemplateOverride() throws CoreException {
-		ILaunchConfigurationWorkingCopy t1 = newTemplate(null, "2-b-diff");
-		ILaunchConfiguration template = t1.doSave();
-		ILaunchConfigurationWorkingCopy wc = template.getType().newInstance(null, "will-b-diff", template);
-		wc.setAttribute("String1", "String2"); 
-		Map dif = wc.findDifferences(template.getAttributes());
-		assertEquals("Should override String1 value", 1, dif.size());
-		assertTrue("Should override String1 value", dif.containsKey("String1"));
-		assertEquals("Should override String1 value with String2", "String2", dif.get("String1"));
-	}
-	
-	/**
-	 * Test that a configuration that omits a template value shows the difference with
-	 * a <code>null</code> entry in the difference map.
-	 *  
-	 * @throws CoreException
-	 */
-	public void testMissingTemaplteValue() throws CoreException {
-		ILaunchConfigurationWorkingCopy t1 = newTemplate(null, "2-b-missing");
-		ILaunchConfiguration template = t1.doSave();
-		ILaunchConfigurationWorkingCopy wc = template.getType().newInstance(null, "will-b-diff", template);
-		wc.removeAttribute("String1"); 
-		Map dif = wc.findDifferences(template.getAttributes());
-		assertEquals("Should be missing String1 value", 1, dif.size());
-		assertTrue("Should be missing String1 value", dif.containsKey("String1"));
-		assertNull("Should be null value", dif.get("String1"));
-	}
-	
+
 }
 
 
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
index a99b478..1ddbe86 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/launchConfigurations/LaunchConfigurationManager.java
@@ -30,7 +30,6 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.TransformerException;
 
 import org.eclipse.core.expressions.EvaluationContext;
 import org.eclipse.core.expressions.IEvaluationContext;
@@ -572,13 +571,9 @@
 					history.setFavorites(favs);
 					// add any favorites that have been added to the workspace before this plug-in
 					// was loaded - @see bug 231600
-					try {
-						ILaunchConfiguration[] configurations = getLaunchManager().getLaunchConfigurations(ILaunchConfiguration.CONFIGURATION);
-						for (int j = 0; j < configurations.length; j++) {
-							history.checkFavorites(configurations[j]);
-						}
-					} catch (CoreException e) {
-						DebugUIPlugin.log(e.getStatus());
+					ILaunchConfiguration[] configurations = getLaunchManager().getLaunchConfigurations();
+					for (int j = 0; j < configurations.length; j++) {
+						history.checkFavorites(configurations[j]);
 					}
 				}
 			}
@@ -1055,8 +1050,8 @@
 	 * @return the singleton instance of the launch manager
 	 * @since 3.3
 	 */
-	private ILaunchManager getLaunchManager() {
-		return DebugPlugin.getDefault().getLaunchManager();
+	private LaunchManager getLaunchManager() {
+		return (LaunchManager) DebugPlugin.getDefault().getLaunchManager();
 	}
 	
 	/**
