*** empty log message ***
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ICoreConstants.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ICoreConstants.java
index 652b2d9..0fc22e0 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ICoreConstants.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ICoreConstants.java
@@ -26,7 +26,7 @@
 	String P_EXT_LOCATIONS = "ext_locations"; //$NON-NLS-1$
 	String PROGRAM_ARGS = "program_args"; //$NON-NLS-1$
 	String VM_ARGS = "vm_args"; //$NON-NLS-1$
-	String IMPLICIT_DEPENDENCIES = "implicit_dependencies";
+	String IMPLICIT_DEPENDENCIES = "implicit_dependencies"; //$NON-NLS-1$
 	
 	// Target JRE
 	String TARGET_JRE = "targetJRE"; //$NON-NLS-1$
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/RequiredDependencyManager.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/RequiredDependencyManager.java
new file mode 100644
index 0000000..cf7c2bd
--- /dev/null
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/RequiredDependencyManager.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2005 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.pde.internal.core;
+
+
+public class RequiredDependencyManager {
+	
+	/*public static IPluginModelBase[] addRequiredPlugins(
+			IPluginModelBase[] selected, IPluginModelBase[] allModels) {
+		if (selected.length == 0 || selected.length == allModels.length)
+			return new IPluginModelBase[0];
+
+		HashSet existing = new HashSet();
+		ArrayList result = new ArrayList();
+		for (int i = 0; i < selected.length; i++) {
+			String id = selected[i].getPluginBase().getId();
+			if (id != null)
+				existing.add(id);
+		}
+		
+		Iterator iter = existing.iterator();
+		while (iter.hasNext()) {
+			addDependencies(iter.next().toString(), existing, result);
+		}
+		
+		
+		return (IPluginModelBase[])result.values().toArray(new IPluginModelBase[result.size()]);
+	}
+	
+	/*private void handleAddRequired() {
+		ArrayList result = new ArrayList();
+		for (int i = 0; i < items.length; i++) {
+			IPluginModelBase model = (IPluginModelBase)items[i].getData();
+			if (fTablePart.getTableViewer().getChecked(model))
+				addPluginAndDependencies((IPluginModelBase) items[i].getData(), result);
+		}
+		fTablePart.setSelection(result.toArray());
+	}
+	
+	protected void addPluginAndDependencies(
+			IPluginModelBase model,
+			ArrayList selected) {
+				
+			if (!selected.contains(model)) {
+				selected.add(model);
+				if (!model.isEnabled())
+					fChangedModels.add(model);
+				addDependencies(getAllModels(), model, selected);
+			}
+		}
+		
+	protected void addDependencies(
+	    IPluginModelBase[] models,
+		IPluginModelBase model,
+		ArrayList selected) {
+		
+		IPluginImport[] required = model.getPluginBase().getImports();
+		if (required.length > 0) {
+			for (int i = 0; i < required.length; i++) {
+				IPluginModelBase found = findModel(models, required[i].getId());
+				if (found != null) {
+					addPluginAndDependencies(found, selected);
+				}
+			}
+		}
+		
+		if (model instanceof IPluginModel) {
+			IFragmentModel[] fragments = findFragments(models, ((IPluginModel)model).getPlugin());
+			for (int i = 0; i < fragments.length; i++) {
+				String id = fragments[i].getFragment().getId();
+				if (!"org.eclipse.ui.workbench.compatibility".equals(id)) //$NON-NLS-1$
+					addPluginAndDependencies(fragments[i], selected);
+			}
+		} else {
+			IFragment fragment = ((IFragmentModel) model).getFragment();
+			IPluginModelBase found = findModel(models, fragment.getPluginId());
+			if (found != null) {
+				addPluginAndDependencies(found, selected);
+			}
+		}
+	}
+
+	private IPluginModelBase findModel(IPluginModelBase[] models, String id) {
+		for (int i = 0; i < models.length; i++) {
+			String modelId = models[i].getPluginBase().getId();
+			if (modelId != null && modelId.equals(id))
+				return models[i];
+		}
+		return null;
+	}
+
+	private IFragmentModel[] findFragments(IPluginModelBase[] models, IPlugin plugin) {
+		ArrayList result = new ArrayList();
+		for (int i = 0; i < models.length; i++) {
+			if (models[i] instanceof IFragmentModel) {
+				IFragment fragment = ((IFragmentModel) models[i]).getFragment();
+				if (plugin.getId().equalsIgnoreCase(fragment.getPluginId())) {
+					result.add(models[i]);
+				}
+			}
+		}
+		return (IFragmentModel[]) result.toArray(new IFragmentModel[result.size()]);
+	}
+	*/
+
+
+}
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetProfileManager.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetProfileManager.java
index c075bee..1ef0edf 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetProfileManager.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/TargetProfileManager.java
@@ -59,8 +59,8 @@
 			
 			private String getString(IConfigurationElement elem){
 				String name = elem.getAttribute("name"); //$NON-NLS-1$
-				String id = elem.getAttribute("id");
-				name = name + " [" + id + "]";
+				String id = elem.getAttribute("id"); //$NON-NLS-1$
+				name = name + " [" + id + "]"; //$NON-NLS-1$ //$NON-NLS-2$
 				return name;
 			}
 			
@@ -89,7 +89,7 @@
 			if (value == null || value.equals("")) //$NON-NLS-1$
 				return false;
 		}
