*** empty log message ***
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java
index 9fd8028..0f54c7b 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/PDECore.java
@@ -31,6 +31,8 @@
 import org.eclipse.pde.core.plugin.IPlugin;
 import org.eclipse.pde.core.plugin.IPluginExtensionPoint;
 import org.eclipse.pde.core.plugin.IPluginModel;
+import org.eclipse.pde.internal.core.ifeature.*;
+import org.eclipse.pde.internal.core.ifeature.IFeature;
 import org.eclipse.pde.internal.core.schema.SchemaRegistry;
 
 public class PDECore extends Plugin {
@@ -131,6 +133,24 @@
 		}
 		return null;
 	}
+	
+	private IFeature findFeature(
+		IFeatureModel[] models,
+		String id,
+		String version,
+		int match) {
+
+		for (int i = 0; i < models.length; i++) {
+			IFeatureModel model = models[i];
+
+			IFeature feature = model.getFeature();
+			String pid = feature.getId();
+			String pversion = feature.getVersion();
+			if (compare(id, version, pid, pversion, match))
+				return feature;
+		}
+		return null;
+	}
 
 	public static boolean compare(
 		String id1,
@@ -189,6 +209,16 @@
 		ExternalModelManager exmanager = getExternalModelManager();
 		return findPlugin(exmanager.getModels(), id, version, match);
 	}
+	
+	public IFeature findFeature(String id) {
+		return findFeature(id, null, IMatchRules.NONE);
+	}
+	
+	public IFeature findFeature(String id, String version, int match) {
+		WorkspaceModelManager manager = getWorkspaceModelManager();
+		return findFeature(manager.getWorkspaceFeatureModels(), id, version, match);
+	}
+	
 	public static PDECore getDefault() {
 		return inst;
 	}
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/Feature.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/Feature.java
index c9fcf81..bff6978 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/Feature.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/Feature.java
@@ -61,11 +61,13 @@
 		fireStructureChanged(features, IModelChangedEvent.INSERT);
 	}
 
-	public void addImport(IFeatureImport iimport) throws CoreException {
+	public void addImports(IFeatureImport [] iimports) throws CoreException {
 		ensureModelEditable();
-		imports.add(iimport);
-		((FeatureImport) iimport).setInTheModel(true);
-		fireStructureChanged(iimport, IModelChangedEvent.INSERT);
+		for (int i=0; i<iimports.length; i++) {
+			imports.add(iimports[i]);
+			((FeatureImport)iimports[i]).setInTheModel(true);
+		}
+		fireStructureChanged(iimports, IModelChangedEvent.INSERT);
 	}
 
 	public IFeaturePlugin[] getPlugins() {
@@ -321,11 +323,13 @@
 		}
 		fireStructureChanged(features, IModelChangedEvent.REMOVE);
 	}
