Bug 307148 -  [UI] [API] Wrapper bug for j2ee assembly page
diff --git a/plugins/org.eclipse.jst.common.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.common.ui/META-INF/MANIFEST.MF
index bd61bd6..b862143 100644
--- a/plugins/org.eclipse.jst.common.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jst.common.ui/META-INF/MANIFEST.MF
@@ -12,7 +12,9 @@
  org.eclipse.jdt.ui;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.wst.common.modulecore;bundle-version="[1.1.300,2.0.0)",
  org.eclipse.wst.common.modulecore.ui;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)"
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="1.1.400",
+ org.eclipse.wst.common.frameworks;bundle-version="1.2.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.eclipse.jst.common.ui.internal.assembly.wizard;x-internal:=true
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/Messages.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/Messages.java
index bc91218..aeb146e 100644
--- a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/Messages.java
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/Messages.java
@@ -21,6 +21,16 @@
 	public static String Browse;
 	public static String VariableReferenceTitle;
 	public static String VariableReferenceDescription;
+	public static String AddManifestEntryTaskWizardTitle;
+	public static String AddManifestEntryTaskWizardDesc;
+	public static String ParentProjects;
+	public static String CustomEntryButton;
+	public static String Add;
+	public static String Remove;
+	public static String MoveUp;
+	public static String MoveDown;
+	public static String ManifestEntryColumn;
+	public static String ManifestEntrySourceColumn;
 	
 	static {
 		// initialize resource bundle
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/AddManifestEntryTaskWizard.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/AddManifestEntryTaskWizard.java
new file mode 100644
index 0000000..22f2560
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/AddManifestEntryTaskWizard.java
@@ -0,0 +1,134 @@
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+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.jst.common.internal.modulecore.util.JavaModuleComponentUtility;
+import org.eclipse.jst.common.ui.internal.Messages;
+import org.eclipse.jst.common.ui.internal.assembly.wizard.ManifestModuleDependencyControl.ManifestLabelProvider;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.impl.TaskModel;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.TaskWizard;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+
+public class AddManifestEntryTaskWizard extends TaskWizard {
+	public static final String PARENT_PROJECT = "PARENT_PROJECT"; // data model key //$NON-NLS-1$
+	public static final String CHILD_PROJECT = "CHILD_PROJECT"; // data model key //$NON-NLS-1$
+	public static final String CURRENT_REFERENCES = "CURRENT_REFERENCES"; // data model key for return val //$NON-NLS-1$
+	public static final String RETURNED_REFERENCES = "RETURNED_REFERENCES"; // data model key for return val //$NON-NLS-1$
+	public AddManifestEntryTaskWizard() {
+		super(Messages.AddManifestEntryTaskWizardTitle, new ManifestRootFragment());
+	}
+	
+	public static class ManifestRootFragment extends WizardFragment {
+		private TableViewer viewer;
+		private Button addCustom;
+		private Text customEntryText;
+		private IProject parentProject, childProject;
+		private IVirtualReference[] selected;
+		private ShowPossibleManifestEntryContentProvider contentProvider;
+		public boolean hasComposite() {
+			return true;
+		}
+
+		public Composite createComposite(Composite parent, IWizardHandle handle) {
+			parentProject = (IProject)getTaskModel().getObject(PARENT_PROJECT);
+			childProject = (IProject)getTaskModel().getObject(CHILD_PROJECT);
+			handle.setDescription(NLS.bind(Messages.AddManifestEntryTaskWizardDesc, parentProject.getName()));
+			Composite root = new Composite(parent, SWT.NONE);
+			root.setLayout(new FormLayout());
+			customEntryText = new Text(root, SWT.BORDER);
+			addCustom = new Button(root, SWT.PUSH);
+			customEntryText.setLayoutData(ManifestModuleDependencyControl.createFormData(null, 0, 100, -5, 0, 5, addCustom, -5));
+			addCustom.setText(Messages.CustomEntryButton);
+			addCustom.setLayoutData(ManifestModuleDependencyControl.createFormData(null, 0, 100, -5, null, 0, 100, -5));
+			addCustom.addSelectionListener(new SelectionListener() {
+				public void widgetSelected(SelectionEvent e) {
+					addCustomPressed();
+				}
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+			});
+
+			viewer = ManifestModuleDependencyControl.createManifestReferenceTableViewer(root, SWT.MULTI);
+			viewer.getTable().setLayoutData(ManifestModuleDependencyControl.createFormData(0, 5, addCustom, 0, 0, 5, 100, -5));
+			contentProvider = new ShowPossibleManifestEntryContentProvider(parentProject, childProject, getTaskModel());
+			viewer.setContentProvider(contentProvider);
+			viewer.setLabelProvider(new ManifestLabelProvider());
+			viewer.setInput(ResourcesPlugin.getWorkspace());
+			viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					viewerSelectionChanged();
+				}
+			});
+			return root;
+		}
+		
+		private void addCustomPressed() {
+			IVirtualReference ref = ManifestModuleDependencyControl.createDummyReference(
+					customEntryText.getText(), parentProject, ComponentCore.createComponent(parentProject));
+			contentProvider.addPossibleReference(ref);
+			customEntryText.setText(""); //$NON-NLS-1$
+			viewer.refresh();
+		}
+		
+		private void viewerSelectionChanged() {
+			IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+			Object[] obj = sel.toArray();
+			IVirtualReference[] ret = new IVirtualReference[obj.length];
+			for( int i = 0; i < ret.length; i++ ) {
+				ret[i] = (IVirtualReference)obj[i];
+			}
+			selected = ret;
+		}
+		
+		// just return the selected refs
+		public void performFinish(IProgressMonitor monitor) throws CoreException {
+			getTaskModel().putObject(RETURNED_REFERENCES, selected);
+		}
+	}
+	
+	public static class ShowPossibleManifestEntryContentProvider extends ArrayContentProvider {
+		private IProject parent, child;
+		private TaskModel model;
+		private IVirtualReference[] possible;
+		public ShowPossibleManifestEntryContentProvider(IProject parent, IProject child, TaskModel taskModel) {
+			this.parent = parent;
+			this.child = child;
+			this.model = taskModel;
+		}
+		public Object[] getElements(Object inputElement) {
+			if( possible == null ) {
+				IVirtualReference[] current = (IVirtualReference[])model.getObject(CURRENT_REFERENCES);
+				possible = JavaModuleComponentUtility.findPossibleManifestEntries(parent, child, current);
+			}
+			return possible;
+		}
+		public void addPossibleReference(IVirtualReference ref) {
+			ArrayList<IVirtualReference> newRefs = new ArrayList<IVirtualReference>();
+			newRefs.addAll(Arrays.asList(possible));
+			newRefs.add(ref);
+			possible = newRefs.toArray(new IVirtualReference[newRefs.size()]);
+		}
+		
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ManifestModuleDependencyControl.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ManifestModuleDependencyControl.java
new file mode 100644
index 0000000..2512084
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ManifestModuleDependencyControl.java
@@ -0,0 +1,466 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.common.internal.modulecore.util.ArchiveManifest;
+import org.eclipse.jst.common.internal.modulecore.util.JavaModuleComponentUtility;
+import org.eclipse.jst.common.internal.modulecore.util.ManifestUtilities;
+import org.eclipse.jst.common.internal.modulecore.util.UpdateManifestDataModelProperties;
+import org.eclipse.jst.common.internal.modulecore.util.UpdateManifestDataModelProvider;
+import org.eclipse.jst.common.ui.internal.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.resources.AbstractResourceListVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.IVirtualComponentLabelProvider;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IModuleDependenciesControl;
+import org.eclipse.wst.common.componentcore.ui.propertypage.ModuleAssemblyRootPage;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class ManifestModuleDependencyControl implements
+		IModuleDependenciesControl {
+	
+	protected IProject project;
+	protected IVirtualComponent rootComponent;
+	protected IProject parentProject;
+	protected ModuleAssemblyRootPage propPage;
+	protected Button addButton, removeButton, moveUpButton, moveDownButton;
+	protected Combo parentSelection;
+	protected TableViewer manifestEntryViewer;
+	private ArrayList<IVirtualReference> list = new ArrayList<IVirtualReference>();
+	
+	public ManifestModuleDependencyControl(final IProject project,
+			final ModuleAssemblyRootPage page) {
+		this.project = project;
+		this.propPage = page;
+		rootComponent = ComponentCore.createComponent(project);
+	}
+
+	/*
+	 * Convenience method to quickly create form datas, 
+	 * referencing either pixel counts (via autoboxing) or controls.
+	 * If the object is null, no attachment will be created for that side
+	 */
+	public static FormData createFormData(Object top, int topDif, Object bottom, int bottomDif,
+						Object left, int leftDif, Object right, int rightDif) {
+		FormData fd = new FormData();
+		if( top instanceof Control ) fd.top = new FormAttachment((Control)top, topDif);
+		else if( top != null ) fd.top = new FormAttachment(((Integer)top).intValue(), topDif);
+		
+		if( bottom instanceof Control ) fd.bottom = new FormAttachment((Control)bottom, bottomDif);
+		else if( bottom != null ) fd.bottom = new FormAttachment(((Integer)bottom).intValue(), bottomDif);
+		
+		if( left instanceof Control ) fd.left = new FormAttachment((Control)left, leftDif);
+		else if( left != null ) fd.left = new FormAttachment(((Integer)left).intValue(), leftDif);
+		
+		if( right instanceof Control ) fd.right = new FormAttachment((Control)right, rightDif);
+		else if( right != null ) fd.right = new FormAttachment(((Integer)right).intValue(), rightDif);
+		
+		return fd;
+	}
+	
+	public Composite createContents(Composite parent) {
+		Composite root = new Composite(parent, SWT.NONE);
+		root.setLayout(new FormLayout());
+		Label l = new Label(root, SWT.NONE);
+		l.setText(Messages.ParentProjects);
+		l.setLayoutData(createFormData(0,10,null,0, 0, 5, null,0));
+		parentSelection = new Combo(root, SWT.READ_ONLY);
+		parentSelection.setLayoutData(createFormData(0,5,null,0,l,5,100,-5));
+		parentSelection.setItems(getPossibleParentProjects());
+		parentSelection.addModifyListener(new ModifyListener(){
+			public void modifyText(ModifyEvent e) {
+				refreshViewerFromNewParentProject();
+			}
+		});
+		manifestEntryViewer = createManifestReferenceTableViewer(root, SWT.SINGLE);
+		
+		addButton = new Button(root, SWT.PUSH);
+		removeButton = new Button(root, SWT.PUSH);
+		moveUpButton = new Button(root, SWT.PUSH);
+		moveDownButton = new Button(root, SWT.PUSH);
+		
+		addButton.setText(Messages.Add);
+		removeButton.setText(Messages.Remove);
+		moveUpButton.setText(Messages.MoveUp);
+		moveDownButton.setText(Messages.MoveDown);
+		removeButton.setEnabled(false);
+		moveUpButton.setEnabled(false);
+		moveDownButton.setEnabled(false);
+		
+		addButton.setLayoutData(createFormData(parentSelection,5,null,0,manifestEntryViewer.getTable(),5,100,-5));
+		removeButton.setLayoutData(createFormData(addButton,5,null,0,manifestEntryViewer.getTable(),5,100,-5));
+		moveUpButton.setLayoutData(createFormData(removeButton,5,null,0,manifestEntryViewer.getTable(),5,100,-5));
+		moveDownButton.setLayoutData(createFormData(moveUpButton,5,null,0,null,0,100,-5));
+		
+		addButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				addPressed();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		removeButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				removePressed();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		moveUpButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				moveUp();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		moveDownButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				moveDown();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		
+		manifestEntryViewer.getTable().setLayoutData(createFormData(
+				parentSelection, 5, 100, -5, 0, 5, moveDownButton, -5));
+		manifestEntryViewer.setLabelProvider(new ManifestLabelProvider());
+		manifestEntryViewer.setContentProvider(new ManifestContentProvider());
+		manifestEntryViewer.setInput(ResourcesPlugin.getWorkspace());
+		parentSelection.select(0);
+		
+		manifestEntryViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				viewerSelectionChanged();
+			}
+		});
+		return root;
+	}
+	
+	protected void viewerSelectionChanged() {
+		updateButtons();
+	}
+	
+	protected void updateButtons() {
+		int index = manifestEntryViewer.getTable().getSelectionIndex();
+		int size = manifestEntryViewer.getTable().getItems().length;
+		removeButton.setEnabled(index != -1);
+		moveUpButton.setEnabled(index != -1 && index != 0);
+		moveDownButton.setEnabled(index != size-1);
+	}
+	
+	protected void moveUp() {
+		int index = manifestEntryViewer.getTable().getSelectionIndex();
+		IVirtualReference ref = list.remove(index);
+		list.add(index-1,ref);
+		refreshViewer();
+		updateButtons();
+	}
+	protected void moveDown() {
+		int index = manifestEntryViewer.getTable().getSelectionIndex();
+		IVirtualReference ref = list.remove(index);
+		list.add(index+1,ref);
+		refreshViewer();
+		updateButtons();
+	}
+	
+	protected void addPressed() {
+		AddManifestEntryTaskWizard wizard = new AddManifestEntryTaskWizard();
+		wizard.getTaskModel().putObject(AddManifestEntryTaskWizard.CHILD_PROJECT, project);
+		wizard.getTaskModel().putObject(AddManifestEntryTaskWizard.PARENT_PROJECT, parentProject);
+		wizard.getTaskModel().putObject(AddManifestEntryTaskWizard.CURRENT_REFERENCES, list.toArray(new IVirtualReference[list.size()]));
+		WizardDialog wd = new WizardDialog(addButton.getShell(), wizard);
+		if( wd.open() != Window.CANCEL) {
+			IVirtualReference[] ret = (IVirtualReference[])wizard.getTaskModel().getObject(AddManifestEntryTaskWizard.RETURNED_REFERENCES);
+			list.addAll(Arrays.asList(ret));
+			refreshViewer();
+			updateButtons();
+		}
+	}
+
+	protected void removePressed() {
+		IStructuredSelection sel = (IStructuredSelection)manifestEntryViewer.getSelection();
+		Iterator i = sel.iterator();
+		while(i.hasNext()) {
+			list.remove(i.next());
+		}
+		refreshViewer();
+		updateButtons();
+	}
+	
+	public static class ManifestLabelProvider extends BaseLabelProvider implements ITableLabelProvider {
+		private IVirtualComponentLabelProvider[] delegates;
+		protected void getDelegates() {
+			if( delegates == null )
+				delegates = DependencyPageExtensionManager.loadDelegates();
+		}
+		public Image getColumnImage(Object element, int columnIndex) {
+			getDelegates();
+			if( columnIndex == 1 ) {
+				if( element instanceof IVirtualReference ) {
+					for( int i = 0; i < delegates.length; i++ )
+						if( delegates[i].canHandle(((IVirtualReference)element).getReferencedComponent()))
+							return delegates[i].getSourceImage(((IVirtualReference)element).getReferencedComponent());
+				}
+			}
+			return ModuleCoreUIPlugin.getInstance().getImage("jar_obj");
+		}
+		
+		public String getColumnText(Object element, int columnIndex) {
+			if( element instanceof IVirtualReference ) {
+				IVirtualReference ref = (IVirtualReference)element;
+				if( columnIndex == 0 ) 
+					return ref.getRuntimePath().append(ref.getArchiveName()).toString();
+				if( columnIndex == 1 )
+					return handleSourceText(ref.getReferencedComponent());
+			}
+			return null;
+		}
+		
+		private String handleSourceText(IVirtualComponent component) {
+			if( delegates == null )
+				delegates = DependencyPageExtensionManager.loadDelegates();
+			for( int i = 0; i < delegates.length; i++ )
+				if( delegates[i].canHandle(component))
+					return delegates[i].getSourceText(component);
+
+			// default impl
+			if( component.isBinary() ) {
+				IPath p = (IPath)component.getAdapter(IPath.class);
+				return p == null ? null : p.toString();
+			}
+			return component.getProject().getName();
+		}
+	}
+	
+	
+	private class ManifestContentProvider implements IStructuredContentProvider {
+		public void dispose() {
+		}
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+		public Object[] getElements(Object inputElement) {
+			return refsForCurrentProject == null ? new Object[]{} : refsForCurrentProject;
+		}
+	}
+	
+	public static TableViewer createManifestReferenceTableViewer(Composite parent, int style) {
+		int flags = SWT.BORDER | style;
+
+		Table table = new Table(parent, flags);
+		TableViewer viewer = new TableViewer(table);
+
+		// set up table layout
+		TableLayout tableLayout = new org.eclipse.jface.viewers.TableLayout();
+		tableLayout.addColumnData(new ColumnWeightData(200, true));
+		tableLayout.addColumnData(new ColumnWeightData(200, true));
+		table.setLayout(tableLayout);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(true);
+		
+		// table columns
+		TableColumn fileNameColumn = new TableColumn(table, SWT.NONE, 0);
+		fileNameColumn.setText(Messages.ManifestEntryColumn);
+		fileNameColumn.setResizable(true);
+
+		TableColumn projectColumn = new TableColumn(table, SWT.NONE, 1);
+		projectColumn.setText(Messages.ManifestEntrySourceColumn);
+		projectColumn.setResizable(true);
+		tableLayout.layout(table, true);
+		return viewer;
+	}
+
+	private IVirtualReference[] refsForCurrentProject;
+	protected void refreshViewerFromNewParentProject() {
+		String parentString = parentSelection.getText();
+		refsForCurrentProject = new IVirtualReference[]{};
+		if( parentString != null && !"".equals(parentString)) { //$NON-NLS-1$
+			parentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(parentString);
+			IVirtualReference[] current  = JavaModuleComponentUtility.findCurrentManifestEntries(parentProject, project);
+			refsForCurrentProject = addMissingDummyEntries(current);
+			for( int i = 0; i < refsForCurrentProject.length; i++ ) {
+				list.add(refsForCurrentProject[i]);
+			}
+		}
+		manifestEntryViewer.refresh();
+	}
+	
+	protected void refreshViewer() {
+		refsForCurrentProject = list.toArray(new IVirtualReference[list.size()]);
+		manifestEntryViewer.refresh();
+	}
+	
+	protected IVirtualReference[] addMissingDummyEntries(IVirtualReference[] current) {
+		IFile manifestFile = getManifestIFile(rootComponent);
+		if( manifestFile != null ) {
+			ArrayList<IVirtualReference> refs = new ArrayList<IVirtualReference>();
+			refs.addAll(Arrays.asList(current));
+			ArchiveManifest manifest = ManifestUtilities.getManifest(manifestFile);
+			String[] entries = manifest.getClassPathTokenized();
+			String[] unusedEntries = findUnusedEntries(current, entries);
+			for( int i = 0; i < unusedEntries.length; i++ ) {
+				refs.add(createDummyReference(unusedEntries[i]));
+			}
+			return refs.toArray(new IVirtualReference[refs.size()]);
+		}
+		return current;
+	}
+	
+	
+	public static class DummyVirtualComponent extends AbstractResourceListVirtualComponent {
+		private static final String DUMMY_FIRST_SEGMENT = "dummyVirtualComponent"; //$NON-NLS-1$
+		public DummyVirtualComponent(IProject p, IVirtualComponent referencingComponent) {
+			super(p, referencingComponent);
+		}
+
+		protected String getFirstIdSegment() {
+			return DUMMY_FIRST_SEGMENT;
+		}
+
+		protected IContainer[] getUnderlyingContainers() {
+			return new IContainer[]{};
+		}
+
+		protected IResource[] getLooseResources() {
+			return new IResource[]{};
+		}
+	}
+	
+	private IVirtualReference createDummyReference(String path) {
+		return createDummyReference(path, parentProject, ComponentCore.createComponent(parentProject));
+	}
+	
+	public static IVirtualReference createDummyReference(String path, IProject project, IVirtualComponent rootComponent) {
+		IVirtualComponent comp = new DummyVirtualComponent(project, rootComponent);
+		IVirtualReference ref = ComponentCore.createReference(rootComponent, comp);
+		IPath path2 = new Path(path);
+		IPath runtimePath = path2.segmentCount() > 1 ? path2.removeLastSegments(1) : new Path("/"); //$NON-NLS-1$
+		runtimePath = runtimePath.makeRelative();
+		ref.setRuntimePath(runtimePath);
+		ref.setArchiveName(path2.lastSegment());
+		return ref;
+	}
+	
+	private String[] findUnusedEntries(IVirtualReference[] current, String[] entries) {
+		ArrayList<String> list = new ArrayList<String>();
+		list.addAll(Arrays.asList(entries));
+		for( int i = 0; i < current.length; i++ ) {
+			String currentEntry = current[i].getRuntimePath().append(current[i].getArchiveName()).toString();
+			list.remove(currentEntry);
+		}
+		return list.toArray(new String[list.size()]);
+	}
+	
+	/**
+	 * Clients who find this unacceptable should override
+	 * @param root
+	 * @return
+	 */
+	public IFile getManifestIFile(IVirtualComponent root) {
+		IVirtualFolder rootFolder = root.getRootFolder();
+		IVirtualFile vf = rootFolder.getFile(new Path("META-INF/MANIFEST.MF"));
+		if( vf.exists() )
+			return vf.getUnderlyingFile();
+		return null;
+	}
+	
+	protected String[] getPossibleParentProjects() {
+		IProject[] projects = JavaModuleComponentUtility.findParentProjects(project);
+		String[] strings = new String[projects.length];
+		for( int i = 0; i < projects.length; i++ ) {
+			strings[i] = projects[i].getName();
+		}
+		return strings;
+	}
+
+
+	public boolean performOk() {
+		IDataModel updateManifestDataModel = DataModelFactory.createDataModel(new UpdateManifestDataModelProvider());
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, project.getName());
+		updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, getManifestIFile(rootComponent));
+		ArrayList<String> asStrings = new ArrayList<String>();
+		Iterator<IVirtualReference> i = list.iterator();
+		IVirtualReference tmp;
+		while(i.hasNext()) {
+			tmp = i.next();
+			asStrings.add(tmp.getRuntimePath().append(tmp.getArchiveName()).toString());
+		}
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, asStrings);
+		try {
+			updateManifestDataModel.getDefaultOperation().execute(new NullProgressMonitor(), null );
+		} catch (ExecutionException e) {
+			// TODO log J2EEUIPlugin.logError(e);
+		}
+
+		return true;
+	}
+
+	public void performDefaults() {
+	}
+
+	public boolean performCancel() {
+		return false;
+	}
+
+	public void setVisible(boolean visible) {
+	}
+
+	public void dispose() {
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/messages.properties b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/messages.properties
index 181f067..9bddf57 100644
--- a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/messages.properties
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/messages.properties
@@ -4,4 +4,14 @@
 ExternalJarDescription=Here you can reference a filesystem Jar\nThis is not a suggested use-case, but is here for backwards compatability.
 Browse=Browse...
 VariableReferenceTitle=Add a Variable Reference
-VariableReferenceDescription=Here you can reference a variable which maps to a single jar.\nThis is not a suggested use-case, but is here for backwards compatability.
\ No newline at end of file
+VariableReferenceDescription=Here you can reference a variable which maps to a single jar.\nThis is not a suggested use-case, but is here for backwards compatability.
+AddManifestEntryTaskWizardTitle=Add Manifest Entry
+AddManifestEntryTaskWizardDesc=To add manifest entries that should be accessible at runtime,\nselect one or more desired entries and press "Finish"
+ParentProjects=Parent Projects: 
+CustomEntryButton=Add Custom Entry
+Add=Add...
+Remove=Remove
+MoveUp=Move Up
+MoveDown=Move Down
+ManifestEntryColumn=Manifest Entry
+ManifestEntrySourceColumn=Source
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/plugin.xml b/plugins/org.eclipse.wst.common.modulecore.ui/plugin.xml
index 9713e02..a3664b1 100644
--- a/plugins/org.eclipse.wst.common.modulecore.ui/plugin.xml
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/plugin.xml
@@ -31,5 +31,11 @@
              id="org.eclipse.wst.common.componentcore.ui.newProjectReference"
              name="Project">
        </referenceFragment>
+       <referenceFragment
+             class="org.eclipse.wst.common.componentcore.ui.internal.propertypage.FolderMappingWizardFragment"
+             icon="icons/folder.gif"
+             id="org.eclipse.wst.common.componentcore.ui.resourceMappingReference"
+             name="Folder Mapping">
+       </referenceFragment>
     </extension>
 </plugin>
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Messages.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Messages.java
index 7ccc4f7..d6fce43 100644
--- a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Messages.java
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Messages.java
@@ -24,8 +24,8 @@
 	public static String AddFolder;
 	public static String AddFolderElipses;
 	public static String AddFolderMappings;
-	public static String AddReference;
-	public static String EditReference;
+	public static String AddEllipsis;
+	public static String EditEllipsis;
 	public static String RemoveSelected;
 	public static String JarTitle;
 	public static String JarDescription;
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/AddFolderDialog.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/AddFolderDialog.java
index 2c307b7..2c93a37 100644
--- a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/AddFolderDialog.java
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/AddFolderDialog.java
@@ -33,6 +33,7 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.wst.common.componentcore.ui.Messages;
 
+@Deprecated
 public class AddFolderDialog extends TitleAreaDialog {
 	private IProject project;
 	private TreeViewer viewer;
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/FolderMappingWizardFragment.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/FolderMappingWizardFragment.java
new file mode 100644
index 0000000..98b82da
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/FolderMappingWizardFragment.java
@@ -0,0 +1,155 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+import org.eclipse.wst.common.componentcore.ui.propertypage.AddModuleDependenciesPropertiesPage.ComponentResourceProxy;
+
+public class FolderMappingWizardFragment extends WizardFragment {
+	private IProject project;
+	private TreeViewer viewer;
+	private IContainer selected = null;
+
+	public boolean hasComposite() {
+		return true;
+	}
+
+	public Composite createComposite(Composite parent, IWizardHandle handle) {
+		handle.setTitle(Messages.AddFolder);
+		handle.setDescription(Messages.AddFolderMappings);
+		project = (IProject)getTaskModel().getObject(IReferenceWizardConstants.PROJECT);		
+		Composite c = new Composite(parent, SWT.NONE);
+		c.setLayout(new FillLayout());
+		this.viewer = new TreeViewer(c, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+		viewer.setContentProvider(getContentProvider());
+		viewer.setLabelProvider(getLabelProvider());
+		viewer.addFilter(getFilter());
+		viewer.setInput(project);
+		viewer.addSelectionChangedListener(getListener());
+		return c;
+	}
+	
+	protected ISelectionChangedListener getListener() {
+		return new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+				Object first = sel.getFirstElement();
+				if( first instanceof IContainer) 
+					selected = (IContainer)first;
+			}
+		};
+	}
+	
+	public IContainer getSelected() {
+		return selected;
+	}
+	
+	protected ViewerFilter getFilter() {
+		return new ViewerFilter() {
+			public boolean select(Viewer viewer, Object parentElement,
+					Object element) {
+				return element instanceof IContainer;
+			}
+		};
+	}
+	
+	protected ITreeContentProvider getContentProvider() {
+		return new ITreeContentProvider() {
+			
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+			
+			public void dispose() {
+			}
+			
+			public Object[] getElements(Object inputElement) {
+				try {
+					return project.members();
+				} catch( CoreException ce ) {
+					return new Object[]{};
+				}
+			}
+			
+			public boolean hasChildren(Object element) {
+				if( element instanceof IContainer) {
+					try {
+						return ((IContainer)element).members().length > 0;
+					} catch( CoreException ce ) {
+					}
+				}
+				return false;
+			}
+			
+			public Object getParent(Object element) {
+				if( element instanceof IResource)
+					return ((IResource)element).getParent();
+				return null;
+			}
+			
+			public Object[] getChildren(Object parentElement) {
+				if( parentElement instanceof IContainer) {
+					try {
+						return ((IContainer)parentElement).members();
+					} catch( CoreException ce ) {
+					}
+				}
+				return new Object[]{};
+			}
+		};
+	}
+
+	protected LabelProvider getLabelProvider() {
+		return new LabelProvider() {
+			public Image getImage(Object element) {
+				return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+			}
+			public String getText(Object element) {
+				if( element instanceof IResource)
+					return ((IResource)element).getName();
+				return element.toString();
+			}
+		};
+	}
+
+
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		IContainer c = getSelected();
+		if( c != null ) {
+			IPath p = c.getProjectRelativePath();
+			ComponentResourceProxy proxy = new ComponentResourceProxy(p, new Path("/")); //$NON-NLS-1$
+			getTaskModel().putObject(IReferenceWizardConstants.FOLDER_MAPPING, proxy);
+		}
+	}	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/messages.properties b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/messages.properties
index 0e71c6f..bc5397e 100644
--- a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/messages.properties
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/messages.properties
@@ -1,5 +1,5 @@
 ModuleAssemblyRootPageDescription=Create and change packaging structure for this project
-ModuleAssembly=Deployment Assembly
+ModuleAssembly=Deployment a&ssembly:
 ErrorCheckingFacets=Error Checking Project Facets
 ErrorNotVirtualComponent=The given project is not a virtual component project
 DeployPathColumn=Deploy Path
@@ -7,10 +7,10 @@
 InternalLibJarWarning=This library has been added to the project by using the project tree or the file system. If you want to move / remove it, use the same approach.
 AddFolder=Add Folder
 AddFolderElipses=Add Folder...
-AddFolderMappings=Add folder mappings
-AddReference=Add Reference...
-EditReference=Edit Reference...
-RemoveSelected=Remove selected
+AddFolderMappings=Add a folder mapping
+AddEllipsis=&Add...
+EditEllipsis=&Edit...
+RemoveSelected=&Remove
 ExternalJarTitle=Add an External Jar Reference
 ExternalJarDescription=Here you can reference a filesystem Jar\nThis is not a suggested use-case, but is here for backwards compatability.
 JarTitle=Add a Jar Reference
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/AddModuleDependenciesPropertiesPage.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/AddModuleDependenciesPropertiesPage.java
index 8b6790d..8505db7 100644
--- a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/AddModuleDependenciesPropertiesPage.java
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/AddModuleDependenciesPropertiesPage.java
@@ -18,7 +18,6 @@
 import java.util.Map;
 
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.IWorkspaceRunnable;
@@ -73,11 +72,11 @@
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
 import org.eclipse.wst.common.componentcore.ui.Messages;
 import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
-import org.eclipse.wst.common.componentcore.ui.internal.propertypage.AddFolderDialog;
 import org.eclipse.wst.common.componentcore.ui.internal.propertypage.ComponentDependencyContentProvider;
 import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager;
-import org.eclipse.wst.common.componentcore.ui.internal.propertypage.NewReferenceWizard;
 import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager.ReferenceExtension;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.NewReferenceWizard;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.TaskWizard;
 import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
@@ -181,10 +180,10 @@
 		Composite composite = new Composite(parent, SWT.NONE);
 		GridData gData = new GridData(GridData.FILL_BOTH);
 		composite.setLayoutData(gData);
-		fillComposite(composite);
+		fillTableComposite(composite);
 	}
 
