diff --git a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
index 8d5ff74..c9312e0 100644
--- a/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
+++ b/ant/org.eclipse.ant.core/src/org/eclipse/ant/core/AntRunner.java
@@ -234,6 +234,7 @@
 	run.invoke(runner, new Object[] {argArray});
 	return null;
 }
+
 /**
  * Returns the build file target information.
  * 
@@ -278,48 +279,4 @@
 		String message = (e.getMessage() == null) ? Policy.bind("error.buildFailed") : e.getMessage(); //$NON-NLS-1$
 		throw new CoreException(new Status(IStatus.ERROR, PI_ANTCORE, ERROR_RUNNING_SCRIPT, message, e));
 	}
-}/**
- * Returns the build file target information.
- * 
- * @return an array containing the target information
- * 
- * @see TargetInfo
- */
-public TargetInfo[] getAvailableTargets() throws CoreException {
-	try {
-		ClassLoader loader = getClassLoader();
-		Class classInternalAntRunner = loader.loadClass("org.eclipse.ant.internal.core.ant.InternalAntRunner"); //$NON-NLS-1$
-		Object runner = classInternalAntRunner.newInstance();
-		// set build file
-		Method setBuildFileLocation = classInternalAntRunner.getMethod("setBuildFileLocation", new Class[] {String.class}); //$NON-NLS-1$
-		setBuildFileLocation.invoke(runner, new Object[] {buildFileLocation});
-		// get the info for each targets
-		Method getTargets = classInternalAntRunner.getMethod("getTargets", null); //$NON-NLS-1$
-		Object results = getTargets.invoke(runner, null);
-		// collect the info into target objects
-		String[][] infos = (String[][]) results;
-		if (infos.length < 2)
-			return new TargetInfo[0];
-		// The last info is the name of the default target or null if none
-		int count = infos.length - 1;
-		String defaultName = infos[count][0];
-		TargetInfo[] targets = new TargetInfo[count];
-		for (int i = 0; i < count; i++) {
-			String[] info = infos[i];
-			boolean isDefault = info[0].equals(defaultName);
-			targets[i] = new TargetInfo(info[0], info[1], isDefault);
-		}
-		return targets;
-	} catch (NoClassDefFoundError e) {
-		throw new CoreException(new Status(IStatus.ERROR, PI_ANTCORE, ERROR_RUNNING_SCRIPT, Policy.bind("error.incorrectClasspath"), e)); //$NON-NLS-1$
-	} catch (ClassNotFoundException e) {
-		throw new CoreException(new Status(IStatus.ERROR, PI_ANTCORE, ERROR_RUNNING_SCRIPT, Policy.bind("error.incorrectClasspath"), e)); //$NON-NLS-1$
-	} catch (InvocationTargetException e) {
-		Throwable realException = e.getTargetException();
-		String message = (realException.getMessage() == null) ? Policy.bind("error.buildFailed") : realException.getMessage(); //$NON-NLS-1$
-		throw new CoreException(new Status(IStatus.ERROR, PI_ANTCORE, ERROR_RUNNING_SCRIPT, message, realException));
-	} catch (Exception e) {
-		String message = (e.getMessage() == null) ? Policy.bind("error.buildFailed") : e.getMessage(); //$NON-NLS-1$
-		throw new CoreException(new Status(IStatus.ERROR, PI_ANTCORE, ERROR_RUNNING_SCRIPT, message, e));
-	}
 }}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java
index 02b5404..e6d21c7 100644
--- a/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java
+++ b/ant/org.eclipse.ant.core/src_ant/org/eclipse/ant/internal/core/ant/InternalAntRunner.java
@@ -801,34 +801,4 @@
 	}
 	infos[i][0] = defaultName;
 	return infos;
-}
-/**
- * Gets all the target information from the build script.
- * Returns a two dimension array. Each row represents a
- * target, where the first column is the name and the
- * second column is the description. The last row is
- * special and represents the name of the default target.
- * This default target name is in the first column, the
- * second column is null. Note, the default name can be
- * null.
- */
-public String[][] getTargets() {
-	// create a project and initialize it
-	Project antProject = new Project();
-	antProject.init();
-	antProject.setProperty("ant.file", getBuildFileLocation()); //$NON-NLS-1$
-	parseScript(antProject);
-	String defaultName = antProject.getDefaultTarget();
-	Collection targets = antProject.getTargets().values();
-	String[][] infos = new String[targets.size() + 1][2];
-	Iterator enum = targets.iterator();
-	int i = 0;
-	while (enum.hasNext()) {
-		Target target = (Target) enum.next();
-		infos[i][0] = target.getName();
-		infos[i][1] = target.getDescription();
-		i++;
-	}
-	infos[i][0] = defaultName;
-	return infos;
 }}
\ No newline at end of file