-	public void removeImport(IFeatureImport iimport) throws CoreException {
+	public void removeImports(IFeatureImport [] iimports) throws CoreException {
 		ensureModelEditable();
-		imports.remove(iimport);
-		((FeatureImport) iimport).setInTheModel(false);
-		fireStructureChanged(iimport, IModelChangedEvent.REMOVE);
+		for (int i=0; i<iimports.length; i++) {
+			imports.remove(iimports[i]);
+			((FeatureImport)iimports[i]).setInTheModel(false);
+		}
+		fireStructureChanged(iimports, IModelChangedEvent.REMOVE);
 	}
 
 	public String getOS() {
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureChild.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureChild.java
index 5071620..877fe2f 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureChild.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureChild.java
@@ -18,21 +18,45 @@
 	private IFeature feature;
 	private String name;
 	private boolean optional;
+	private int searchLocation = ROOT;
+	private int match = NONE;
 
 	protected void reset() {
 		super.reset();
 		version = null;
 		optional = false;
 		name = null;
+		searchLocation = ROOT;
+		match = NONE;
 	}
 	protected void parse(Node node) {
 		super.parse(node);
 		version = getNodeAttribute(node, "version");
 		name = getNodeAttribute(node, "name");
 		optional = getBooleanAttribute(node, "optional");
+		String matchName = getNodeAttribute(node, "match");
+		if (matchName != null) {
+			for (int i = 0; i < RULE_NAME_TABLE.length; i++) {
+				if (matchName.equals(RULE_NAME_TABLE[i])) {
+					match = i;
+					break;
+				}
+			}
+		}
+		String searchLocationName = getNodeAttribute(node, "search_location");
+		if (searchLocationName == null)
+			searchLocationName = getNodeAttribute(node, "search-location");
+		if (searchLocationName != null) {
+			if (searchLocationName.equals("root"))
+				searchLocation = ROOT;
+			else if (searchLocationName.equals("self"))
+				searchLocation = SELF;
+			else if (searchLocationName.equals("both"))
+				searchLocation = BOTH;
+		}
 		hookWithWorkspace();
 	}
-	
+
 	public void loadFrom(IFeature feature) {
 		id = feature.getId();
 		version = feature.getVersion();
@@ -46,28 +70,39 @@
 	public String getVersion() {
 		return version;
 	}
-	
+
 	public boolean isOptional() {
 		return optional;
 	}
-	
+
 	public String getName() {
 		return name;
 	}
-	
+
+	public int getSearchLocation() {
+		return searchLocation;
+	}
+
+	public int getMatch() {
+		return match;
+	}
+
 	public IFeature getReferencedFeature() {
-		if (feature==null)
+		if (feature == null)
 			hookWithWorkspace();
 		return feature;
 	}
 
 	public void hookWithWorkspace() {
 		IFeatureModel[] models =
-			PDECore.getDefault().getWorkspaceModelManager().getWorkspaceFeatureModels();
+			PDECore
+				.getDefault()
+				.getWorkspaceModelManager()
+				.getWorkspaceFeatureModels();
 		for (int i = 0; i < models.length; i++) {
 			IFeature feature = models[i].getFeature();
-			
-			if (feature!=null && feature.getId().equals(getId())) {
+
+			if (feature != null && feature.getId().equals(getId())) {
 				if (version == null || feature.getVersion().equals(version)) {
 					this.feature = feature;
 					break;
@@ -86,32 +121,55 @@
 		firePropertyChanged(P_VERSION, oldValue, version);
 		hookWithWorkspace();
 	}
-	
+
 	public void setName(String name) throws CoreException {
 		ensureModelEditable();
 		Object oldValue = this.name;
 		this.name = name;
 		firePropertyChanged(P_NAME, oldValue, name);
 	}
-	
+
+	public void setMatch(int match) throws CoreException {
+		ensureModelEditable();
+		Integer oldValue = new Integer(this.match);
+		this.match = match;
+		firePropertyChanged(P_MATCH, oldValue, new Integer(match));
+	}
+
+	public void setSearchLocation(int searchLocation) throws CoreException {
+		ensureModelEditable();
+		Integer oldValue = new Integer(this.searchLocation);
+		this.searchLocation = searchLocation;
+		firePropertyChanged(
+			P_SEARCH_LOCATION,
+			oldValue,
+			new Integer(searchLocation));
+	}
+
 	public void setOptional(boolean optional) throws CoreException {
 		ensureModelEditable();
 		Object oldValue = new Boolean(this.optional);
 		this.optional = optional;
 		firePropertyChanged(P_NAME, oldValue, new Boolean(optional));
 	}
-		
-	public void restoreProperty(String name, Object oldValue, Object newValue) throws CoreException {
+
+	public void restoreProperty(String name, Object oldValue, Object newValue)
+		throws CoreException {
 		if (name.equals(P_VERSION)) {
-			setVersion((String)newValue);
+			setVersion((String) newValue);
 		} else if (name.equals(P_OPTIONAL)) {
-			setOptional(((Boolean)newValue).booleanValue());
+			setOptional(((Boolean) newValue).booleanValue());
 		} else if (name.equals(P_NAME)) {
-			setName((String)newValue);
-		} else 
+			setName((String) newValue);
+		} else if (name.equals(P_MATCH)) {
+			setMatch(newValue != null ? ((Integer) newValue).intValue() : NONE);
+		} else if (name.equals(P_SEARCH_LOCATION)) {
+			setSearchLocation(
+				newValue != null ? ((Integer) newValue).intValue() : ROOT);
+		} else
 			super.restoreProperty(name, oldValue, newValue);
 	}
-	
+
 	public void setId(String id) throws CoreException {
 		super.setId(id);
 		hookWithWorkspace();
@@ -139,7 +197,15 @@
 			writer.println();
 			writer.print(indent2 + "optional=\"true\"");
 		}
+		if (match!=NONE) {
+			writer.println();
+			writer.print(indent2 + "match=\""+RULE_NAME_TABLE[match]+"\"");
+		}
+		if (searchLocation!=ROOT) {
+			writer.println();
+			String value=searchLocation==SELF?"self":"both";
+			writer.print(indent2 + "search_location=\""+value+"\"");
+		}
 		writer.println("/>");
-		//writer.println(indent + "</includes>");
 	}
 }
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureImport.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureImport.java
index 225f6eb..0e44397 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureImport.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/feature/FeatureImport.java
@@ -9,6 +9,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.pde.core.plugin.IPlugin;
 import org.eclipse.pde.internal.core.PDECore;
+import org.eclipse.pde.internal.core.ifeature.*;
 import org.eclipse.pde.internal.core.ifeature.IFeatureImport;
 import org.w3c.dom.Node;
 
@@ -17,6 +18,9 @@
 	implements IFeatureImport {
 	private int match = NONE;
 	private IPlugin plugin;
+	private IFeature feature;
+	private int type = PLUGIN;
+	private boolean patch = false;
 
 	public FeatureImport() {
 	}
@@ -24,14 +28,35 @@
 	public IPlugin getPlugin() {
 		return plugin;
 	}
+	
+	public IFeature getFeature() {
+		return feature;
+	}
 
 	public void setPlugin(IPlugin plugin) {
 		this.plugin = plugin;
 	}
+	
+	public void setFeature(IFeature feature) {
+		this.feature = feature;
+	}
+	
+	protected void reset() {
+		super.reset();
+		patch = false;
+		type = PLUGIN;
+		match = NONE;
+	}
 
 	protected void parse(Node node) {
 		super.parse(node);
 		this.id = getNodeAttribute(node, "plugin");
+		if (id != null)
+			type = PLUGIN;
+		else {
+			this.id = getNodeAttribute(node, "feature");
+			type = FEATURE;
+		}
 		String mvalue = getNodeAttribute(node, "match");
 		if (mvalue != null && mvalue.length() > 0) {
 			String[] choices = RULE_NAME_TABLE;
@@ -42,7 +67,19 @@
 				}
 			}
 		}
-		setPlugin(PDECore.getDefault().findPlugin(id, getVersion(), match));
+		patch = getBooleanAttribute(node, "patch");
+		if (type==PLUGIN)
+			setPlugin(PDECore.getDefault().findPlugin(id, getVersion(), match));
+		else 
+			setFeature(PDECore.getDefault().findFeature(id, getVersion(), match));
+	}
+	
+	public void loadFrom(IFeature feature) {
+		reset();
+		this.feature = feature;
+		type = FEATURE;
+		id = feature.getId();
+		version = feature.getVersion();
 	}
 
 	public int getMatch() {
@@ -56,27 +93,61 @@
 		firePropertyChanged(P_MATCH, oldValue, new Integer(match));
 	}
 
+	public int getType() {
+		return type;
+	}
+
+	public void setType(int type) throws CoreException {
+		ensureModelEditable();
+		Integer oldValue = new Integer(this.type);
+		this.type = type;
+		firePropertyChanged(P_TYPE, oldValue, new Integer(type));
+	}
+
+	public boolean isPatch() {
+		return patch;
+	}
+
+	public void setPatch(boolean patch) throws CoreException {
+		ensureModelEditable();
+		Boolean oldValue = new Boolean(this.patch);
+		this.patch = patch;
+		firePropertyChanged(P_PATCH, oldValue, new Boolean(patch));
+	}
+
 	public void restoreProperty(String name, Object oldValue, Object newValue)
 		throws CoreException {
 		if (name.equals(P_MATCH)) {
 			setMatch(newValue != null ? ((Integer) newValue).intValue() : 0);
+		} else if (name.equals(P_TYPE)) {
+			setType(
+				newValue != null ? ((Integer) newValue).intValue() : PLUGIN);
+		} else if (name.equals(P_PATCH)) {
+			setPatch(
+				newValue != null ? ((Boolean) newValue).booleanValue() : false);
 		} else
 			super.restoreProperty(name, oldValue, newValue);
 	}
 
 	public void write(String indent, PrintWriter writer) {
-		writer.print(indent + "<import plugin=\"" + getId() + "\"");
+		String typeAtt = type==FEATURE ? "feature":"plugin";
+		writer.print(indent + "<import "+typeAtt+"=\"" + getId() + "\"");
 		if (getVersion() != null) {
 			writer.print(" version=\"" + getVersion() + "\"");
 		}
 		if (match != NONE) {
 			writer.print(" match=\"" + RULE_NAME_TABLE[match] + "\"");
 		}
+		if (patch) {
+			writer.print(" patch=\"true\"");
+		}
 		writer.println("/>");
 	}
 	public String toString() {
 		if (plugin != null)
 			return plugin.getTranslatedName();
+		else if (feature != null)
+			return feature.getLabel();
 		return getId();
 	}
 }
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeature.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeature.java
index 4157301..b90478b 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeature.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeature.java
@@ -100,7 +100,7 @@
  *
  * @param reference a required plug-in reference to add
  */
-public void addImport(IFeatureImport iimport) throws CoreException;
+public void addImports(IFeatureImport [] imports) throws CoreException;
 /**
  * Returns references to plug-ins in this feature
  *
@@ -181,7 +181,7 @@
  *
  * @param iimport a required plug-in reference to add
  */
-public void removeImport(IFeatureImport iimport) throws CoreException;
+public void removeImports(IFeatureImport [] imports) throws CoreException;
 /**
  * Sets the provider name of this feature. This method
  * may throw a CoreException if the model is not editable.
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureChild.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureChild.java
index 7341258..5c8fcdd 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureChild.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureChild.java
@@ -6,17 +6,29 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.pde.core.IIdentifiable;
+import org.eclipse.pde.core.plugin.IMatchRules;
 /**
  * The reference to a plug-in that is part of this feature.
  */
-public interface IFeatureChild extends IFeatureObject, IIdentifiable {
+public interface IFeatureChild extends IFeatureObject, IIdentifiable, IMatchRules {
 	String P_VERSION = "version";
 	String P_OPTIONAL = "optional";
 	String P_NAME = "name";
+	String P_MATCH = "match";
+	String P_SEARCH_LOCATION = "search-location";
+	
+	int ROOT = 0;
+	int SELF = 1;
+	int BOTH = 2;
+	
 	String getVersion();
 	void setVersion(String version) throws CoreException;
 	boolean isOptional();
 	void setOptional(boolean optional) throws CoreException;
 	String getName();
 	void setName(String name) throws CoreException;
+	int getSearchLocation();
+	void setSearchLocation(int location) throws CoreException;
+	int getMatch();
+	void setMatch(int match) throws CoreException;
 }
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureImport.java b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureImport.java
index 920aa4b..1915190 100644
--- a/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureImport.java
+++ b/ui/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/ifeature/IFeatureImport.java
@@ -6,10 +6,23 @@
  */
 package org.eclipse.pde.internal.core.ifeature;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.pde.core.plugin.IPluginReference;
 /**
  * @version 	1.0
  * @author
  */
 public interface IFeatureImport extends IFeatureObject, IPluginReference {
+	String P_TYPE = "type";
+	String P_PATCH = "patch";
+	
+	int PLUGIN = 0;
+	int FEATURE = 1;
+	
+	int getType();
+	
+	void setType(int type) throws CoreException;
+	
+	boolean isPatch();
+	void setPatch(boolean patch) throws CoreException;
 }
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDELabelProvider.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDELabelProvider.java
index ae4e0d2..1397ed2 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDELabelProvider.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/PDELabelProvider.java
@@ -164,9 +164,17 @@
 	}
 
 	public String getObjectText(FeatureImport obj) {
-		IPlugin plugin = obj.getPlugin();
-		if (plugin != null && isFullNameModeEnabled()) {
-			return plugin.getTranslatedName();
+		int type = obj.getType();
+		if (type == IFeatureImport.PLUGIN) {
+			IPlugin plugin = obj.getPlugin();
+			if (plugin != null && isFullNameModeEnabled()) {
+				return plugin.getTranslatedName();
+			}
+		} else if (type == IFeatureImport.FEATURE) {
+			IFeature feature = obj.getFeature();
+			if (feature != null && isFullNameModeEnabled()) {
+				return feature.getLabel();
+			}
 		}
 		return obj.getId();
 	}
@@ -193,7 +201,7 @@
 	}
 	public String getObjectText(ISiteCategory obj) {
 		ISiteCategoryDefinition def = obj.getDefinition();
-		if (def!=null)
+		if (def != null)
 			return def.getLabel();
 		return obj.getName();
 	}
@@ -282,7 +290,7 @@
 			return getObjectImage((ISiteCategoryDefinition) obj);
 		}
 		if (obj instanceof ISiteCategory) {
-			return getObjectImage((ISiteCategory)obj);
+			return getObjectImage((ISiteCategory) obj);
 		}
 		if (obj instanceof ISiteBuildFeature) {
 			return getObjectImage((ISiteBuildFeature) obj);
@@ -461,11 +469,24 @@
 
 	private Image getObjectImage(IFeatureImport obj) {
 		FeatureImport iimport = (FeatureImport) obj;
-		IPlugin plugin = iimport.getPlugin();
+		int type = iimport.getType();
+		ImageDescriptor base;
 		int flags = 0;
-		if (plugin == null)
-			flags = F_ERROR;
-		return get(PDEPluginImages.DESC_REQ_PLUGIN_OBJ, flags);
+		
+		if (type==IFeatureImport.FEATURE) {
+			base = PDEPluginImages.DESC_FEATURE_OBJ;
+			IFeature feature = iimport.getFeature();
+			if (feature == null)
+				flags = F_ERROR;
+		}
+		else {
+			base = PDEPluginImages.DESC_REQ_PLUGIN_OBJ;
+			IPlugin plugin = iimport.getPlugin();
+			if (plugin == null)
+				flags = F_ERROR;
+		}
+
+		return get(base, flags);
 	}
 	private Image getObjectImage(IFeatureInfo info) {
 		int flags = 0;
@@ -481,7 +502,7 @@
 
 	public Image getObjectImage(ISiteFeature obj) {
 		int flags = 0;
-		if (obj.getArchiveFile()!=null) {
+		if (obj.getArchiveFile() != null) {
 			flags = F_BINARY;
 		}
 		return get(PDEPluginImages.DESC_JAVA_LIB_OBJ, flags);
@@ -493,9 +514,9 @@
 	public Image getObjectImage(ISiteCategoryDefinition obj) {
 		return get(PDEPluginImages.DESC_CATEGORY_OBJ);
 	}
-	
+
 	public Image getObjectImage(ISiteCategory obj) {
-		int flags = obj.getDefinition()==null?F_ERROR:0;
+		int flags = obj.getDefinition() == null ? F_ERROR : 0;
 		return get(PDEPluginImages.DESC_CATEGORY_OBJ, flags);
 	}
 
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/FeatureMatchSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/FeatureMatchSection.java
new file mode 100644
index 0000000..b86ea96
--- /dev/null
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/FeatureMatchSection.java
@@ -0,0 +1,117 @@
+package org.eclipse.pde.internal.ui.editor.feature;
+
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.pde.internal.core.ifeature.IFeatureImport;
+import org.eclipse.pde.internal.ui.PDEPlugin;
+import org.eclipse.pde.internal.ui.editor.PDEFormPage;
+import org.eclipse.pde.internal.ui.editor.manifest.MatchSection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.update.ui.forms.internal.FormWidgetFactory;
+
+/**
+ * @author dejan
+ *
+ * To change this generated comment edit the template variable "typecomment":
+ * Window>Preferences>Java>Templates.
+ * To enable and disable the creation of type comments go to
+ * Window>Preferences>Java>Code Generation.
+ */
+public class FeatureMatchSection extends MatchSection {
+	private Button patchButton;
+
+	/**
+	 * Constructor for FeatureMatchSection.
+	 * @param formPage
+	 */
+	public FeatureMatchSection(PDEFormPage formPage) {
+		super(formPage, false);
+	}
+
+	public Composite createClient(
+		Composite parent,
+		FormWidgetFactory factory) {
+		Composite client = super.createClient(parent, factory);
+		patchButton = factory.createButton(client, "Patch", SWT.CHECK);
+		GridData gd = new GridData();
+		gd.horizontalSpan = 2;
+		patchButton.setLayoutData(gd);
+		patchButton.setEnabled(false);
+		patchButton.setSelection(false);
+		patchButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handlePatchChange(patchButton.getSelection());
+			}
+		});
+		return client;
+	}
+
+	private void handlePatchChange(boolean patch) {
+		if (currentImport != null) {
+			IFeatureImport iimport = (IFeatureImport) currentImport;
+			if (iimport.getType() == IFeatureImport.FEATURE) {
+				try {
+					iimport.setPatch(patch);
+				} catch (CoreException e) {
+					PDEPlugin.logException(e);
+				}
+			}
+		}
+		if (multiSelection != null) {
+			for (Iterator iter=multiSelection.iterator(); iter.hasNext();) {
+				IFeatureImport iimport = (IFeatureImport)iter.next();
+				try {
+					iimport.setPatch(patch);
+				}
+				catch (CoreException e) {
+					PDEPlugin.logException(e);
+					break;
+				}
+			}
+		}
+	}
+
+	protected void update(IStructuredSelection selection) {
+		super.update(selection);
+		if (patchButton==null) return;
+		if (selection.isEmpty()) {
+			update((IFeatureImport)null);
+			return;
+		}
+		if (selection.size()==1) {
+			update((IFeatureImport)selection.getFirstElement());
+			return;
+		}
+		int ntrue=0, nfalse=0;
+		
+		for (Iterator iter=selection.iterator(); iter.hasNext();) {
+			IFeatureImport iimport = (IFeatureImport)iter.next();
+			if (iimport.getType()==IFeatureImport.FEATURE) {
+				if (iimport.isPatch())
+					ntrue++;
+				else
+					nfalse++;
+			}
+		}
+		patchButton.setEnabled(!isReadOnly() && (ntrue>0 || nfalse>0));
+		patchButton.setSelection(ntrue>0);
+	}
+
+	private void update(IFeatureImport iimport) {
+		super.update(iimport);
+		if (patchButton==null) return;
+		IFeatureImport fimport = (IFeatureImport) iimport;
+		if (fimport == null || fimport.getType() == IFeatureImport.PLUGIN) {
+			patchButton.setSelection(false);
+			patchButton.setEnabled(false);
+			return;
+		}
+		patchButton.setEnabled(!isReadOnly());
+		patchButton.setSelection(fimport.isPatch());
+	}
+}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/FeatureUndoManager.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/FeatureUndoManager.java
index 580e9c5..c405a57 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/FeatureUndoManager.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/FeatureUndoManager.java
@@ -90,7 +90,7 @@
 				} else if (element instanceof IFeatureData) {
 					feature.addData(new IFeatureData [] {(IFeatureData) element});
 				} else if (element instanceof IFeatureImport) {
-					feature.addImport((IFeatureImport) element);
+					feature.addImports(new IFeatureImport [] {(IFeatureImport) element});
 				} else if (element instanceof IFeatureChild) {
 					feature.addIncludedFeatures(new IFeatureChild [] {(IFeatureChild) element});
 				}
@@ -112,7 +112,7 @@
 				} else if (element instanceof IFeatureData) {
 					feature.removeData(new IFeatureData [] {(IFeatureData) element});
 				} else if (element instanceof IFeatureImport) {
-					feature.removeImport((IFeatureImport) element);
+					feature.removeImports(new IFeatureImport [] {(IFeatureImport) element});
 				} else if (element instanceof IFeatureChild) {
 					feature.removeIncludedFeatures(new IFeatureChild [] {(IFeatureChild) element});
 				}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/NewFeatureRequireWizardPage.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/NewFeatureRequireWizardPage.java
index 1faa7bd..363cf41 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/NewFeatureRequireWizardPage.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/NewFeatureRequireWizardPage.java
@@ -20,11 +20,11 @@
 import org.eclipse.ui.help.WorkbenchHelp;
 
 public class NewFeatureRequireWizardPage extends ReferenceWizardPage {
-	public static final String KEY_TITLE = "FeatureEditor.RequiresSection.new.title";
-	public static final String KEY_DESC = "FeatureEditor.RequiresSection.new.desc";
-	public static final String KEY_ADDING = "FeatureEditor.RequiresSection.new.adding";
+	public static final String KEY_TITLE = "FeatureEditor.RequiresSection.newPlugin.title";
+	public static final String KEY_DESC = "FeatureEditor.RequiresSection.newPlugin.desc";
+	public static final String KEY_ADDING = "FeatureEditor.RequiresSection.newPlugin.adding";
 	public static final String KEY_UPDATING =
-		"FeatureEditor.RequiresSection.new.updating";
+		"FeatureEditor.RequiresSection.newPlugin.updating";
 
 	public NewFeatureRequireWizardPage(IFeatureModel model) {
 		super(model);
@@ -64,12 +64,12 @@
 			FeatureImport fimport = (FeatureImport) model.getFactory().createImport();
 			fimport.setPlugin((IPlugin)candidate.getPluginBase());
 			fimport.setId(pluginBase.getId());
-			feature.addImport(fimport);
 			added[i] = fimport;
 			monitor.worked(1);
 		}
 		monitor.subTask("");
 		monitor.setTaskName(PDEPlugin.getResourceString(KEY_UPDATING));
+		feature.addImports(added);
 		monitor.worked(1);
 	}
 	
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/ReferenceForm.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/ReferenceForm.java
index 178495b..c704e99 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/ReferenceForm.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/ReferenceForm.java
@@ -4,10 +4,8 @@
  * All Rights Reserved.
  */
 
-import org.eclipse.pde.internal.ui.IHelpContextIds;
-import org.eclipse.pde.internal.ui.PDEPlugin;
-import org.eclipse.pde.internal.ui.editor.manifest.MatchSection;
 import org.eclipse.pde.internal.core.ifeature.*;
+import org.eclipse.pde.internal.ui.*;
 import org.eclipse.swt.layout.*;
 import org.eclipse.swt.widgets.*;
 import org.eclipse.ui.help.WorkbenchHelp;
@@ -18,7 +16,7 @@
 	private FeatureReferencePage page;
 	private PluginSection pluginSection;
 	private RequiresSection requiresSection;
-	private MatchSection matchSection;
+	private FeatureMatchSection matchSection;
 
 public ReferenceForm(FeatureReferencePage page) {
 	this.page = page;
@@ -59,7 +57,7 @@
 	gd = new GridData(GridData.FILL_BOTH);
 	control.setLayoutData(gd);	
 
-	matchSection = new MatchSection(page, false);
+	matchSection = new FeatureMatchSection(page);
 	control = matchSection.createControl(right, factory);
 	gd = new GridData(GridData.FILL_HORIZONTAL);
 	control.setLayoutData(gd);
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiredFeaturesWizard.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiredFeaturesWizard.java
new file mode 100644
index 0000000..f91447f
--- /dev/null
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiredFeaturesWizard.java
@@ -0,0 +1,31 @@
+package org.eclipse.pde.internal.ui.editor.feature;
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import org.eclipse.jface.wizard.*;
+import org.eclipse.pde.internal.core.ifeature.IFeatureModel;
+import org.eclipse.pde.internal.ui.*;
+
+public class RequiredFeaturesWizard extends Wizard {
+	private IFeatureModel model;
+	private RequiredFeaturesWizardPage mainPage;
+
+public RequiredFeaturesWizard(IFeatureModel model) {
+	this.model = model;
+	setDefaultPageImageDescriptor(PDEPluginImages.DESC_NEWPPRJ_WIZ);
+	setDialogSettings(PDEPlugin.getDefault().getDialogSettings());
+	setNeedsProgressMonitor(true);
+}
+
+public void addPages() {
+	mainPage = new RequiredFeaturesWizardPage(model);
+	addPage(mainPage);
+}
+
+public boolean performFinish() {
+	return mainPage.finish();
+}
+
+}
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiredFeaturesWizardPage.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiredFeaturesWizardPage.java
new file mode 100644
index 0000000..868aa73
--- /dev/null
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiredFeaturesWizardPage.java
@@ -0,0 +1,191 @@
+package org.eclipse.pde.internal.ui.editor.feature;
+/*
+ * (c) Copyright IBM Corp. 2000, 2001.
+ * All Rights Reserved.
+ */
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.pde.internal.core.*;
+import org.eclipse.pde.internal.core.feature.*;
+import org.eclipse.pde.internal.core.ifeature.*;
+import org.eclipse.pde.internal.ui.IHelpContextIds;
+import org.eclipse.pde.internal.ui.PDEPlugin;
+import org.eclipse.pde.internal.ui.elements.DefaultContentProvider;
+import org.eclipse.pde.internal.ui.parts.WizardCheckboxTablePart;
+import org.eclipse.pde.internal.ui.wizards.ListUtil;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.update.ui.forms.internal.FormWidgetFactory;
+
+public class RequiredFeaturesWizardPage extends WizardPage {
+	public static final String KEY_TITLE = "FeatureEditor.RequiresSection.newFeature.title";
+	public static final String KEY_DESC = "FeatureEditor.RequiresSection.newFeature.desc";
+	public static final String KEY_FEATURES =
+		"FeatureEditor.RequiresSection.newFeature.label";
+	public static final String KEY_ADDING = "FeatureEditor.RequiresSection.newFeature.adding";
+	public static final String KEY_UPDATING =
+		"FeatureEditor.RequiresSection.newFeature.updating";
+	private IFeatureModel model;
+	private TablePart checkboxTablePart;
+	private CheckboxTableViewer pluginViewer;
+
+	class PluginContentProvider
+		extends DefaultContentProvider
+		implements IStructuredContentProvider {
+		public Object[] getElements(Object parent) {
+			return getChoices();
+		}
+	}
+	
+	class TablePart extends WizardCheckboxTablePart {
+		public TablePart() {
+			super(PDEPlugin.getResourceString(KEY_FEATURES));
+		}
+		public void updateCounter(int count) {
+			super.updateCounter(count);
+			setPageComplete(count>0);
+		}
+		protected StructuredViewer createStructuredViewer(
+			Composite parent,
+			int style,
+			FormWidgetFactory factory) {
+			StructuredViewer viewer =
+				super.createStructuredViewer(parent, style, factory);
+			viewer.setSorter(ListUtil.FEATURE_SORTER);
+			return viewer;
+		}
+	}
+
+	public RequiredFeaturesWizardPage(IFeatureModel model) {
+		super("RequiredFeaturesPage");
+		this.model = model;
+		setTitle(PDEPlugin.getResourceString(KEY_TITLE));
+		setDescription(PDEPlugin.getResourceString(KEY_DESC));
+		setPageComplete(false);
+		
+		checkboxTablePart = new TablePart();	
+		PDEPlugin.getDefault().getLabelProvider().connect(this);
+	}
+	
+	public void dispose() {
+		PDEPlugin.getDefault().getLabelProvider().disconnect(this);
+		super.dispose();
+	}
+
+	public void createControl(Composite parent) {
+		Composite container = new Composite(parent, SWT.NULL);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		container.setLayout(layout);
+		
+		createPluginList(container);
+		initialize();
+		setControl(container);
+		WorkbenchHelp.setHelp(container, IHelpContextIds.FEATURE_INCLUDED_FEATURES_WIZARD);
+	}
+
+	protected void createPluginList(Composite parent) {
+		checkboxTablePart.createControl(parent);
+		pluginViewer = checkboxTablePart.getTableViewer();
+		pluginViewer.setContentProvider(new PluginContentProvider());
+		pluginViewer.setLabelProvider(PDEPlugin.getDefault().getLabelProvider());
+		pluginViewer.addFilter(new ViewerFilter() {
+			public boolean select(Viewer v, Object parent, Object object) {
+				if (object instanceof IFeatureModel) {
+					IFeatureModel model = (IFeatureModel) object;
+					return !isOnTheList(model);
+				}
+				return true;
+			}
+		});
+		GridData gd = (GridData)checkboxTablePart.getControl().getLayoutData();
+		gd.heightHint = 300;
+	}
+
+	private boolean isOnTheList(IFeatureModel candidate) {
+		IFeatureImport[] imports = model.getFeature().getImports();
+		IFeature cfeature = candidate.getFeature();
+		
+		if (isThisModel(cfeature)) return true;
+
+		for (int i = 0; i < imports.length; i++) {
+			IFeatureImport iimport = imports[i];
+			
+			if (iimport.getType()==IFeatureImport.PLUGIN) continue;
+			if (iimport.getId().equals(cfeature.getId()) &&
+				iimport.getVersion().equals(cfeature.getVersion())) return true;
+		}
+		return false;
+	}
+	
+	private boolean isThisModel(IFeature cfeature) {
+		IFeature thisFeature = this.model.getFeature();
+		
+		return cfeature.getId().equals(thisFeature.getId()) &&
+			cfeature.getVersion().equals(thisFeature.getVersion());
+	}
+
+	public void init(IWorkbench workbench) {
+	}
+
+	private void initialize() {
+		pluginViewer.setInput(model.getFeature());
+		checkboxTablePart.setSelection(new Object[0]);
+	}
+
+	private Object[] getChoices() {
+		WorkspaceModelManager mng = PDECore.getDefault().getWorkspaceModelManager();
+		return mng.getWorkspaceFeatureModels();
+	}
+
+	public boolean finish() {
+		final Object [] candidates = checkboxTablePart.getSelection();
+		IRunnableWithProgress op = new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) throws InvocationTargetException {
+				try {
+					doAdd(candidates, monitor);
+				} catch (CoreException e) {
+					throw new InvocationTargetException(e);
+				}
+			}
+		};
+		try {
+			getContainer().run(false, false, op);
+		} catch (InterruptedException e) {
+			return false;
+		} catch (InvocationTargetException e) {
+			PDEPlugin.logException(e);
+			return false;
+		}
+		return true;
+	}
+
+	private void doAdd(Object [] candidates, IProgressMonitor monitor) throws CoreException {
+		monitor.beginTask(
+			PDEPlugin.getResourceString(KEY_ADDING),
+			candidates.length + 1);
+		IFeature feature = model.getFeature();
+		IFeatureImport[] added = new IFeatureImport[candidates.length];
+		for (int i = 0; i < candidates.length; i++) {
+			IFeatureModel candidate = (IFeatureModel) candidates[i];
+			String name = candidate.getFeature().getLabel();
+			monitor.subTask(candidate.getResourceString(name));
+			FeatureImport iimport = (FeatureImport) model.getFactory().createImport();
+			iimport.loadFrom(candidate.getFeature());
+			added[i] = iimport;
+			monitor.worked(1);
+		}
+		monitor.subTask("");
+		monitor.setTaskName(PDEPlugin.getResourceString(KEY_UPDATING));
+		feature.addImports(added);
+		monitor.worked(1);
+	}
+}
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiresSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiresSection.java
index 2d96845..13625ad 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiresSection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/feature/RequiresSection.java
@@ -11,16 +11,13 @@
 import org.eclipse.jface.viewers.*;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.pde.core.IModelChangedEvent;