-	public void fillComposite(Composite parent) {
+	public void fillTableComposite(Composite parent) {
 		GridLayout layout = new GridLayout();
 		layout.numColumns = 2;
 		layout.marginHeight = 0;
@@ -202,26 +201,9 @@
 	}
 
 	protected void createPushButtons() {
-		addMappingButton = createPushButton(getAddFolderLabel());
-		addReferenceButton = createPushButton(getAddReferenceLabel());
-		editReferenceButton = createPushButton(getEditReferenceLabel());
-		removeButton = createPushButton(getRemoveSelectedLabel());
-	}
-
-	protected String getRemoveSelectedLabel() {
-		return Messages.RemoveSelected;
-	}
-
-	protected String getEditReferenceLabel() {
-		return Messages.EditReference;
-	}
-
-	protected String getAddReferenceLabel() {
-		return Messages.AddReference;
-	}
-
-	protected String getAddFolderLabel() {
-		return Messages.AddFolderElipses;
+		addReferenceButton = createPushButton(Messages.AddEllipsis);
+		editReferenceButton = createPushButton(Messages.EditEllipsis);
+		removeButton = createPushButton(Messages.RemoveSelected);
 	}
 
 	protected Button createPushButton(String label) {
@@ -460,9 +442,10 @@
 	}
 
 	public void handleEvent(Event event) {
-		if( event.widget == addMappingButton) 
-			handleAddMappingButton();
-		else if( event.widget == addReferenceButton) 
+//		if( event.widget == addMappingButton) 
+//			handleAddMappingButton();
+//		else 
+		if( event.widget == addReferenceButton) 
 			handleAddReferenceButton();
 		else if( event.widget == editReferenceButton) 
 			handleEditReferenceButton();
@@ -470,18 +453,18 @@
 			handleRemoveSelectedButton();
 	}
 
-	protected void handleAddMappingButton() {
-		AddFolderDialog afd = new AddFolderDialog(addMappingButton.getShell(), project);
-		if( afd.open() == Window.OK) {
-			IContainer c = afd.getSelected();
-			if( c != null ) {
-				IPath p = c.getProjectRelativePath();
-				ComponentResourceProxy proxy = new ComponentResourceProxy(p, new Path("/")); //$NON-NLS-1$
-				resourceMappings.add(proxy);
-				refresh();
-			}
-		}
-	}
+//	protected void handleAddMappingButton() {
+//		AddFolderDialog afd = new AddFolderDialog(addMappingButton.getShell(), project);
+//		if( afd.open() == Window.OK) {
+//			IContainer c = afd.getSelected();
+//			if( c != null ) {
+//				IPath p = c.getProjectRelativePath();
+//				ComponentResourceProxy proxy = new ComponentResourceProxy(p, new Path("/")); //$NON-NLS-1$
+//				resourceMappings.add(proxy);
+//				refresh();
+//			}
+//		}
+//	}
 	
 	protected void handleAddReferenceButton() {
 		showReferenceWizard(false);
@@ -512,7 +495,7 @@
 				selected = (IVirtualComponent)o;
 				wizard.getTaskModel().putObject(IReferenceWizardConstants.COMPONENT, selected);
 				wizard.getTaskModel().putObject(IReferenceWizardConstants.COMPONENT_PATH, objectToRuntimePath.get(selected));
-			}
+			} 
 		}
 		
 		WizardDialog wd = new WizardDialog(addReferenceButton.getShell(), wizard);
