diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.xml b/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.xml
index 42ce826..a242646 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.xml
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/plugin.xml
@@ -289,6 +289,13 @@
                category="element"
                afterTab="properties.tab.RoleDescriptor.WorkProduct"
                id="properties.tab.RoleDescriptor.Team"/>
+                           
+         <!-- Milestone -->
+         <propertyTab
+               label="%_UI_Properties_WorkProducts"
+               category="element"
+               afterTab="properties.tab.BreakdownElement.Guidance"
+               id="properties.tab.Milestone.WorkProduct"/>
          
          <!-- TEAM PROFILE -->
          <propertyTab
@@ -468,6 +475,14 @@
             <input type="org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider"/>
          </propertySection> 
       
+        <!-- Sections for Milestone -->
+         <propertySection
+               tab="properties.tab.Milestone.WorkProduct"
+               class="org.eclipse.epf.authoring.ui.properties.MilestoneWorkProductSection"
+               id="properties.section.Milestone.WorkProduct">
+            <input type="org.eclipse.epf.uma.Milestone"/>
+            <input type="org.eclipse.epf.library.edit.process.MilestoneWrapperItemProvider"/>
+         </propertySection> 
 
          <!-- Section for TeamProfile -->
          <propertySection
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/AbstractSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/AbstractSection.java
index ff67e11..8da2cd6 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/AbstractSection.java
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/AbstractSection.java
@@ -53,7 +53,7 @@
 public class AbstractSection extends AbstractPropertySection implements
 		PropertyChangeListener {
 
-	private BreakdownElement element;
+	protected BreakdownElement element;
 
 	protected boolean editable = false;
 
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/MilestoneWorkProductSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/MilestoneWorkProductSection.java
new file mode 100644
index 0000000..8b85008
--- /dev/null
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/MilestoneWorkProductSection.java
@@ -0,0 +1,239 @@
+//------------------------------------------------------------------------------
+// Copyright (c) 2005, 2008 IBM Corporation and others.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// Contributors:
+// IBM Corporation - initial implementation
+//------------------------------------------------------------------------------
+package org.eclipse.epf.authoring.ui.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.epf.authoring.ui.filters.DescriptorProcessFilter;
+import org.eclipse.epf.authoring.ui.filters.ProcessWorkProductFilter;
+import org.eclipse.epf.library.edit.IFilter;
+import org.eclipse.epf.library.edit.TngAdapterFactory;
+import org.eclipse.epf.library.edit.command.IActionManager;
+import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
+import org.eclipse.epf.library.edit.process.command.AssignWPToMilestone;
+import org.eclipse.epf.library.edit.process.command.IActionTypeConstants;
+import org.eclipse.epf.library.edit.util.ProcessUtil;
+import org.eclipse.epf.uma.Activity;
+import org.eclipse.epf.uma.Milestone;
+import org.eclipse.epf.uma.Process;
+import org.eclipse.epf.uma.UmaPackage;
+import org.eclipse.epf.uma.WorkProductDescriptor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+
+
+/**
+ * Milestone - work product section
+ * 
+ * @author Shilpa Toraskar
+ * @since 1.5
+ * 
+ */
+public class MilestoneWorkProductSection extends RelationSection {
+	private IFilter filter = null;
+
+	private Milestone milestone;
+	/**
+	 * Get process work product filter
+	 */
+	public IFilter getFilter() {
+		if (filter == null) {
+			filter = new ProcessWorkProductFilter(getConfiguration(),
+					null, FilterConstants.WORKPRODUCTS);
+		}
+		return filter;
+	}
+
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
+	 */
+	public void createControls(Composite parent,
+			TabbedPropertySheetPage tabbedPropertySheetPage) {
+
+		super.createControls(parent, tabbedPropertySheetPage);
+	}
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#initContentProvider1()
+	 */
+	protected void initContentProvider1() {
+		contentProvider = new AdapterFactoryContentProvider(getAdapterFactory()) {
+			public Object[] getElements(Object object) {
+				
+				return getFilteredList(
+						((Milestone) milestone).getRequiredResults())
+						.toArray();
+			}
+		};
+		tableViewer1.setContentProvider(contentProvider);
+	}
+
+	
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#init()
+	 */
+	protected void init() {
+		if (getElement() instanceof Milestone) {
+			milestone = (Milestone) getElement();
+		}
+		super.init();
+
+		labelProvider = new AdapterFactoryLabelProvider(
+				TngAdapterFactory.INSTANCE.getWBS_ComposedAdapterFactory());
+
+		int numOfTables = 1;
+		
+		setTabData(PropertiesResources.RoleDescriptor_WorkProducts_SectionTitle,
+				PropertiesResources.Milestone_WorkProducts_SectionDescription,
+				PropertiesResources.Milestone_WorkProducts_Table1,
+				null,
+				null,
+				null,
+				FilterConstants.WORKPRODUCTS); 
+
+		boolean[] changesAllowed = { true };
+		setTableData(numOfTables, changesAllowed);
+	}
+
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#refresh()
+	 */
+	public void refresh() {
+		if (getElement() instanceof Milestone) {
+			milestone = (Milestone) getElement();
+		}
+		super.refresh();
+	}
+
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorsFromProcess()
+	 */
+	protected List getDescriptorsFromProcess() {
+		List items = new ArrayList();
+		return ProcessUtil.getElementsInScope(getAdapterFactory(), milestone,
+				WorkProductDescriptor.class, items);
+	}
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addItems1(java.util.List)
+	 */
+	protected void addItems1(List items) {
+		if (!items.isEmpty()) {
+			AssignWPToMilestone cmd = new AssignWPToMilestone(
+					(Milestone) element, items,
+					IActionTypeConstants.ADD_REQUIRED_RESULT, getConfiguration());
+			actionMgr.execute(cmd);
+		}
+	};
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#removeItems1(java.util.List)
+	 */
+	protected void removeItems1(List items) {
+		if (!items.isEmpty()) {
+			actionMgr.doAction(IActionManager.REMOVE_MANY, milestone,
+					UmaPackage.eINSTANCE.getMilestone_RequiredResults(),
+					items, -1);
+			
+		}
+	};
+
+	private List getWorkProducts(List items) {
+		List wpList = new ArrayList();
+		if (!items.isEmpty()) {
+			for (int i = 0; i < items.size(); i++) {
+				wpList.add(((WorkProductDescriptor) items.get(i))
+						.getWorkProduct());
+			}
+		}
+
+		return wpList;
+	}
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getExistingElements1()
+	 */
+	protected List getExistingElements1() {
+		return getWorkProducts(((Milestone) milestone).getRequiredResults());
+	};
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getProcess()
+	 */
+	protected Process getProcess() {
+		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
+				.getOBS_ComposedAdapterFactory();
+		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
+				milestone, ITreeItemContentProvider.class);
+		Object obj = ProcessUtil.getRootProcess(aFactory, adapter, milestone);
+		return (Process) obj;
+	}
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getFilterForDescriptors()
+	 */
+	protected IFilter getFilterForDescriptors() {
+		return new DescriptorProcessFilter(getConfiguration()) {
+			protected boolean childAccept(Object obj) {
+				if (obj instanceof Activity) {
+					List list = new ArrayList();
+					getActivitiesInScope(TngAdapterFactory.INSTANCE
+							.getWBS_ComposedAdapterFactory(), milestone, list);
+					if (list.contains(obj))
+						return true;
+					else
+						return false;
+				}
+				// Uncomment to show extended activity's workproducts
+				// if(obj instanceof WorkProductDescriptorWrapperItemProvider){
+				// Object object =
+				// ((BreakdownElementWrapperItemProvider)obj).getParent(obj);
+				// List list = new ArrayList();
+				// getActivitiesInScope(
+				// TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory(),
+				// element, list);
+				// if(list.contains(object)) return true;
+				// }
+				if (obj instanceof WorkProductDescriptor)
+					return true;
+				return false;
+			}
+		};
+	}
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#getDescriptorTabName()
+	 */
+	protected String getDescriptorTabName() {
+		return FilterConstants.WORK_PRODUCT_DESCRIPTORS;
+	}
+
+	/**
+	 * @see org.eclipse.epf.authoring.ui.properties.RelationSection#addFromProcessItems1(java.util.List)
+	 */
+	protected void addFromProcessItems1(List items) {
+		if (!items.isEmpty()) {
+			actionMgr.doAction(IActionManager.ADD_MANY, milestone,
+					UmaPackage.eINSTANCE.getMilestone_RequiredResults(),
+					items, -1);
+		}
+	}
+}
\ No newline at end of file
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesResources.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesResources.java
index 1b82ddf..d749417 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesResources.java
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/PropertiesResources.java
@@ -155,6 +155,8 @@
 	public static String TeamProfile_Role_SectionTitle;
 	public static String TeamProfile_Role_SectionDescription;
 	public static String TeamProfile_Role_Table1;