-		value = elem.getAttribute("path");
+		value = elem.getAttribute("path"); //$NON-NLS-1$
 		String symbolicName = elem.getDeclaringExtension().getNamespace();
 		URL url = getResourceURL(symbolicName, value);
 		try {
@@ -118,7 +118,7 @@
 		for (int i = 0; i < elems.length; i++) {
 			IConfigurationElement elem = elems[i];
 			if (isValid(elem)) {
-				String id = elem.getAttribute("id");
+				String id = elem.getAttribute("id"); //$NON-NLS-1$
 				fTargets.put(id, elem);
 			}
 		}
@@ -126,7 +126,7 @@
 	
 	private void remove(IConfigurationElement[] elems) {
 		for (int i = 0 ; i < elems.length; i++) {
-			fTargets.remove(elems[i].getAttribute("id"));
+			fTargets.remove(elems[i].getAttribute("id")); //$NON-NLS-1$
 		}
 	}
 	
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/IImplicitPluginsInfo.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/IImplicitPluginsInfo.java
new file mode 100644
index 0000000..713a742
--- /dev/null
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/IImplicitPluginsInfo.java
@@ -0,0 +1,19 @@
+package org.eclipse.pde.internal.core.itarget;
+
+public interface IImplicitPluginsInfo extends ITargetObject {
+	
+	public static final String P_IMPLICIT_PLUGINS = "implicit-plugins"; //$NON-NLS-1$
+	
+	ITargetPlugin[] getPlugins();
+	
+	public void addPlugin(ITargetPlugin plugin);
+	
+	public void addPlugins(ITargetPlugin[] plugins);
+	
+	public void removePlugin(ITargetPlugin plugin);
+	
+	public void removePlugins(ITargetPlugin[] plugins);
+	
+	public boolean containsPlugin(String id);
+
+}
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITarget.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITarget.java
index 7bfdc34..eb391ab 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITarget.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITarget.java
@@ -40,8 +40,12 @@
 	
 	ILocationInfo getLocationInfo();
 	
-	void setLocationInfo(ILocationInfo info);
+	void setImplicitPluginsInfo(IImplicitPluginsInfo info);
 	
+	IImplicitPluginsInfo getImplicitPluginsInfo();
+	
+	void setLocationInfo(ILocationInfo info);
+		
 	void addPlugin(ITargetPlugin plugin);
 	
 	void addPlugins(ITargetPlugin[] plugins);
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITargetModelFactory.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITargetModelFactory.java
index dc57075..f3ca575 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITargetModelFactory.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/itarget/ITargetModelFactory.java
@@ -22,6 +22,8 @@
 	
 	ILocationInfo createLocation();
 	
+	IImplicitPluginsInfo createImplicitPluginInfo();
+	
 	ITargetPlugin createPlugin();
 	
 	ITargetFeature createFeature();
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ImplicitPluginsInfo.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ImplicitPluginsInfo.java
new file mode 100644
index 0000000..eef48a0
--- /dev/null
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/ImplicitPluginsInfo.java
@@ -0,0 +1,95 @@
+package org.eclipse.pde.internal.core.target;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.pde.internal.core.itarget.IImplicitPluginsInfo;
+import org.eclipse.pde.internal.core.itarget.ITargetModel;
+import org.eclipse.pde.internal.core.itarget.ITargetPlugin;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class ImplicitPluginsInfo extends TargetObject implements
+		IImplicitPluginsInfo {
+	
+	private static final long serialVersionUID = 1L;
+	
+	Map fPlugins = new HashMap();
+
+	public ImplicitPluginsInfo(ITargetModel model) {
+		super(model);
+	}
+
+	public ITargetPlugin[] getPlugins() {
+		return (ITargetPlugin[]) fPlugins.values().toArray(new ITargetPlugin[fPlugins.size()]);
+	}
+
+	public void addPlugin(ITargetPlugin plugin) {
+		addPlugins(new ITargetPlugin[] {plugin});
+	}
+
+	public void addPlugins(ITargetPlugin[] plugins) {
+		ArrayList addedPlugins = new ArrayList();
+		for (int i = 0; i < plugins.length; i ++ ) {
+			String id = plugins[i].getId();
+			if (fPlugins.containsKey(id))
+				continue;
+			plugins[i].setModel(getModel());
+			fPlugins.put(id, plugins[i]);
+			addedPlugins.add(plugins[i]);
+		}
+		if (isEditable() && (addedPlugins.size() > 0)) {
+			firePropertyChanged(P_IMPLICIT_PLUGINS, new ITargetPlugin[0], 
+					(ITargetPlugin[])addedPlugins.toArray(new ITargetPlugin[addedPlugins.size()]));
+		}
+
+	}
+
+	public void removePlugin(ITargetPlugin plugin) {
+		removePlugins(new ITargetPlugin[] {plugin});
+	}
+
+	public void removePlugins(ITargetPlugin[] plugins) {
+		ArrayList removedPlugins = new ArrayList();
+		for (int i =0; i < plugins.length; i++) 
+			if (fPlugins.remove(plugins[i].getId()) != null)
+				removedPlugins.add(plugins[i]);
+		if (isEditable() && (removedPlugins.size() > 0))
+			firePropertyChanged(P_IMPLICIT_PLUGINS, (ITargetPlugin[])removedPlugins.toArray(new ITargetPlugin[removedPlugins.size()]), 
+					new ITargetPlugin[0]);
+	}
+
+	public void parse(Node node) {
+		NodeList children = node.getChildNodes();
+		for (int i = 0; i < children.getLength(); i++) {
+			Node child = children.item(i);
+			if (child.getNodeName().equals("plugin")) { //$NON-NLS-1$
+				ITargetPlugin plugin = getModel().getFactory().createPlugin();
+				plugin.parse(child);
+				fPlugins.put(plugin.getId(), plugin);
+			}
+		}
+
+	}
+
+	public void write(String indent, PrintWriter writer) {
+		if (fPlugins.size() == 0)
+			return;
+		writer.println();
+		writer.println(indent + "<implicitPlugins>"); //$NON-NLS-1$
+		Iterator it = fPlugins.values().iterator();
+		while (it.hasNext()) {
+			TargetPlugin plugin = (TargetPlugin) it.next();
+			plugin.write(indent + "   ", writer); //$NON-NLS-1$
+		}
+		writer.println(indent + "</implicitPlugins>"); //$NON-NLS-1$
+	}
+
+	public boolean containsPlugin(String id) {
+		return fPlugins.containsKey(id);
+	}
+
+}
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/Target.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/Target.java
index bac11b0..4ad00e6 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/Target.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/Target.java
@@ -17,6 +17,7 @@
 import org.eclipse.pde.core.IModelChangedEvent;
 import org.eclipse.pde.internal.core.itarget.IArgumentsInfo;
 import org.eclipse.pde.internal.core.itarget.IEnvironmentInfo;
+import org.eclipse.pde.internal.core.itarget.IImplicitPluginsInfo;
 import org.eclipse.pde.internal.core.itarget.ILocationInfo;
 import org.eclipse.pde.internal.core.itarget.IRuntimeInfo;
 import org.eclipse.pde.internal.core.itarget.ITarget;
@@ -39,6 +40,7 @@
 	private IEnvironmentInfo fEnvInfo;
 	private IRuntimeInfo fRuntimeInfo;
 	private ILocationInfo fLocationInfo;
+	private IImplicitPluginsInfo fImplicitInfo;
 	private boolean fUseAllTargetPlatform = false;
 	
 	public Target(ITargetModel model) {
@@ -50,6 +52,7 @@
 		fEnvInfo = null;
 		fRuntimeInfo = null;
 		fLocationInfo = null;
+		fImplicitInfo = null;
 		fPlugins.clear();
 		fFeatures.clear();
 		fUseAllTargetPlatform = false;
@@ -81,6 +84,9 @@
 					} else if (name.equals("location")) { //$NON-NLS-1$
 						fLocationInfo = factory.createLocation();
 						fLocationInfo.parse(child);
+					} else if (name.equals("implicitPlugins")) { //$NON-NLS-1$
+						fImplicitInfo = factory.createImplicitPluginInfo();
+						fImplicitInfo.parse(child);
 					}
 				}
 			}