@@ -523,27 +506,42 @@
 				consumedReferences.remove(selected);
 			}
 			
-			Object c1 = wizard.getTaskModel().getObject(IReferenceWizardConstants.COMPONENT);
-			Object p1 = wizard.getTaskModel().getObject(IReferenceWizardConstants.COMPONENT_PATH);
-			DependencyType type = (DependencyType)wizard.getTaskModel().getObject(IReferenceWizardConstants.DEPENDENCY_TYPE);
-			boolean consumed = type == null ? false : type.equals(DependencyType.CONSUMES_LITERAL);
-			
-			IVirtualComponent[] compArr = c1 instanceof IVirtualComponent ? 
-					new IVirtualComponent[] { (IVirtualComponent)c1 } : 
-						(IVirtualComponent[])c1;
-			String[] pathArr = p1 instanceof String ? 
-							new String[] { (String)p1 } : 
-								(String[])p1;
-			for( int i = 0; i < compArr.length; i++ ) {
-				objectToRuntimePath.put(compArr[i], 
-						getRuntimePath(compArr[i], pathArr[i]));
-				if( consumed ) 
-					consumedReferences.add(compArr[i]);
-			}
+			if( wizard.getTaskModel().getObject(IReferenceWizardConstants.FOLDER_MAPPING) != null )
+				handleAddFolderMapping(wizard);
+			else
+				handleAddNewReference(wizard);
 			refresh();
 		}
 	}
 	