+	public static String Milestone_WorkProducts_SectionDescription;
+	public static String Milestone_WorkProducts_Table1;
 	public static String Process_RichText_CollapseImage;
 	public static String Process_RichText_ExpandImage;
 	public static String Process_Add;
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RelationSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RelationSection.java
index d749eae..671bd49 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RelationSection.java
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RelationSection.java
@@ -17,7 +17,8 @@
 import org.eclipse.epf.library.edit.IFilter;
 import org.eclipse.epf.library.edit.command.IActionManager;
 import org.eclipse.epf.library.edit.util.ProcessUtil;
-import org.eclipse.epf.uma.Descriptor;
+import org.eclipse.epf.uma.BreakdownElement;
+//import org.eclipse.epf.uma.Descriptor;
 import org.eclipse.epf.uma.MethodElement;
 import org.eclipse.epf.uma.Process;
 import org.eclipse.jface.viewers.ILabelProvider;
@@ -55,7 +56,7 @@
 	protected IStructuredContentProvider contentProvider = null;
 
 	// element
-	protected Descriptor element;
+	protected BreakdownElement element;
 
 	// action manager
 	protected IActionManager actionMgr;
@@ -142,7 +143,7 @@
 
 	protected void init() {
 		// get descriptor object
-		element = (Descriptor) getElement();
+		element = (BreakdownElement) getElement();
 
 		// get toolkit
 		toolkit = getWidgetFactory();
@@ -157,8 +158,8 @@
 	 */
 	public void refresh() {
 		try {
-			if (getElement() instanceof Descriptor) {
-				element = (Descriptor) getElement();
+			if (getElement() instanceof BreakdownElement) {
+				element = (BreakdownElement) getElement();
 
 				initContentProvider1();
 				initContentProvider2();
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/Resources.properties b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/Resources.properties
index adb08ca..ab75b2a 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/Resources.properties
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/Resources.properties
@@ -166,6 +166,9 @@
 TeamProfile_Role_SectionDescription=Add or remove roles to/from the team profile.
 TeamProfile_Role_Table1=Roles:
 
+Milestone_WorkProducts_SectionDescription=Specify work product descriptors representing required results of this milestone.
+Milestone_WorkProducts_Table1=Required Results:
+	
 Process_RichText_CollapseImage=collapsed.gif
 Process_RichText_ExpandImage=expanded.gif
 Process_Add=Add...
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorWorkProductSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorWorkProductSection.java
index 415fea5..cd5e844 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorWorkProductSection.java
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/RoleDescriptorWorkProductSection.java
@@ -28,6 +28,7 @@
 import org.eclipse.epf.library.edit.process.command.IActionTypeConstants;
 import org.eclipse.epf.library.edit.util.ProcessUtil;
 import org.eclipse.epf.uma.Activity;
+import org.eclipse.epf.uma.Descriptor;
 import org.eclipse.epf.uma.Process;
 import org.eclipse.epf.uma.RoleDescriptor;
 import org.eclipse.epf.uma.UmaPackage;
@@ -155,7 +156,7 @@
 	 */
 	protected void removeItems1(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor) element,
 					items, UmaPackage.ROLE_DESCRIPTOR__RESPONSIBLE_FOR);
 			actionMgr.execute(cmd);
 		}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorRoleSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorRoleSection.java
index 1f3d418..7f2507e 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorRoleSection.java
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorRoleSection.java
@@ -28,6 +28,7 @@
 import org.eclipse.epf.library.edit.process.command.IActionTypeConstants;
 import org.eclipse.epf.library.edit.util.ProcessUtil;
 import org.eclipse.epf.uma.Activity;
+import org.eclipse.epf.uma.Descriptor;
 import org.eclipse.epf.uma.Process;
 import org.eclipse.epf.uma.Role;
 import org.eclipse.epf.uma.RoleDescriptor;
@@ -304,7 +305,7 @@
 	 */
 	protected void removeItems1(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor)element,
 					items, UmaPackage.TASK_DESCRIPTOR__PERFORMED_PRIMARILY_BY);
 			actionMgr.execute(cmd);
 		}
@@ -315,7 +316,7 @@
 	 */
 	protected void removeItems2(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor)element,
 					items,
 					UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY);
 			actionMgr.execute(cmd);