@@ -169,7 +175,9 @@
 		}
 		writer.println(indent + "      </features>"); //$NON-NLS-1$
 		writer.println(indent + "   </content>"); //$NON-NLS-1$
-		
+		if (fImplicitInfo != null) {
+			fImplicitInfo.write(indent + "   ", writer); //$NON-NLS-1$
+		}
 		writer.println();
 		writer.println(indent + "</target>"); //$NON-NLS-1$
 	}
@@ -315,4 +323,12 @@
 		if (isEditable())
 			firePropertyChanged(P_ALL_PLUGINS, new Boolean(oldValue), new Boolean(fUseAllTargetPlatform));
 	}
+
+	public void setImplicitPluginsInfo(IImplicitPluginsInfo info) {
+		fImplicitInfo = info;
+	}
+
+	public IImplicitPluginsInfo getImplicitPluginsInfo() {
+		return fImplicitInfo;
+	}
 }
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetModelFactory.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetModelFactory.java
index d6d1359..01a09cb 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetModelFactory.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/target/TargetModelFactory.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.pde.internal.core.itarget.IArgumentsInfo;
 import org.eclipse.pde.internal.core.itarget.IEnvironmentInfo;
+import org.eclipse.pde.internal.core.itarget.IImplicitPluginsInfo;
 import org.eclipse.pde.internal.core.itarget.ILocationInfo;
 import org.eclipse.pde.internal.core.itarget.IRuntimeInfo;
 import org.eclipse.pde.internal.core.itarget.ITarget;
@@ -47,6 +48,10 @@
 	public ILocationInfo createLocation() {
 		return new LocationInfo(fModel);
 	}
+	
+	public IImplicitPluginsInfo createImplicitPluginInfo() {
+		return new ImplicitPluginsInfo(fModel);
+	}
 
 	public ITargetPlugin createPlugin() {
 		return new TargetPlugin(fModel);
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java
index fe953b6..7246f80 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDEUIMessages.java
@@ -2485,4 +2485,30 @@
 
 	public static String TargetPlatformPreferencePage_FileSelectionMessage;
 
+	public static String ImplicitDependenicesSection_Add;
+
+	public static String ImplicitDependenicesSection_Remove;
+
+	public static String ImplicitDependenicesSection_RemoveAll;
+
+	public static String ImplicitDependenicesSection_Title;
+
+	public static String ImplicitDependenicesSection_Description;
+
+	public static String TargetImplicitPluginsTab_removeAllDescription;
+
+	public static String TargetImplicitPluginsTab_removeAll3;
+
+	public static String TargetImplicitPluginsTab_removeAll4;
+
+	public static String TargetPluginsTab_readingPlatform;
+
+	public static String TargetPluginsTab_readingFeatures;
+
+	public static String TargetPlatformPreferencePage_implicitTab;
+
+	public static String TargetPlatformPreferencePage_profileNotFoundTitle;
+
+	public static String TargetPlatformPreferencePage_profileNotFoundDesc;
+
 }
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/ArgumentsSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/ArgumentsSection.java
index da30268..8954ba1 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/ArgumentsSection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/ArgumentsSection.java
@@ -52,7 +52,7 @@
 		section.setText(PDEUIMessages.ArgumentsSection_editorTitle);
 		section.setDescription(PDEUIMessages.ArgumentsSection_description);
 		GridData data = new GridData(GridData.FILL_BOTH);