+	protected void handleAddFolderMapping(TaskWizard wizard) {
+		Object o = wizard.getTaskModel().getObject(IReferenceWizardConstants.FOLDER_MAPPING);
+		if( o != null && o instanceof ComponentResourceProxy ) {
+			ComponentResourceProxy proxy = (ComponentResourceProxy)o;
+			resourceMappings.add(proxy);
+		}
+	}
+	
+	protected void handleAddNewReference(TaskWizard wizard) {
+		Object c1 = wizard.getTaskModel().getObject(IReferenceWizardConstants.COMPONENT);
+		Object p1 = wizard.getTaskModel().getObject(IReferenceWizardConstants.COMPONENT_PATH);
+		DependencyType type = (DependencyType)wizard.getTaskModel().getObject(IReferenceWizardConstants.DEPENDENCY_TYPE);
+		boolean consumed = type == null ? false : type.equals(DependencyType.CONSUMES_LITERAL);
+		
+		IVirtualComponent[] compArr = c1 instanceof IVirtualComponent ? 
+				new IVirtualComponent[] { (IVirtualComponent)c1 } : 
+					(IVirtualComponent[])c1;
+		String[] pathArr = p1 instanceof String ? 
+						new String[] { (String)p1 } : 
+							(String[])p1;
+		for( int i = 0; i < compArr.length; i++ ) {
+			objectToRuntimePath.put(compArr[i], 
+					getRuntimePath(compArr[i], pathArr[i]));
+			if( consumed ) 
+				consumedReferences.add(compArr[i]);
+		}
+	}
+	
 	/**
 	 * Subclasses are encouraged to override this method if 
 	 * they have some specific place (webinf/lib etc) where certain
@@ -564,11 +562,15 @@
 	protected void handleRemoveSelectedButton() {
 		ISelection sel = availableComponentsViewer.getSelection();
 		if( sel instanceof IStructuredSelection ) {
-			Object o = ((IStructuredSelection)sel).getFirstElement();
-			if( o instanceof IVirtualComponent)
-				objectToRuntimePath.remove(o);
-			else if( o instanceof ComponentResourceProxy) 
-				resourceMappings.remove(o);
+			IStructuredSelection sel2 = (IStructuredSelection)sel;
+			Object[] selectedStuff = sel2.toArray();
+			for( int i = 0; i < selectedStuff.length; i++) {
+				Object o = selectedStuff[i];
+				if( o instanceof IVirtualComponent)
+					objectToRuntimePath.remove(o);
+				else if( o instanceof ComponentResourceProxy) 
+					resourceMappings.remove(o);
+			}
 			refresh();
 		}
 	}
@@ -642,7 +644,7 @@
 
 	protected void initialize() {
 		Map<String, Object> options = new HashMap<String, Object>();
-		options.put(IVirtualComponent.IGNORE_DERIVED_REFERENCES, new Boolean(true));
+		options.put(IVirtualComponent.REQUESTED_REFERENCE_TYPE, IVirtualComponent.DISPLAYABLE_REFERENCES);
 		IVirtualReference[] refs = rootComponent.getReferences(options);
 		IVirtualComponent comp;
 		for( int i = 0; i < refs.length; i++ ) { 
@@ -685,7 +687,7 @@
 		return new ComponentResource[]{};
 	}
 	
-	public class ComponentResourceProxy {
+	public static class ComponentResourceProxy {
 		public IPath source, runtimePath;
 		public ComponentResourceProxy(IPath source, IPath runtimePath) {
 			this.source = source;
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IReferenceWizardConstants.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IReferenceWizardConstants.java
index 8efa7a6..2d03fc8 100644
--- a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IReferenceWizardConstants.java
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IReferenceWizardConstants.java
@@ -11,6 +11,11 @@
 package org.eclipse.wst.common.componentcore.ui.propertypage;
 
 public interface IReferenceWizardConstants {
+	/**
+	 * The key representing that this wizard can return a folder mapping
+	 * The value should be an instanceof ComponentResourceProxy
+	 */
+	public static final String FOLDER_MAPPING = "folder.mapping"; //$NON-NLS-1$
 	public static final String COMPONENT = "dependency.component"; //$NON-NLS-1$
 	public static final String COMPONENT_PATH = "dependency.component.path"; //$NON-NLS-1$
 	public static final String PROJECT = "root.project"; //$NON-NLS-1$
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/ModuleAssemblyRootPage.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/ModuleAssemblyRootPage.java
index 22f2ebc..3518bcd 100644
--- a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/ModuleAssemblyRootPage.java
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/ModuleAssemblyRootPage.java
@@ -175,4 +175,9 @@
 		}
 		return getFacetErrorComposite(parent);
 	}