-import org.eclipse.pde.core.plugin.IFragment;
-import org.eclipse.pde.core.plugin.IFragmentModel;
+import org.eclipse.pde.core.plugin.*;
 import org.eclipse.pde.internal.core.*;
 import org.eclipse.pde.internal.core.feature.FeatureImport;
 import org.eclipse.pde.internal.core.ifeature.*;
-import org.eclipse.pde.internal.core.plugin.Fragment;
-import org.eclipse.pde.internal.core.plugin.Plugin;
+import org.eclipse.pde.internal.core.plugin.*;
 import org.eclipse.pde.internal.ui.PDEPlugin;
-import org.eclipse.pde.internal.ui.editor.ModelDataTransfer;
-import org.eclipse.pde.internal.ui.editor.TableSection;
+import org.eclipse.pde.internal.ui.editor.*;
 import org.eclipse.pde.internal.ui.elements.DefaultContentProvider;
 import org.eclipse.pde.internal.ui.parts.TablePart;
 import org.eclipse.pde.internal.ui.wizards.ListUtil;
@@ -35,18 +32,19 @@
 public class RequiresSection
 	extends TableSection
 	implements IModelProviderListener {
-		public static final int MULTI_SELECTION = 33;
+	public static final int MULTI_SELECTION = 33;
 	private static final String KEY_TITLE =
 		"FeatureEditor.RequiresSection.title";
 	private static final String KEY_DESC = "FeatureEditor.RequiresSection.desc";
-	private static final String KEY_NEW_BUTTON =
-		"FeatureEditor.RequiresSection.newButton";
+	private static final String KEY_NEW_PLUGIN_BUTTON =
+		"FeatureEditor.RequiresSection.newPluginButton";
+	private static final String KEY_NEW_FEATURE_BUTTON =
+		"FeatureEditor.RequiresSection.newFeatureButton";
 	private static final String KEY_SYNC_BUTTON =
 		"FeatureEditor.RequiresSection.syncButton";
 	private static final String KEY_COMPUTE =
 		"FeatureEditor.RequiresSection.compute";
-	private static final String KEY_DELETE = 
-		"Actions.delete.label";
+	private static final String KEY_DELETE = "Actions.delete.label";
 	private boolean updateNeeded;
 	private Button syncButton;
 	private TableViewer pluginViewer;
@@ -66,7 +64,9 @@
 		super(
 			page,
 			new String[] {
-				PDEPlugin.getResourceString(KEY_NEW_BUTTON),
+				PDEPlugin.getResourceString(KEY_NEW_PLUGIN_BUTTON),
+				PDEPlugin.getResourceString(KEY_NEW_FEATURE_BUTTON),
+				null,
 				PDEPlugin.getResourceString(KEY_COMPUTE)});
 		setHeaderText(PDEPlugin.getResourceString(KEY_TITLE));
 		setDescription(PDEPlugin.getResourceString(KEY_DESC));
@@ -99,7 +99,7 @@
 		pluginViewer.setSorter(ListUtil.NAME_SORTER);
 		pluginViewer.setLabelProvider(
 			PDEPlugin.getDefault().getLabelProvider());
-					
+
 		deleteAction = new Action() {
 			public void run() {
 				handleDelete();
@@ -111,13 +111,22 @@
 	}
 
 	protected void buttonSelected(int index) {
-		if (index == 0)
-			handleNew();
-		else if (index == 1)
-			recomputeImports();
+		switch (index) {
+			case 0 :
+				handleNewPlugin();
+				break;
+			case 1 :
+				handleNewFeature();
+				break;
+			case 2 :
+				break;
+			case 3 :
+				recomputeImports();
+				break;
+		}
 	}
 
-	private void handleNew() {
+	private void handleNewPlugin() {
 		final IFeatureModel model = (IFeatureModel) getFormPage().getModel();
 		BusyIndicator
 			.showWhile(pluginViewer.getTable().getDisplay(), new Runnable() {
@@ -135,6 +144,23 @@
 		});
 	}
 
+	private void handleNewFeature() {
+		final IFeatureModel model = (IFeatureModel) getFormPage().getModel();
+		BusyIndicator
+			.showWhile(pluginViewer.getTable().getDisplay(), new Runnable() {
+			public void run() {
+				RequiredFeaturesWizard wizard =
+					new RequiredFeaturesWizard(model);
+				WizardDialog dialog =
+					new WizardDialog(
+						PDEPlugin.getActiveWorkbenchShell(),
+						wizard);
+				dialog.create();
+				dialog.open();
+			}
+		});
+	}
+
 	private void handleDelete() {
 		IFeatureModel model = (IFeatureModel) getFormPage().getModel();
 		IFeature feature = model.getFeature();
@@ -144,10 +170,13 @@
 			return;
 
 		try {
+			IFeatureImport[] deleted = new IFeatureImport[selection.size()];
+			int i = 0;
 			for (Iterator iter = selection.iterator(); iter.hasNext();) {
 				IFeatureImport iimport = (IFeatureImport) iter.next();
-				feature.removeImport(iimport);
+				deleted[i++] = iimport;
 			}
+			feature.removeImports(deleted);
 		} catch (CoreException e) {
 			PDEPlugin.logException(e);
 		}
@@ -171,7 +200,10 @@
 
 	public boolean doGlobalAction(String actionId) {
 		if (actionId.equals(org.eclipse.ui.IWorkbenchActionConstants.DELETE)) {
-			BusyIndicator.showWhile(pluginViewer.getTable().getDisplay(), new Runnable() {
+			BusyIndicator
+				.showWhile(
+					pluginViewer.getTable().getDisplay(),
+					new Runnable() {
 				public void run() {
 					handleDelete();
 				}
@@ -189,7 +221,10 @@
 			return true;
 		}
 		if (actionId.equals(IWorkbenchActionConstants.SELECT_ALL)) {
-			BusyIndicator.showWhile(pluginViewer.getTable().getDisplay(), new Runnable() {
+			BusyIndicator
+				.showWhile(
+					pluginViewer.getTable().getDisplay(),
+					new Runnable() {
 				public void run() {
 					handleSelectAll();
 				}
@@ -211,7 +246,8 @@
 		manager.add(propertiesAction);
 		manager.add(new Separator());
 		*/
-		IStructuredSelection selection = (StructuredSelection)pluginViewer.getSelection();
+		IStructuredSelection selection =
+			(StructuredSelection) pluginViewer.getSelection();
 		if (!selection.isEmpty()) {
 			manager.add(deleteAction);
 			manager.add(new Separator());
@@ -234,6 +270,8 @@
 		update(input);
 		if (model.isEditable() == false) {
 			getTablePart().setButtonEnabled(0, false);
+			getTablePart().setButtonEnabled(1, false);
+			getTablePart().setButtonEnabled(3, false);
 			syncButton.setEnabled(false);
 		}
 		model.addModelChangedListener(this);
@@ -304,7 +342,8 @@
 	 * @see org.eclipse.pde.internal.ui.editor.StructuredViewerSection#canPaste(Clipboard)
 	 */
 	public boolean canPaste(Clipboard clipboard) {
-		Object [] objects = (Object[])clipboard.getContents(ModelDataTransfer.getInstance());
+		Object[] objects =
+			(Object[]) clipboard.getContents(ModelDataTransfer.getInstance());
 		if (objects != null && objects.length > 0) {
 			return canPaste(null, objects);
 		}
@@ -325,8 +364,9 @@
 	 */
 	protected void doPaste() {
 		Clipboard clipboard = getFormPage().getEditor().getClipboard();
-		Object [] objects = (Object[])clipboard.getContents(ModelDataTransfer.getInstance());
-		if (objects != null && canPaste(null,objects))
+		Object[] objects =
+			(Object[]) clipboard.getContents(ModelDataTransfer.getInstance());
+		if (objects != null && canPaste(null, objects))
 			doPaste(null, objects);
 	}
 	/**
@@ -335,37 +375,56 @@
 	protected void doPaste(Object target, Object[] objects) {
 		IFeatureModel model = (IFeatureModel) getFormPage().getModel();
 		IFeature feature = model.getFeature();
+
+		IFeatureImport[] imports = new IFeatureImport[objects.length];
 		try {
 			for (int i = 0; i < objects.length; i++) {
 				FeatureImport fImport = (FeatureImport) objects[i];
 				fImport.setModel(model);
 				fImport.setParent(feature);
-				setPluginModel(fImport);
-				feature.addImport(fImport);
+				reconnectReference(fImport);
+				imports[i] = fImport;
 			}
+			feature.addImports(imports);
 		} catch (CoreException e) {
 			PDEPlugin.logException(e);
 		}
 
 	}
-	
-	private void setPluginModel(FeatureImport fImport) {
-		Plugin plugin = (Plugin)fImport.getPlugin();
-		if (plugin.getPluginBase() instanceof Fragment) {
-			IFragmentModel[] fragments =
-				PDECore.getDefault().getWorkspaceModelManager().getWorkspaceFragmentModels();
-			for (int i = 0; i < fragments.length; i++) {
-				IFragment fragment = fragments[i].getFragment();
-				if (fragment.getId().equals(plugin.getId())) {
-					if (plugin.getVersion() == null || fragment.getVersion().equals(plugin.getVersion())) {
-						plugin.setModel(fragment.getModel());
-						return;
+
+	private void reconnectReference(FeatureImport fImport) {
+		if (fImport.getType() == IFeatureImport.FEATURE) {
+			fImport.setFeature(
+				PDECore
+					.getDefault()
+					.findFeature(fImport.getId(), fImport.getVersion(), fImport.getMatch()));
+		} else {
+			Plugin plugin = (Plugin) fImport.getPlugin();
+			if (plugin.getPluginBase() instanceof Fragment) {
+				IFragmentModel[] fragments =
+					PDECore
+						.getDefault()
+						.getWorkspaceModelManager()
+						.getWorkspaceFragmentModels();
+				for (int i = 0; i < fragments.length; i++) {
+					IFragment fragment = fragments[i].getFragment();
+					if (fragment.getId().equals(plugin.getId())) {
+						if (plugin.getVersion() == null
+							|| fragment.getVersion().equals(
+								plugin.getVersion())) {
+							plugin.setModel(fragment.getModel());
+							return;
+						}
 					}
 				}
+			} else {
+				plugin.setModel(
+					PDECore
+						.getDefault()
+						.findPlugin(plugin.getId(), plugin.getVersion(), 0)
+						.getModel());
 			}
-		} else {
-			plugin.setModel(PDECore.getDefault().findPlugin(plugin.getId(), plugin.getVersion(), 0).getModel());
 		}
 	}
-	
+
 }
\ No newline at end of file
diff --git a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/manifest/MatchSection.java b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/manifest/MatchSection.java
index 77cb879..898ced5 100644
--- a/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/manifest/MatchSection.java
+++ b/ui/org.eclipse.pde.ui/src/org/eclipse/pde/internal/ui/editor/manifest/MatchSection.java
@@ -28,8 +28,8 @@
 	private FormEntry versionText;
 	private Button reexportButton;
 	private CCombo matchCombo;
-	private IPluginReference currentImport;
-	private IStructuredSelection multiSelection;
+	protected IPluginReference currentImport;
+	protected IStructuredSelection multiSelection;
 	private boolean blockChanges = false;
 	private boolean ignoreModelEvents = false;
 	private boolean addReexport = true;
@@ -315,7 +315,7 @@
 		matchCombo.select(match);
 	}
 
-	private void update(IStructuredSelection selection) {
+	protected void update(IStructuredSelection selection) {
 		blockChanges = true;
 		currentImport = null;
 		int size = selection.size();
@@ -349,7 +349,7 @@
 		blockChanges = false;
 	}
 
-	private void update(IPluginReference iimport) {
+	protected void update(IPluginReference iimport) {
 		blockChanges = true;
 		if (iimport == null) {
 			if (addReexport) {
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 66167c0..f0e7bc9 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
@@ -178,11 +178,19 @@
 FeatureEditor.RequiresSection.desc = Compute plug-ins that will need to be present before installing this feature.
 FeatureEditor.RequiresSection.syncButton = Recompute on each change
 FeatureEditor.RequiresSection.compute = Compute
-FeatureEditor.RequiresSection.newButton = Add...
-FeatureEditor.RequiresSection.new.title= New Required Plug-in
-FeatureEditor.RequiresSection.new.desc=Choose plug-ins that will be required by this feature.
-FeatureEditor.RequiresSection.new.adding= Adding References:
-FeatureEditor.RequiresSection.new.updating= Updating...
+FeatureEditor.RequiresSection.newPluginButton = Add Plugin...
+FeatureEditor.RequiresSection.newFeatureButton = Add Feature...
+
+FeatureEditor.RequiresSection.newPlugin.title= New Required Plug-in
+FeatureEditor.RequiresSection.newPlugin.desc=Choose plug-ins that will be required by this feature.
+FeatureEditor.RequiresSection.newPlugin.adding= Adding References:
+FeatureEditor.RequiresSection.newPlugin.updating= Updating...
+
+FeatureEditor.RequiresSection.newFeature.title= New Required Feature
+FeatureEditor.RequiresSection.newFeature.desc=Choose features that will be required by this feature.
+FeatureEditor.RequiresSection.newFeature.label=Available Features:
+FeatureEditor.RequiresSection.newFeature.adding= Adding References:
+FeatureEditor.RequiresSection.newFeature.updating= Updating...
 
 FeatureEditor.URLSection.title = Feature URLs
 FeatureEditor.URLSection.desc = Define update and discovery URLs.