-		data.horizontalSpan = 2;
+		data.horizontalSpan = 1;
 		section.setLayoutData(data);
 		
 		Composite client = toolkit.createComposite(section);
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentPage.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentPage.java
index 928af13..0376bf5 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentPage.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentPage.java
@@ -34,11 +34,13 @@
 		layout.marginRight = 10;
 		layout.verticalSpacing = 15;
 		layout.horizontalSpacing = 10;
+		layout.numColumns = 2;
 		body.setLayout(layout);
 		
 		managedForm.addPart(new EnvironmentSection(this, body));
 		managedForm.addPart(new JRESection(this, body));
 		managedForm.addPart(new ArgumentsSection(this, body));
+		managedForm.addPart(new ImplicitDependenicesSection(this, body));
 	}
 	
 }
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentSection.java
index 570629a..bd98968 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentSection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/EnvironmentSection.java
@@ -48,6 +48,7 @@
 		section.setDescription(PDEUIMessages.EnvironmentSection_description);
 		GridData data = new GridData(GridData.FILL_HORIZONTAL);
 		data.verticalAlignment = SWT.TOP;
+		data.horizontalSpan = 2;
 		section.setLayoutData(data);
 		
 		Composite client = toolkit.createComposite(section);
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/ImplicitDependenicesSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/ImplicitDependenicesSection.java
new file mode 100644
index 0000000..c3730c3
--- /dev/null
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/ImplicitDependenicesSection.java
@@ -0,0 +1,255 @@
+package org.eclipse.pde.internal.ui.editor.target;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.pde.core.IModelChangedEvent;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.internal.core.PDECore;
+import org.eclipse.pde.internal.core.itarget.IImplicitPluginsInfo;
+import org.eclipse.pde.internal.core.itarget.ITarget;
+import org.eclipse.pde.internal.core.itarget.ITargetModel;
+import org.eclipse.pde.internal.core.itarget.ITargetPlugin;
+import org.eclipse.pde.internal.ui.PDEPlugin;
+import org.eclipse.pde.internal.ui.PDEUIMessages;
+import org.eclipse.pde.internal.ui.editor.PDEFormPage;
+import org.eclipse.pde.internal.ui.editor.TableSection;
+import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor;
+import org.eclipse.pde.internal.ui.elements.DefaultTableProvider;
+import org.eclipse.pde.internal.ui.parts.TablePart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Section;
+
+public class ImplicitDependenicesSection extends TableSection {
+	
+	private TableViewer fViewer;
+	private static final int ADD_INDEX = 0;
+	private static final int REMOVE_INDEX = 1;
+	private static final int REMOVE_ALL_INDEX = 2;
+
+	public ImplicitDependenicesSection(PDEFormPage page, Composite parent) {
+		super(page, parent, Section.DESCRIPTION, new String[] {PDEUIMessages.ImplicitDependenicesSection_Add , PDEUIMessages.ImplicitDependenicesSection_Remove, PDEUIMessages.ImplicitDependenicesSection_RemoveAll});
+	}
+
+	protected void createClient(Section section, FormToolkit toolkit) {
+		section.setText(PDEUIMessages.ImplicitDependenicesSection_Title);
+		section.setDescription(PDEUIMessages.ImplicitDependenicesSection_Description);
+		Composite container = toolkit.createComposite(section);
+		GridLayout layout = new GridLayout(2, false);
+		container.setLayout(layout);
+		container.setLayoutData(new GridData(GridData.FILL_BOTH));
+		createViewerPartControl(container, SWT.MULTI, 2, toolkit);
+		fViewer = getTablePart().getTableViewer();
+		fViewer.setContentProvider(new DefaultTableProvider() {
+			public Object[] getElements(Object inputElement) {
+				return getImplicitPluginsInfo().getPlugins();
+			}
+		});
+		fViewer.setLabelProvider(PDEPlugin.getDefault().getLabelProvider());
+		fViewer.setSorter(new ViewerSorter() {
+			public int compare(Viewer viewer, Object e1, Object e2) {
+				ITargetPlugin p1 = (ITargetPlugin) e1;
+				ITargetPlugin p2 = (ITargetPlugin) e2;
+				return super.compare(viewer, p1.getId(), p2.getId());
+			}
+		});
+		fViewer.setInput(getTarget());
+		fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateButtons();
+			}
+		});
+		
+		toolkit.paintBordersFor(container);
+		section.setClient(container);
+        GridData gd = new GridData(GridData.FILL_BOTH);
+		section.setLayoutData(gd);
+		updateButtons();
+		getModel().addModelChangedListener(this);
+	}
+
+    public boolean doGlobalAction(String actionId) {
+        if (actionId.equals(ActionFactory.DELETE.getId())) {
+            handleRemove();
+            return true;
+        }
+        if (actionId.equals(ActionFactory.CUT.getId())) {
+            // delete here and let the editor transfer
+            // the selection to the clipboard
+            handleRemove();
+            return false;
+        }
+        if (actionId.equals(ActionFactory.PASTE.getId())) {
+            doPaste();
+            return true;
+        }
+        return false;
+    }
+	
+	private void updateButtons() {
+		TablePart part = getTablePart();
+		boolean empty = fViewer.getSelection().isEmpty();
+		part.setButtonEnabled(1, !empty);
+		boolean hasElements = fViewer.getTable().getItemCount() > 0;
+		part.setButtonEnabled(2, hasElements);
+	}
+	
+    protected void buttonSelected(int index) {
+        switch (index) {
+        case ADD_INDEX:
+            handleAdd();
+            break;
+        case REMOVE_INDEX:
+            handleRemove();
+            break;
+        case REMOVE_ALL_INDEX:
+            handleRemoveAll();
+        }
+	}
+    
+    protected void handleAdd() {
+    	ElementListSelectionDialog dialog = new ElementListSelectionDialog(
+				PDEPlugin.getActiveWorkbenchShell(), 
+				PDEPlugin.getDefault().getLabelProvider());
+		
+		dialog.setElements(getValidBundles());
+		dialog.setTitle(PDEUIMessages.PluginSelectionDialog_title); 
+		dialog.setMessage(PDEUIMessages.PluginSelectionDialog_message);
+		dialog.setMultipleSelection(true);
+		if (dialog.open() == Window.OK) {
+			Object[] models = dialog.getResult();
+			ArrayList pluginsToAdd = new ArrayList();
+			ITargetModel model = getModel();
+			for (int i = 0; i < models.length; i++) {
+				BundleDescription desc = (BundleDescription) models[i];
+				ITargetPlugin plugin = model.getFactory().createPlugin();
+				plugin.setId(desc.getSymbolicName());
+				plugin.setModel(model);
+				pluginsToAdd.add(plugin);
+			}
+			getImplicitPluginsInfo().addPlugins((ITargetPlugin[])pluginsToAdd.toArray(new ITargetPlugin[pluginsToAdd.size()]));
+			updateButtons();
+		}
+    }
+    
+	protected Object[] getValidBundles() {
+		ITargetPlugin[] plugins = getImplicitPluginsInfo().getPlugins();
+		Set currentPlugins = new HashSet((4/3) * plugins.length + 1);
+		for (int i = 0; i < plugins.length; i++) {
+			currentPlugins.add(plugins[i].getId());
+		}
+		
+		IPluginModelBase[] models = PDECore.getDefault().getModelManager().getAllPlugins();
+		Set result = new HashSet((4/3) * models.length + 1);
+		for (int i = 0; i < models.length; i++) {
+			BundleDescription desc = models[i].getBundleDescription();
+			if (desc != null) {
+				if (!currentPlugins.contains(desc.getSymbolicName()))
+					result.add(desc);
+			}
+		}
+		return result.toArray();
+	}
+	
+	protected void handleRemove() {
+		Object[] src = ((IStructuredSelection)fViewer.getSelection()).toArray();
+		ITargetPlugin[] plugins = new ITargetPlugin[src.length];
+		System.arraycopy(src, 0, plugins, 0, src.length);
+		getImplicitPluginsInfo().removePlugins(plugins);
+	}
+	
+	protected void handleRemoveAll() {
+		IImplicitPluginsInfo info =getImplicitPluginsInfo();
+		info.removePlugins(info.getPlugins());
+	}
+	
+	private IImplicitPluginsInfo getImplicitPluginsInfo() {
+		IImplicitPluginsInfo info = getTarget().getImplicitPluginsInfo();
+		if (info == null) {
+			info = getModel().getFactory().createImplicitPluginInfo();
+			getTarget().setImplicitPluginsInfo(info);
+		}
+		return info;
+	}
+	
+	private ITarget getTarget() {
+		return getModel().getTarget();
+	}
+	
+	private ITargetModel getModel() {
+		return (ITargetModel)getPage().getPDEEditor().getAggregateModel();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.pde.internal.ui.editor.PDESection#modelChanged(org.eclipse.pde.core.IModelChangedEvent)
+	 */
+	public void modelChanged(IModelChangedEvent e) {
+		if (e.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
+			markStale();
+			return;
+		}
+		if (e.getChangeType() == IModelChangedEvent.CHANGE && 
+				e.getChangedProperty().equals(IImplicitPluginsInfo.P_IMPLICIT_PLUGINS)) {
+			ITargetPlugin[] plugins = (ITargetPlugin[])e.getOldValue();
+			for (int i = 0; i < plugins.length; i++)
+				fViewer.remove(plugins[i]);
+			plugins = (ITargetPlugin[])e.getNewValue();
+			for (int i = 0; i < plugins.length; i++) 
+				fViewer.add(plugins[i]);
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.pde.internal.ui.editor.TableSection#handleDoubleClick(org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	protected void handleDoubleClick(IStructuredSelection selection) {
+		handleOpen(selection);
+	}
+	
+	private void handleOpen(IStructuredSelection selection) {
+		Object object = selection.getFirstElement();
+		ManifestEditor.openPluginEditor(((ITargetPlugin)object).getId());
+	}
+	
+	protected boolean canPaste(Object target, Object[] objects) {
+		for (int i = 0; i < objects.length; i++) {
+			if (!(objects[i] instanceof ITargetPlugin))
+				return false;
+		}
+		return true;
+	}
+	
+	protected void doPaste(Object target, Object[] objects) {
+		for (int i = 0; i < objects.length; i++) {
+			if ( objects[i] instanceof ITargetPlugin )
+				getImplicitPluginsInfo().addPlugin((ITargetPlugin)objects[i]);	
+		}
+	}
+	
+	protected void selectionChanged(IStructuredSelection selection) {
+		getPage().getPDEEditor().setSelection(selection);
+	}
+	
+//	public void commit(boolean onSave) {
+//		
+//	}
+	
+	public void dispose() {
+		getModel().removeModelChangedListener(this);
+	}
+}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/JRESection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/JRESection.java
index f66d6c1..474cadf 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/JRESection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/target/JRESection.java
@@ -48,6 +48,7 @@
 		section.setLayout(new GridLayout());
 		GridData data = new GridData(GridData.FILL_HORIZONTAL);
 		data.verticalAlignment = SWT.TOP;
+		data.horizontalSpan = 2;
 		section.setLayoutData(data);
 
 		Composite client = toolkit.createComposite(section);
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties
index 190e11c..f734dc51 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/pderesources.properties
@@ -1343,6 +1343,7 @@
 ImportWizard_DetailedPage_title = Selection
 ImportWizard_DetailedPage_desc = Select plug-ins and fragments to import.
 ImportWizard_DetailedPage_availableList = &Plug-ins and Fragments Found:
+ImplicitDependenicesSection_Description=Select plug-ins to be added to the explicit plug-in tab, to be included during dependency checking
 ImportWizard_DetailedPage_importList = P&lug-ins and Fragments to Import:
 ImportWizard_DetailedPage_add = &Add -->
 ImportWizard_DetailedPage_addAll = A&dd All -->
@@ -1350,8 +1351,10 @@
 ImportWizard_DetailedPage_removeAll = <-- Re&move All
 ImportWizard_DetailedPage_swap = <-- &Swap -->
 ImportWizard_DetailedPage_existing = Exis&ting Plug-ins -->
+ImplicitDependenicesSection_Remove=Remove...
 ImportWizard_DetailedPage_existingUnshared = Existing &Unshared -->
 ImportWizard_DetailedPage_addRequired = Re&quired Plug-ins -->
+ImplicitDependenicesSection_RemoveAll=Remove All
 ImportWizard_DetailedPage_count = {0} out of {1} selected
 ImportWizard_DetailedPage_locate = Locate Plug-ins and Fragments
 ImportWizard_DetailedPage_search = &ID (* = any string, ? = any character):
@@ -2017,12 +2020,16 @@
 TargetPlatformPreferencePage_pluginsTab=&Plug-ins
 TargetPlatformPreferencePage_sourceCode=S&ource Code Locations
 TargetProfileWizardPage_description=Create a new target profile definition.  The file name must end with '.target'.
+TargetImplicitPluginsTab_removeAll3=R&emoveAll
+TargetImplicitPluginsTab_removeAll4=,
 TargetProfileWizardPage_title=Target Profile
 TargetProfileWizardPage_error=The file name must end with '.target'
 TargetDefinitionSection_title=Target Profile Definition
 TargetDefinitionSection_targetLocation=Target location:
 TargetDefinitionSection_sameAsHost=The target platform is the same as the host (running) platform
 TargetDefinitionSection_location=Location:
+TargetPluginsTab_readingPlatform=Reading Target Platform...
+TargetPluginsTab_readingFeatures=Reading Features...
 TargetDefinitionSection_fileSystem=File System...
 TargetDefinitionSection_variables=Variables...
 TargetDefinitionSection_name=Profile name:
@@ -2031,12 +2038,16 @@
 TargetOutlinePage_features=Features
 TargetPlatformPreferencePage_environmentTab=En&vironment
 TargetPlatformPreferencePage_TargetGroupTitle=Target Profiles
+TargetImplicitPluginsTab_removeAllDescription=The plug-ins selected will be included as required bundles during dependency checking:
 TargetPlatformPreferencePage_CurrentProfileLabel=<a>Profile</a>:
+TargetPlatformPreferencePage_profileNotFoundDesc=Target profile could not be found
 TargetPlatformPreferencePage_FileSelectionTitle=File Selection
 TargetPlatformPreferencePage_FileSelectionMessage=Select a target definition:
+TargetPlatformPreferencePage_profileNotFoundTitle=Cannot open target profile
 TargetPlatformPreferencePage_agrumentsTab=La&unching Arguments
 TargetPlatformPreferencePage_BrowseButton=Bro&wse...
 TargetPlatformPreferencePage_ApplyButton=Load &Profile
+TargetPlatformPreferencePage_implicitTab=Impli&cit Plug-ins
 EnvironmentBlock_jreGroup=&Target JRE:
 EnvironmentBlock_jreTitle=Java Runtime Environment
 EnvironmentSection_locale=Locale:
@@ -2203,9 +2214,11 @@
 
 ImportPackageSection_desc = Specify packages on which this plug-in depends without explicitly identifying their originating plug-in:
 ImportPackageSection_descFragment = Specify packages on which this fragment depends without explicitly identifying their originating plug-in:
+ImplicitDependenicesSection_Title=Implicit Plug-in Dependencies
 ImportPackageSection_add=Add...
 ImportPackageSection_remove=Remove
 ImportPackageSection_properties=Properties...
+ImplicitDependenicesSection_Add=Add...
 ImportPackageSection_required=Imported Packages
 ImportPackageSection_exported=Packages exported by other plug-ins:
 ImportPackageSection_selection=Package Selection
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/JavaArgumentsTab.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/JavaArgumentsTab.java
index 8c7f168..3b59fdb 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/JavaArgumentsTab.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/JavaArgumentsTab.java
@@ -111,13 +111,13 @@
 	protected void loadTargetProfile(ITarget target) {
 		IArgumentsInfo info = target.getArguments();
 		if (info == null) {
-			fProgramArgs.setText("");
-			fVMArgs.setText("");
+			fProgramArgs.setText(""); //$NON-NLS-1$
+			fVMArgs.setText(""); //$NON-NLS-1$
 			return;
 		}
-		String progArgs = (info.getProgramArguments() == null) ? "" : info.getProgramArguments();
+		String progArgs = (info.getProgramArguments() == null) ? "" : info.getProgramArguments(); //$NON-NLS-1$
 		fProgramArgs.setText(progArgs);
-		String vmArgs = (info.getVMArguments() == null) ? "" : info.getVMArguments();
+		String vmArgs = (info.getVMArguments() == null) ? "" : info.getVMArguments(); //$NON-NLS-1$
 		fVMArgs.setText(vmArgs);
 	}
 }
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetEnvironmentTab.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetEnvironmentTab.java
index 4975fa4..86f1570 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetEnvironmentTab.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetEnvironmentTab.java
@@ -225,25 +225,25 @@
 		String nl = info.getNL();
 		nl = expandLocaleName(nl);
 		