+	
+    public void createControl(Composite parent){
+    	noDefaultAndApplyButton();
+    	super.createControl(parent);
+    }
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
index bc7a7a8..8c64a80 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
@@ -406,7 +406,6 @@
 	
 	public IVirtualReference[] getReferences() { 
 		HashMap<String, Object> map = new HashMap<String, Object>();
-		map.put(IVirtualComponent.IGNORE_DERIVED_REFERENCES, new Boolean(false));
 		return getReferences(map);
 	}
 
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
index 82836f1..6150ada 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
@@ -359,4 +359,5 @@
 			uri = reference.getRuntimePath() + "/" + reference.getReferencedComponent().getProject().getName() + extension; //$NON-NLS-1$
 		}
 		return uri;
-	}}
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
index 3bc2c18..ed87e24 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
@@ -38,17 +38,13 @@
 	public static final int BINARY = 0x1;
 	
 	/**
-	 * An option key to ignore derived references. 
-	 * The default is false
+	 * The key for the property of which reference types we're requesting
 	 */
-	public static final String IGNORE_DERIVED_REFERENCES = "IGNORE_DERIVED_REFERENCES";
-
-	/**
-	 * An option key to display all references which are 
-	 * displayable or editable in the UI
-	 */
+	public static final String REQUESTED_REFERENCE_TYPE = "REQUESTED_REFERENCE_TYPE";
+	public static final String HARD_REFERENCES = "HARD_REFERENCES";
+	public static final String NON_DERIVED_REFERENCES = "NON_DERIVED_REFERENCES";
 	public static final String DISPLAYABLE_REFERENCES = "DISPLAYABLE_REFERENCES";
-	
+		
 	/**
 	 * The name of the component must be unique within its enclosing project.
 	 *