@@ -327,7 +328,7 @@
 	 */
 	protected void removeItems3(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor)element,
 					items, UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY);
 			actionMgr.execute(cmd);
 		}
diff --git a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorWorkProductSection.java b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorWorkProductSection.java
index c8c1b1c..0cb6517 100644
--- a/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorWorkProductSection.java
+++ b/1.5/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/TaskDescriptorWorkProductSection.java
@@ -28,6 +28,7 @@
 import org.eclipse.epf.library.edit.process.command.IActionTypeConstants;
 import org.eclipse.epf.library.edit.util.ProcessUtil;
 import org.eclipse.epf.uma.Activity;
+import org.eclipse.epf.uma.Descriptor;
 import org.eclipse.epf.uma.Process;
 import org.eclipse.epf.uma.TaskDescriptor;
 import org.eclipse.epf.uma.UmaPackage;
@@ -284,7 +285,7 @@
 	 */
 	protected void removeItems1(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor)element,
 					items, UmaPackage.TASK_DESCRIPTOR__MANDATORY_INPUT);
 			actionMgr.execute(cmd);
 		}
@@ -295,7 +296,7 @@
 	 */
 	protected void removeItems2(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor)element,
 					items, UmaPackage.TASK_DESCRIPTOR__OPTIONAL_INPUT);
 			actionMgr.execute(cmd);
 		}