-		if (!os.equals("")) {
+		if (!os.equals("")) { //$NON-NLS-1$
 			if (fOSCombo.indexOf(os) == -1)
 				fOSCombo.add(os);
 			fOSCombo.setText(os);
 		}
 		
-		if (!ws.equals("")) {
+		if (!ws.equals("")) { //$NON-NLS-1$
 			if (fWSCombo.indexOf(ws) == -1)
 				fWSCombo.add(ws);
 			fWSCombo.setText(ws);
 		}
 		
-		if (!arch.equals("")) {
+		if (!arch.equals("")) { //$NON-NLS-1$
 			if (fArchCombo.indexOf(arch) == -1)
 				fArchCombo.add(arch);
 			fArchCombo.setText(arch);
 		}
 		
-		if (!nl.equals("")) {
+		if (!nl.equals("")) { //$NON-NLS-1$
 			if (fNLCombo.indexOf(nl) == -1)
 				fNLCombo.add(nl);
 			fNLCombo.setText(nl);
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetImplicitPluginsTab.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetImplicitPluginsTab.java
index 0330954..7dc62ca 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetImplicitPluginsTab.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetImplicitPluginsTab.java
@@ -49,7 +49,7 @@
 	private TargetPlatformPreferencePage fPage;
 	
 	public TargetImplicitPluginsTab(TargetPlatformPreferencePage page) {
-		ROOT = "Wassim";
+		ROOT = ""; //$NON-NLS-1$
 		fPage = page;
 	}
 	
@@ -83,7 +83,7 @@
 	
 	private void createLabel(Composite container) {
 		Label label = new Label(container, SWT.NONE);
-		label.setText("The plug-ins selected will be included as required bundles during dependency checking:");
+		label.setText(PDEUIMessages.TargetImplicitPluginsTab_removeAllDescription);
 		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
 		gd.horizontalSpan = 2;
 		label.setLayoutData(gd);
@@ -117,7 +117,7 @@
 	protected void loadTable() {
 		Preferences preferences = PDECore.getDefault().getPluginPreferences();
 		String value = preferences.getString(ICoreConstants.IMPLICIT_DEPENDENCIES);
-		StringTokenizer tokens = new StringTokenizer(value,",");
+		StringTokenizer tokens = new StringTokenizer(value,","); //$NON-NLS-1$
 		fElements = new HashSet((4/3) * tokens.countTokens() + 1);
 		PluginModelManager manager = PDECore.getDefault().getModelManager();
 		while (tokens.hasMoreElements()) {
@@ -157,7 +157,7 @@
 		});
 		
 		fRemoveAllButton = new Button(buttonContainer, SWT.PUSH);
-		fRemoveAllButton.setText("RemoveAll");
+		fRemoveAllButton.setText(PDEUIMessages.TargetImplicitPluginsTab_removeAll3);
 		fRemoveAllButton.setLayoutData(new GridData(GridData.FILL | GridData.VERTICAL_ALIGN_BEGINNING));
 		SWTUtil.setButtonDimensionHint(fRemoveAllButton);
 		fRemoveAllButton.addSelectionListener(new SelectionAdapter() {
@@ -249,7 +249,7 @@
 		Iterator it = fElements.iterator();
 		while (it.hasNext()) {
 			if (buffer.length() > 0)
-				buffer.append(",");
+				buffer.append(PDEUIMessages.TargetImplicitPluginsTab_removeAll4);
 			IPluginModelBase base = (IPluginModelBase) it.next();
 			buffer.append(getSymbolicName(base));
 		}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java
index 8206251..741b10e 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPlatformPreferencePage.java
@@ -287,7 +287,7 @@
 		Control block = fExplicitPluginsTab.createContents(folder);
 		
 		TabItem tab = new TabItem(folder, SWT.NONE);
-		tab.setText("E&xplicit Plug-ins");
+		tab.setText(PDEUIMessages.TargetPlatformPreferencePage_implicitTab);
 		tab.setControl(block);
 	}
 	
@@ -346,7 +346,7 @@
 						}
 						IFile[] files;
 						try {
-							URI uri = new URI("file", url.getPath(), null);
+							URI uri = new URI("file", url.getPath(), null); //$NON-NLS-1$
 							files = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocationURI(uri);
 						} catch (URISyntaxException e) {
 							error = true;
@@ -369,7 +369,7 @@
 					}
 				} finally {
 					if (error) {
-						MessageDialog.openError(getShell(), "Cannot open target profile", "Target profile could not be found");
+						MessageDialog.openError(getShell(), PDEUIMessages.TargetPlatformPreferencePage_profileNotFoundTitle, PDEUIMessages.TargetPlatformPreferencePage_profileNotFoundDesc);
 					}
 				}
 			}
@@ -467,7 +467,7 @@
 		if (offSet > fProfileCombo.getSelectionIndex())
 			return null;
 		IConfigurationElement elem = fElements[fProfileCombo.getSelectionIndex() - offSet];
-		String path = elem.getAttribute("path"); 
+		String path = elem.getAttribute("path");  //$NON-NLS-1$
 		String symbolicName = elem.getDeclaringExtension().getNamespace();
 		return TargetProfileManager.getResourceURL(symbolicName, path);
 	}
@@ -563,11 +563,11 @@
 			String value = fProfileCombo.getText().trim();
 			int index = value.lastIndexOf('[');
 			value = value.substring(index + 1, value.length() - 1);
-			fPreferences.setValue(ICoreConstants.TARGET_PROFILE, "${workspace_loc:" + value + "}");
+			fPreferences.setValue(ICoreConstants.TARGET_PROFILE, "${workspace_loc:" + value + "}"); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			int offSet = fProfileCombo.getItemCount() - fElements.length;
 			IConfigurationElement elem = fElements[fProfileCombo.getSelectionIndex() - offSet];
-			fPreferences.setValue(ICoreConstants.TARGET_PROFILE, "id:" + elem.getAttribute("id"));
+			fPreferences.setValue(ICoreConstants.TARGET_PROFILE, "id:" + elem.getAttribute("id")); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 	}
 	
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java
index 249aad7..f19d68b 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/preferences/TargetPluginsTab.java
@@ -26,6 +26,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.CheckboxTableViewer;
@@ -99,30 +100,35 @@
 		public void run(IProgressMonitor monitor)
 			throws InvocationTargetException, InterruptedException {	
 			URL[] pluginPaths = PluginPathFinder.getPluginPaths(location);
-			fCurrentState = new PDEState(pluginPaths, true, monitor);
+			monitor.beginTask(PDEUIMessages.TargetPluginsTab_readingPlatform, 10);
+			SubProgressMonitor parsePluginMonitor = new SubProgressMonitor(monitor, 9);
+			fCurrentState = new PDEState(pluginPaths, true, parsePluginMonitor);
 			fModels = fCurrentState.getModels();
-			//TODO creating the state is getting the full progress monitor,
-			// while reloading features get no monitor.
-			// so you are ending up with a progress monitor going to completion
-			// then having to inexplicably wait for the progress dialog to go away
-			// while features are being parsed.
-			// I suggest splitting the monitor into two SubProgressMonitors (90%-10% split),
-			// with the 90% portion going to parsing the plug-ins
-			loadFeatures();
+			loadFeatures(new SubProgressMonitor(monitor, 1));
+			monitor.done();
 		}
 		
-		private void loadFeatures() {
+		private void loadFeatures(IProgressMonitor monitor) {
 			ExternalFeatureModelManager manager = new ExternalFeatureModelManager();
-			manager.loadModels(fPage.getPlatformPath());
+			manager.loadModels(location);
 			IFeatureModel[] externalModels = manager.getModels();
 			IFeatureModel[] workspaceModels = PDECore.getDefault().getFeatureModelManager().getWorkspaceModels();
-			fCurrentFeatures = new HashMap((4/3) * (externalModels.length + workspaceModels.length) + 1);
+			int numFeatures = externalModels.length + workspaceModels.length;
+			monitor.beginTask(PDEUIMessages.TargetPluginsTab_readingFeatures, numFeatures);
+			fCurrentFeatures = new HashMap((4/3) * (numFeatures) + 1);
 			for (int i = 0; i < externalModels.length; i++) {
-				fCurrentFeatures.put(externalModels[i].getFeature().getId(), externalModels[i]);
+				String id = externalModels[i].getFeature().getId();
+				monitor.subTask(id);
+				fCurrentFeatures.put(id, externalModels[i]);
+				monitor.worked(1);
 			}
 			for (int i = 0; i < workspaceModels.length; i++) {
-				fCurrentFeatures.put(workspaceModels[i].getFeature().getId(), workspaceModels[i]);
+				String id = workspaceModels[i].getFeature().getId();
+				monitor.subTask(id);
+				fCurrentFeatures.put(id, workspaceModels[i]);
+				monitor.worked(1);
 			}
+			monitor.done();
 		}
 		
 	}