@@ -306,7 +307,7 @@
 	 */
 	protected void removeItems3(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor)element,
 					items, UmaPackage.TASK_DESCRIPTOR__EXTERNAL_INPUT);
 			actionMgr.execute(cmd);
 		}
@@ -317,7 +318,7 @@
 	 */
 	protected void removeItems4(List items) {
 		if (!items.isEmpty()) {
-			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand(element,
+			RemoveDescriptorCommand cmd = new RemoveDescriptorCommand((Descriptor)element,
 					items, UmaPackage.TASK_DESCRIPTOR__OUTPUT);
 			actionMgr.execute(cmd);
 		}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToMilestone.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToMilestone.java
new file mode 100644
index 0000000..2bfb268
--- /dev/null
+++ b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/AssignWPToMilestone.java
@@ -0,0 +1,198 @@
+//------------------------------------------------------------------------------
+// Copyright (c) 2005, 2008 IBM Corporation and others.
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// which accompanies this distribution, and is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// Contributors:
+// IBM Corporation - initial implementation
+//------------------------------------------------------------------------------
+package org.eclipse.epf.library.edit.process.command;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.epf.library.edit.TngAdapterFactory;
+import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
+import org.eclipse.epf.library.edit.util.ProcessUtil;
+import org.eclipse.epf.library.edit.util.TngUtil;
+import org.eclipse.epf.uma.Activity;
+import org.eclipse.epf.uma.MethodConfiguration;
+import org.eclipse.epf.uma.Milestone;
+import org.eclipse.epf.uma.WorkProduct;
+import org.eclipse.epf.uma.WorkProductDescriptor;
+
+/**
+ * Command to assign work products to milestone. It will set required result
+ * feaute
+ * 
+ * @author Shilpa Toraskar
+ * @since 1.5
+ */
+public class AssignWPToMilestone extends AddMethodElementCommand {
+
+	private List workProducts;
+
+	private Activity activity;
+
+	private Milestone milestone;
+
+	private Collection modifiedResources;
+
+	private HashMap map = new HashMap();
+
+	private int action;
+
+	List existingWPDescList = new ArrayList();
+
+	List newWPDescList = new ArrayList();
+
+	private MethodConfiguration config;
+
+	/**
+	 * 
+	 */
+	public AssignWPToMilestone(Milestone milestone, List workProducts,
+			int action, MethodConfiguration config) {
+
+		super(TngUtil.getOwningProcess(milestone));
+
+		this.workProducts = workProducts;
+		this.milestone = milestone;
+		this.action = action;
+		this.config = config;
+
+		AdapterFactory aFactory = TngAdapterFactory.INSTANCE
+				.getWBS_ComposedAdapterFactory();
+		ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
+				milestone, ITreeItemContentProvider.class);
+		Object parent = adapter.getParent(milestone);
+		if (parent instanceof Activity) {
+			this.activity = (Activity) parent;
+		}
+		this.modifiedResources = new HashSet();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.common.command.Command#execute()
+	 */
+	public void execute() {
+		// add to default configuration if not there already
+		if (!super.addToDefaultConfiguration(workProducts))
+			return;
+
+		for (Iterator it = workProducts.iterator(); it.hasNext();) {
+			WorkProduct wp = (WorkProduct) it.next();
+			WorkProductDescriptor newWpDesc = null;
+
+			boolean isNewDescriptor = false;
+			// check for local descriptor
+			newWpDesc = (WorkProductDescriptor) ProcessCommandUtil
+					.getDescriptor(wp, activity, config);
+			if (newWpDesc == null) {
+				// check for inherited descriptor
+				newWpDesc = (WorkProductDescriptor) ProcessCommandUtil
+						.getInheritedDescriptor(wp, activity, config);
+				if (newWpDesc == null) {
+					newWpDesc = ProcessUtil.createWorkProductDescriptor(wp);
+					isNewDescriptor = true;
+
+				}
+			}
+			if (isNewDescriptor)
+				newWPDescList.add(newWpDesc);
+			else
+				existingWPDescList.add(newWpDesc);
+
+			// get deliverable
+			WorkProductDescriptor deliverable = UserInteractionHelper
+					.getDeliverable(activity, wp);
+			if (deliverable != null) {
+				map.put(newWpDesc, deliverable);
+			}
+		}
+
+		redo();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.common.command.Command#redo()
+	 */
+	public void redo() {
+
+		if (action == IActionTypeConstants.ADD_REQUIRED_RESULT) {
+			milestone.getRequiredResults().addAll(existingWPDescList);
+			milestone.getRequiredResults().addAll(newWPDescList);
+		}
+
+		activity.getBreakdownElements().addAll(newWPDescList);
+
+		if (map != null) {
+			Set keyset = map.keySet();
+			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
+				Object key = itor.next();
+				WorkProductDescriptor wpDesc = (WorkProductDescriptor) map
+						.get(key);
+
+				// add to deliverable
+				wpDesc.getDeliverableParts().add((WorkProductDescriptor) key);
+			}
+		}
+
+	}
+
+	public void undo() {
+
+		// remove from configuration if anything was added
+		super.undo();
+
+		if (action == IActionTypeConstants.ADD_REQUIRED_RESULT) {
+			milestone.getRequiredResults().removeAll(existingWPDescList);
+			milestone.getRequiredResults().removeAll(newWPDescList);
+		}
+
+		activity.getBreakdownElements().removeAll(newWPDescList);
+
+		if (map != null) {
+			Set keyset = map.keySet();
+			for (Iterator itor = keyset.iterator(); itor.hasNext();) {
+				Object key = itor.next();
+				WorkProductDescriptor wpDesc = (WorkProductDescriptor) map
+						.get(key);
+
+				// remove it from deliverable
+				wpDesc.getDeliverableParts()
+						.remove((WorkProductDescriptor) key);
+			}
+		}
+	}
+
+	protected boolean prepare() {
+		return true;
+	}
+
+	public Collection getModifiedResources() {
+		if (workProducts != null && !workProducts.isEmpty()) {
+			if (activity.eResource() != null) {
+				modifiedResources.add(activity.eResource());
+			}
+			if (milestone.eResource() != null) {
+				modifiedResources.add(milestone.eResource());
+			}
+		}
+		return modifiedResources;
+	}
+}
diff --git a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/IActionTypeConstants.java b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/IActionTypeConstants.java
index de58a1c..ccfabe6 100644
--- a/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/IActionTypeConstants.java
+++ b/1.5/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/IActionTypeConstants.java
@@ -27,4 +27,6 @@
 	public static final int ADD_OUTPUT = 6;
 
 	public static final int ADD_RESPONSIBLE_FOR = 7;
+	
+	public static final int ADD_REQUIRED_RESULT = 8;
 }
