This commit was manufactured by cvs2svn to create tag 'R1_0_M4_N20060707'.
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
index 6204646..b9f0518 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
@@ -15,7 +15,6 @@
 public final class AuthoringUIResources extends NLS {
 
 	private static final String BUNDLE_NAME = "org.eclipse.epf.authoring.ui.Resources";//$NON-NLS-1$
-
 	private AuthoringUIResources() {
 		// Do not instantiate
 	}
@@ -967,6 +966,9 @@
 	public static String AuthoringUI_roadmap_iconSection_desc;
 	public static String AuthoringUI_supportingmaterial_iconSection_desc;
 	
+	public static String activity_variability_error_title;
+	public static String activity_variability_error_msg;
+	
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, AuthoringUIResources.class);
 	}
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
index f427ed0..16f3afa 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
@@ -1143,6 +1143,8 @@
 AuthoringUI_editor_error_save_outofsync_title=Update conflict
 AuthoringUI_editor_error_save_outofsync_message=The file has been changed on the file system. Do you want to overwrite the changes?
 
+activity_variability_error_title=Activity Variability
+activity_variability_error_msg=Activity ''{0}'' cannot set variability with ''{1}'' since ''{1}'' already has one or more contributed/replaced activities as its children.
 ################################################################################
 # THE FOLLOWING PROPERTIES SHOULD NOT BE TRANSLATED!!!
 ################################################################################
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewDeleteAction.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewDeleteAction.java
index bf3949c..77a2e92 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewDeleteAction.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/LibraryViewDeleteAction.java
@@ -39,7 +39,6 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -146,7 +145,7 @@
 							.displayWarning(
 									AuthoringUIResources.AuthoringUI_deleteDialog_title, //$NON-NLS-1$
 									AuthoringUIResources.AuthoringUI_deleteConfigError_msg, //$NON-NLS-1$
-									NLS.bind("AuthoringUI.deleteConfigError.reason", processName)); //$NON-NLS-1$
+									AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_deleteConfigError_reason, processName)); //$NON-NLS-1$
 					return;
 				}
 
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodElementDeleteAction.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodElementDeleteAction.java
index e67895f..c161657 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodElementDeleteAction.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/MethodElementDeleteAction.java
@@ -26,7 +26,6 @@
 import org.eclipse.epf.library.edit.util.TngUtil;
 import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
 import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -135,7 +134,7 @@
 		}
 
 		Object[] args = { elementStr.toString() };
-		String msg = NLS.bind("AuthoringUI.confirmDeleteDialog.msg", args); // NON-NLS-1$
+		String msg = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_confirmDeleteDialog_msg, args); // NON-NLS-1$
 
 		String title = AuthoringUIResources.AuthoringUI_confirmDeleteDialog_title; //$NON-NLS-1$
 		boolean deleteOk = AuthoringUIPlugin.getDefault().getMsgDialog()
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewLibrary.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewLibrary.java
index 840e026..2bbb447 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewLibrary.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/NewLibrary.java
@@ -107,14 +107,14 @@
 				if (re.getStatus() != null && re.getStatus().getCode() == 77) {
 					String title = AuthoringUIResources.AuthoringUI_errorDialog_title; //$NON-NLS-1$
 					String error = AuthoringUIResources.AuthoringUI_errorDialog_error; //$NON-NLS-1$
-					String message = NLS.bind("AuthoringUI.errorDialog.message", error); //$NON-NLS-1$
+					String message = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_errorDialog_message, error); //$NON-NLS-1$
 					AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
 							title, message);
 				}
 			} else {
 				e.printStackTrace();
 				String title = AuthoringUIResources.AuthoringUI_errorDialog_title; //$NON-NLS-1$
-				String message = NLS.bind("AuthoringUI.errorDialog.message", e.toString()); //$NON-NLS-1$
+				String message = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_errorDialog_message, e.toString()); //$NON-NLS-1$
 				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
 						title, message);
 			}
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ProcessAutoSynchronizeAction.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ProcessAutoSynchronizeAction.java
index 559fe68..0c173c3 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ProcessAutoSynchronizeAction.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/ProcessAutoSynchronizeAction.java
@@ -58,8 +58,7 @@
 	 * @param domain
 	 */
 	public ProcessAutoSynchronizeAction() {
-		super(null, LibraryEditResources
-				.getString("LibraryEdit.AutoSynchronizeCommand.label")); //$NON-NLS-1$
+		super(null, LibraryEditResources.AutoSynchronizeCommand_label); //$NON-NLS-1$
 	}
 
 	public ProcessAutoSynchronizeAction(String labelText) {
@@ -176,8 +175,7 @@
 				canRun = ((SynchronizeCommand) command).initilize();
 			}
 		};
-		UserInteractionHelper.runWithProgress(runnable, LibraryEditResources
-				.getString("LibraryEdit.ProcessAutoSynchronizeAction.prepare")); //$NON-NLS-1$
+		UserInteractionHelper.runWithProgress(runnable, LibraryEditResources.ProcessAutoSynchronizeAction_prepare); //$NON-NLS-1$
 
 		if (canRun) {
 			super.run();
@@ -192,8 +190,7 @@
 					.getMsgDialog()
 					.displayInfo(
 							getText(),
-							LibraryEditResources
-									.getString("LibraryEdit.ProcessAutoSynchronizeAction.noDescriptorToSynch")); //$NON-NLS-1$
+							LibraryEditResources.ProcessAutoSynchronizeAction_noDescriptorToSynch); //$NON-NLS-1$
 		}
 	}
 
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SynchronizationAction.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SynchronizationAction.java
index 2a9bd67..045158c 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SynchronizationAction.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/actions/SynchronizationAction.java
@@ -29,7 +29,7 @@
 	private Process selectedProcess;
 	
 	public SynchronizationAction() {
-		super(LibraryEditResources.getString("LibraryEdit.ManualSynchronizeCommand.label")); //$NON-NLS-1$
+		super(LibraryEditResources.ManualSynchronizeCommand_label); 
 	}
 	
 	public void setProcess(Process aProcess) {
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/VariabilitySelection.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/VariabilitySelection.java
index adf989f..47842fc 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/VariabilitySelection.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/VariabilitySelection.java
@@ -42,8 +42,6 @@
 import org.eclipse.epf.uma.VariabilityElement;
 import org.eclipse.epf.uma.util.AssociationHelper;
 import org.eclipse.epf.uma.util.UmaUtil;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.PlatformUI;
 
 
@@ -210,7 +208,7 @@
 							.getPresentationName();
 			}
 			dlg
-					.setViewerLabel(NLS.bind("AuthoringUI.VariabilitySelection.filterdialog.viewerLabel", (new String[] { elementName })));
+					.setViewerLabel(AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_VariabilitySelection_filterdialog_viewerLabel, (new String[] { elementName })));
 
 			String title = MessageFormat
 					.format(
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditor.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditor.java
index ffed2c6..7f41b1c 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditor.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/editors/ProcessEditor.java
@@ -92,6 +92,7 @@
 import org.eclipse.epf.library.LibraryService;
 import org.eclipse.epf.library.configuration.ProcessAuthoringConfigurator;
 import org.eclipse.epf.library.edit.IFilter;
+import org.eclipse.epf.library.edit.LibraryEditResources;
 import org.eclipse.epf.library.edit.TngAdapterFactory;
 import org.eclipse.epf.library.edit.command.CommandStackChangedEvent;
 import org.eclipse.epf.library.edit.command.IActionManager;
@@ -101,8 +102,10 @@
 import org.eclipse.epf.library.edit.process.IBSItemProvider;
 import org.eclipse.epf.library.edit.process.command.ActivityDropCommand;
 import org.eclipse.epf.library.edit.process.command.ContributeToActivityCommand;
+import org.eclipse.epf.library.edit.process.command.LocallyReplaceAndDeepCopyCommand;
 import org.eclipse.epf.library.edit.process.command.ReplaceActivityCommand;
 import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
+import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
 import org.eclipse.epf.library.edit.util.ConfigurableComposedAdapterFactory;
 import org.eclipse.epf.library.edit.util.EditingDomainComposedAdapterFactory;
 import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
@@ -543,8 +546,6 @@
 					cmd = new ReplaceActivityCommand(
 							(BreakdownElementWrapperItemProvider) bsItemProvider);
 					getActionManager().execute(cmd);
-					// ProcessUtil.replaceActivity((BreakdownElementWrapperItemProvider)bsItemProvider,
-					// ((ProcessFormEditor)activeEditor).editingDomain.getAdapterFactory());
 				} catch (Exception e) {
 					AuthoringUIPlugin.getDefault().getLogger().logError(e);
 				} finally {
@@ -559,6 +560,38 @@
 				}
 			}
 		};
+		
+		private IAction localReplacementAndDeepCopy = new Action(LibraryEditResources.localReplacementAndDeepCopy_text) {
+			/* (non-Javadoc)
+			 * @see org.eclipse.jface.action.Action#run()
+			 */
+			public void run() {
+				Runnable runnable = new Runnable() {
+
+					public void run() {
+						IResourceAwareCommand cmd = null;
+						try {
+							cmd = new LocallyReplaceAndDeepCopyCommand((BreakdownElementWrapperItemProvider) bsItemProvider);
+							getActionManager().execute(cmd);
+						} catch (Exception e) {
+							AuthoringUIPlugin.getDefault().getLogger().logError(e);
+						} finally {
+							if (cmd != null) {
+								try {
+									cmd.dispose();
+								} catch (Exception e) {
+									AuthoringUIPlugin.getDefault().getLogger()
+											.logError(e);
+								}
+							}
+						}
+					}
+					
+				};
+				
+				UserInteractionHelper.runInUI(runnable, getText());
+			}
+		};
 
 		private IAction contributeAction = new Action(AuthoringUIResources.AuthoringUI_ProcessEditor_Action_Contribute) { //$NON-NLS-1$
 			public void run() {
@@ -900,9 +933,26 @@
 						selectedActivity, config, IActionTypeProvider.EXTEND);
 
 				if (selection == null || selection.isEmpty()) {
+					
 					return;
 				}
-
+				else {
+					Object o = selection.get(0);
+					if (o instanceof Activity)
+					{
+						Activity act = (Activity) o;
+						if (ProcessUtil.hasContributorOrReplacer(act))
+						{
+							Object[] args = { selectedActivity.getName(), act.getName()};
+							String message = AuthoringUIResources.bind(AuthoringUIResources.activity_variability_error_msg, args);
+							
+							String title = AuthoringUIResources.activity_variability_error_title;
+							AuthoringUIPlugin.getDefault()
+							.getMsgDialog().displayError(title, message, ""); //$NON-NLS-1$
+							return;
+						}
+					}
+				}
 				ActivityDropCommand cmd = new ActivityDropCommand(
 						selectedActivity, selection, null, getAdapterFactory());
 				cmd.setType(IActionTypeProvider.EXTEND);
@@ -1338,6 +1388,7 @@
 					&& TngUtil.unwrap(bsItemProvider) instanceof Activity) {
 				menuManager.insertBefore("additions", contributeAction); //$NON-NLS-1$
 				menuManager.insertBefore("additions", replaceAction); //$NON-NLS-1$
+				menuManager.insertBefore("additions", localReplacementAndDeepCopy); //$NON-NLS-1$
 			}
 
 			if (!isRolledUP) {
@@ -1502,6 +1553,7 @@
 			// revealAction.setEnabled(enabled);
 			// suppressAction.setEnabled(enabled);
 			replaceAction.setEnabled(enabled);
+			localReplacementAndDeepCopy.setEnabled(enabled);
 			revealAllDiagrams.setEnabled(enabled);
 			suppressAllDiagrams.setEnabled(enabled);
 			suppressDiagramAction.setEnabled(enabled);
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ActivityVariaibilityFilter.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ActivityVariaibilityFilter.java
index a8795e6..7bae94f 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ActivityVariaibilityFilter.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/filters/ActivityVariaibilityFilter.java
@@ -12,8 +12,11 @@
 
 import org.eclipse.epf.library.edit.configuration.CategorizedProcessesItemProvider;
 import org.eclipse.epf.library.edit.configuration.ProcessesItemProvider;
+import org.eclipse.epf.library.edit.util.TngUtil;
 import org.eclipse.epf.uma.Activity;
 import org.eclipse.epf.uma.BreakdownElement;
+import org.eclipse.epf.uma.CapabilityPattern;
+import org.eclipse.epf.uma.DeliveryProcess;
 import org.eclipse.epf.uma.MethodConfiguration;
 import org.eclipse.epf.uma.Process;
 import org.eclipse.epf.uma.ProcessPackage;
@@ -44,19 +47,23 @@
 
 		}
 		if ((obj instanceof Activity) || obj instanceof ProcessPackage) {
+			if ((obj instanceof Activity)
+					&& (this.activity.equals((Activity) obj))) {
+				return false;
+			}
 			if (obj instanceof BreakdownElement) {
-				// Process srcProc = TngUtil
-				// .getOwningProcess((BreakdownElement) obj);
-				// Process targetProc = TngUtil
-				// .getOwningProcess((BreakdownElement) this.activity);
-				// if (srcProc instanceof DeliveryProcess
-				// && targetProc instanceof CapabilityPattern) {
-				// return false;
-				// }
+				Process srcProc = TngUtil
+						.getOwningProcess((BreakdownElement) obj);
+				Process targetProc = TngUtil
+						.getOwningProcess((BreakdownElement) this.activity);
+				if (srcProc instanceof DeliveryProcess
+						&& targetProc instanceof CapabilityPattern) {
+					return false;
+				}
 			}
 			if (obj instanceof Process) {
 				Process proc = (Process) obj;
-				if (proc.equals(this.activity))
+				if (proc.equals(TngUtil.getOwningProcess(this.activity)))
 					return false;
 			}
 
@@ -64,4 +71,5 @@
 		} else
 			return false;
 	}
+
 }
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ChecklistItemsPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ChecklistItemsPage.java
index 10e6707..a32a5e4 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ChecklistItemsPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ChecklistItemsPage.java
@@ -14,8 +14,6 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
 import org.eclipse.epf.authoring.ui.AuthoringUIImages;
 import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
@@ -52,7 +50,6 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.FocusAdapter;
 import org.eclipse.swt.events.FocusEvent;
@@ -341,8 +338,8 @@
 					newName = StrUtil.makeValidFileName(newName);
 					if (ctrl_name.getText() == null
 							|| ctrl_name.getText().length() == 0) {
-						String title = NLS.bind("AuthoringUI.renameDialog.title", LibraryUIText.TEXT_CHECK_ITEM); //$NON-NLS-1$
-						String msg = NLS.bind("AuthoringUI.emptyElementNameError.msg", StrUtil.toLower(LibraryUIText.TEXT_CHECK_ITEM)); //$NON-NLS-1$
+						String title = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_renameDialog_title, LibraryUIText.TEXT_CHECK_ITEM); //$NON-NLS-1$
+						String msg = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_emptyElementNameError_msg, StrUtil.toLower(LibraryUIText.TEXT_CHECK_ITEM)); //$NON-NLS-1$
 						if (oldName != null && oldName.length() > 0) {
 							AuthoringUIPlugin.getDefault().getMsgDialog()
 									.displayError(title, msg);
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigViewPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigViewPage.java
index 78f3978..e132bea 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigViewPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigViewPage.java
@@ -34,7 +34,6 @@
 import org.eclipse.epf.uma.MethodConfiguration;
 import org.eclipse.epf.uma.UmaPackage;
 import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
@@ -204,7 +203,7 @@
 								(ContentCategory) obj)) {
 							String name = ((ContentCategory) obj).getName();
 							String title = AuthoringUIResources.AuthoringUI_configViewPageViewExistsDialog_title; //$NON-NLS-1$
-							String message = NLS.bind("AuthoringUI.configViewPageViewExistsDialog.message", name);
+							String message = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_configViewPageViewExistsDialog_message, name);
 							AuthoringUIPlugin.getDefault().getMsgDialog()
 									.displayWarning(title, message);
 						} else {
@@ -276,7 +275,7 @@
 		if (item == null)
 			return;
 
-		String message = NLS.bind("AuthoringUI.configViewPageRemoveViewDialog.message", item //$NON-NLS-1$
+		String message = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_configViewPageRemoveViewDialog_message, item //$NON-NLS-1$
 		.getText());
 		boolean ret = AuthoringUIPlugin.getDefault().getMsgDialog()
 				.displayConfirmation(title, message);
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationDescription.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationDescription.java
index a01aabc..b309bc5 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationDescription.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ConfigurationDescription.java
@@ -222,7 +222,7 @@
 							.getMsgDialog()
 							.displayError(
 									AuthoringUIResources.AuthoringUI_renameDialog_title, //$NON-NLS-1$
-									NLS.bind("AuthoringUI.emptyElementNameError.msg", StrUtil.toLower(LibraryUIText.TEXT_METHOD_CONFIGURATON))); //$NON-NLS-1$	
+									AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_emptyElementNameError_msg, StrUtil.toLower(LibraryUIText.TEXT_METHOD_CONFIGURATON))); //$NON-NLS-1$	
 					nameText.setText(config.getName());
 					nameText.getDisplay().asyncExec(new Runnable() {
 						public void run() {
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DescriptionFormPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DescriptionFormPage.java
index 1c6ebd9..0208da5 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DescriptionFormPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/DescriptionFormPage.java
@@ -79,7 +79,6 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.ControlListener;
@@ -2279,7 +2278,7 @@
 												.getClientArea().height);
 							} else {
 								if (warningCount == 1) {
-									String msg = NLS.bind("AuthoringUI.DescriptionFormPage.LoadShapeIconWarning", (new Object[] { contentElement.getName(), path })); //$NON-NLS-1$
+									String msg = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_DescriptionFormPage_LoadShapeIconWarning, (new Object[] { contentElement.getName(), path })); //$NON-NLS-1$
 									MsgBox.showWarning(msg);
 									warningCount++;
 								}
@@ -2290,7 +2289,7 @@
 									.getDefault()
 									.getLogger()
 									.logError(
-											NLS.bind("AuthoringUI.DescriptionFormPage.LoadShapeIconError", (new Object[] { ex.getMessage() }))); //$NON-NLS-1$
+											AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_DescriptionFormPage_LoadShapeIconError, (new Object[] { ex.getMessage() }))); //$NON-NLS-1$
 						}
 					}
 				}
@@ -2343,7 +2342,7 @@
 												.getClientArea().height);
 							} else {
 								if (warningCount == 1) {
-									String msg = NLS.bind("AuthoringUI.DescriptionFormPage.LoadNodeIconWarning", (new Object[] { contentElement.getName(), path })); //$NON-NLS-1$
+									String msg = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_DescriptionFormPage_LoadNodeIconWarning, (new Object[] { contentElement.getName(), path })); //$NON-NLS-1$
 									MsgBox.showWarning(msg);
 									warningCount++;
 								}
@@ -2354,7 +2353,7 @@
 									.getDefault()
 									.getLogger()
 									.logError(
-											NLS.bind("AuthoringUI.DescriptionFormPage.LoadNodeIconError", (new Object[] { ex.getMessage() }))); //$NON-NLS-1$
+											AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_DescriptionFormPage_LoadNodeIconError, (new Object[] { ex.getMessage() }))); //$NON-NLS-1$
 						}
 					}
 				}
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodPluginDescriptionPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodPluginDescriptionPage.java
index dd815bf..0c642be 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodPluginDescriptionPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/MethodPluginDescriptionPage.java
@@ -66,7 +66,6 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.events.FocusAdapter;
@@ -411,7 +410,7 @@
 				if (msg == null) {
 					if (!validName.equals(plugin.getName())) {
 						Shell shell = getSite().getShell();
-						msg = NLS.bind("AuthoringUI.methodPluginDescriptionPage.confirmRename", (new Object[] { plugin.getName(), ctrl_name.getText() })); //$NON-NLS-1$
+						msg = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_methodPluginDescriptionPage_confirmRename, (new Object[] { plugin.getName(), ctrl_name.getText() })); //$NON-NLS-1$
 						String title = AuthoringUIResources.AuthoringUI_methodPluginDescriptionPage_confirmRename_title; //$NON-NLS-1$
 						if (!MessageDialog.openConfirm(shell, title, msg)) {
 							ctrl_name.setText(plugin.getName());
@@ -556,7 +555,7 @@
 					// of the removed base
 					//
 					if (UmaUtil.hasReference(plugin, base)) {
-						String message = NLS.bind("AuthoringUI.methodPluginDescriptionRemoveRefConfirm.message", plugin.getName());
+						String message = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_methodPluginDescriptionRemoveRefConfirm_message, plugin.getName());
 						Shell shell = getSite().getShell();
 						if (AuthoringUIPlugin.getDefault().getMsgDialog()
 								.displayConfirmation(shell.getText(), message)) {
@@ -933,7 +932,7 @@
 					return;
 				}
 
-				String message = NLS.bind("AuthoringUI.methodPluginDescriptionPage.lockPlugin.message", plugin.getName());
+				String message = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_methodPluginDescriptionPage_lockPlugin_message, plugin.getName());
 				Shell shell = getSite().getShell();
 				if (AuthoringUIPlugin.getDefault().getMsgDialog()
 						.displayConfirmation(shell.getText(), message)) {
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessBreakdownStructureFormPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessBreakdownStructureFormPage.java
index 59cc55a..1ba2a31 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessBreakdownStructureFormPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessBreakdownStructureFormPage.java
@@ -36,7 +36,6 @@
 import org.eclipse.epf.library.edit.process.IBSItemProvider;
 import org.eclipse.epf.library.edit.process.IColumnAware;
 import org.eclipse.epf.library.edit.ui.ExposedAdapterFactoryContentProvider;
-import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
 import org.eclipse.epf.library.edit.util.ProcessUtil;
 import org.eclipse.epf.library.edit.util.Suppression;
 import org.eclipse.epf.library.edit.util.TngUtil;
@@ -47,8 +46,6 @@
 import org.eclipse.epf.uma.ProcessComponent;
 import org.eclipse.epf.uma.UmaFactory;
 import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.epf.uma.VariabilityElement;
-import org.eclipse.epf.uma.VariabilityType;
 import org.eclipse.epf.uma.WorkBreakdownElement;
 import org.eclipse.epf.uma.WorkOrder;
 import org.eclipse.epf.uma.WorkOrderType;
@@ -320,7 +317,7 @@
 
 	// private Object tabFolder;
 
-	private ProcessViewer viewer;
+	protected ProcessViewer viewer;
 
 	private TextCellEditor textCellEditor;
 
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessDescription.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessDescription.java
index 93dffe5..036cb33 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessDescription.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/ProcessDescription.java
@@ -55,7 +55,6 @@
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerFilter;
 import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.events.ControlEvent;
@@ -1208,7 +1207,7 @@
 									.getMsgDialog()
 									.displayError(
 											AuthoringUIResources.AuthoringUI_addConfigErrorDialog_title, //$NON-NLS-1$
-											NLS.bind("AuthoringUI.invalidConfigError.msg", config.getName())); //$NON-NLS-1$
+											AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_invalidConfigError_msg, config.getName())); //$NON-NLS-1$
 						}
 					}
 				}
@@ -1264,7 +1263,7 @@
 									.getMsgDialog()
 									.displayError(
 											AuthoringUIResources.AuthoringUI_setDefaultConfigErrorDialog_title, //$NON-NLS-1$
-											NLS.bind("AuthoringUI.setDefaultConfigError.msg", selectedConfigName)); //$NON-NLS-1$
+											AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_setDefaultConfigError_msg, selectedConfigName)); //$NON-NLS-1$
 						}
 					}
 				}
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskRolesPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskRolesPage.java
index 3810888..58e6861 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskRolesPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskRolesPage.java
@@ -26,7 +26,6 @@
 import org.eclipse.epf.uma.Role;
 import org.eclipse.epf.uma.Task;
 import org.eclipse.epf.uma.UmaPackage;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.forms.editor.FormEditor;
@@ -98,7 +97,7 @@
 			boolean ok = true;
 			if(!elementList1.isEmpty()){
 				String newPrimaryPerfomer = ((Role)addItems.get(0)).getName();
-				String message = NLS.bind("AuthoringUI.taskRolesPage.primaryPerformer.modify.message", (new String[]{newPrimaryPerfomer})); //$NON-NLS-1$
+				String message = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_taskRolesPage_primaryPerformer_modify_message, (new String[]{newPrimaryPerfomer})); //$NON-NLS-1$
 				String warning = AuthoringUIResources.AuthoringUI_taskRolesPage_confirm_title;
 				ok = AuthoringUIPlugin.getDefault().getMsgDialog()
 				.displayConfirmation(warning, message);
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskStepsPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskStepsPage.java
index 1b0fe29..347fbfd 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskStepsPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/forms/TaskStepsPage.java
@@ -47,7 +47,6 @@
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.FocusAdapter;
 import org.eclipse.swt.events.FocusEvent;
@@ -329,8 +328,8 @@
 					String newContent = ctrl_name.getText();
 					if (ctrl_name.getText() == null
 							|| ctrl_name.getText().length() == 0) {
-						String title = NLS.bind("AuthoringUI.renameDialog.title", LibraryUIText.TEXT_STEP); //$NON-NLS-1$
-						String msg = NLS.bind("AuthoringUI.emptyElementNameError.msg", StrUtil.toLower(LibraryUIText.TEXT_STEP)); //$NON-NLS-1$
+						String title = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_renameDialog_title, LibraryUIText.TEXT_STEP); //$NON-NLS-1$
+						String msg = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_emptyElementNameError_msg, StrUtil.toLower(LibraryUIText.TEXT_STEP)); //$NON-NLS-1$
 						AuthoringUIPlugin.getDefault().getMsgDialog()
 								.displayError(title, msg);
 						ctrl_name.setSelection(0, oldContent.length());
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGeneralSection.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGeneralSection.java
index f7ef561..bcca8dc 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGeneralSection.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/properties/ActivityGeneralSection.java
@@ -33,6 +33,7 @@
 import org.eclipse.epf.library.edit.command.IActionManager;
 import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
 import org.eclipse.epf.library.edit.process.IBSItemProvider;
+import org.eclipse.epf.library.edit.util.ProcessUtil;
 import org.eclipse.epf.library.edit.util.TngUtil;
 import org.eclipse.epf.library.ui.LibraryUIText;
 import org.eclipse.epf.library.ui.dialogs.ConvertActivityDialog;
@@ -336,9 +337,24 @@
 
 				if (selectedItems != null && !selectedItems.isEmpty()) {
 					Object o = selectedItems.get(0);
+					if (o instanceof Activity)
+					{
+						Activity act = (Activity) o;
+						if (ProcessUtil.hasContributorOrReplacer(act))
+						{
+							Object[] args = { element.getName(), act.getName()};
+							String message = AuthoringUIResources.bind(AuthoringUIResources.activity_variability_error_msg, args);
+							
+							String title = AuthoringUIResources.activity_variability_error_title;
+							AuthoringUIPlugin.getDefault()
+							.getMsgDialog().displayError(title, message, ""); //$NON-NLS-1$
+							return;
+						}
+					}
 					if (o instanceof VariabilityElement) {
 						VariabilityElement ve = (VariabilityElement) o;
 
+						
 						boolean status = actionMgr
 								.doAction(
 										IActionManager.SET,
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LibraryView.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LibraryView.java
index 2bc6efd..ae71408 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LibraryView.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/LibraryView.java
@@ -143,7 +143,6 @@
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.window.Window;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.HTMLTransfer;
@@ -661,7 +660,7 @@
 												.getMsgDialog()
 												.displayError(
 														AuthoringUIResources.AuthoringUI_renameDialog_title, //$NON-NLS-1$
-														NLS.bind("AuthoringUI.duplicateElementNameError.msg", newName)); //$NON-NLS-1$										
+														AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_duplicateElementNameError_msg, newName)); //$NON-NLS-1$										
 										getInput = true;
 										break;
 									}
@@ -1247,7 +1246,7 @@
 						String message = ex.getMessage();
 						if (message.startsWith("###")) { //$NON-NLS-1$
 							String projectFileName = message.substring(3);
-							String prompt = NLS.bind("AuthoringUI.ElementsView.35", (new Object[] { projectFileName })); //$NON-NLS-1$
+							String prompt = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_ElementsView_35, (new Object[] { projectFileName })); //$NON-NLS-1$
 							if (MsgBox.prompt(prompt, SWT.RETRY | SWT.CANCEL) == SWT.RETRY) {
 								openLibrary(path);
 							}
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/MessageLabelProvider.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/MessageLabelProvider.java
index e63745a..1218b98 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/MessageLabelProvider.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/MessageLabelProvider.java
@@ -20,7 +20,6 @@
 import org.eclipse.epf.library.util.LibraryUtil;
 import org.eclipse.epf.uma.MethodElement;
 import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.ui.ISharedImages;
 import org.eclipse.ui.PlatformUI;
@@ -117,7 +116,7 @@
 				}
 			} else {
 				if (error.isError() || error.isWarning()) {
-					text = NLS.bind("AuthoringUI.MessageLabelProvider.unselectedpackages", (new String[] { getString(e) })); //$NON-NLS-1$
+					text = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_MessageLabelProvider_unselectedpackages, (new String[] { getString(e) })); //$NON-NLS-1$
 				} else if (error.isChildError() || error.isChildWarning()) {
 					text = AuthoringUIResources.AuthoringUI_MessageLabelProvider_errchildpkgs; //$NON-NLS-1$
 				}
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/SaveableLibraryViewPart.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/SaveableLibraryViewPart.java
index 61825eb..daa4ea3 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/SaveableLibraryViewPart.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/SaveableLibraryViewPart.java
@@ -14,7 +14,6 @@
 import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
 import org.eclipse.epf.authoring.ui.AuthoringUIResources;
 import org.eclipse.epf.library.LibraryService;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.ISaveablePart;
 import org.eclipse.ui.part.ViewPart;
@@ -49,7 +48,7 @@
 						.getMsgDialog()
 						.displayError(
 								AuthoringUIResources.AuthoringUI_saveLibraryDialog_title, //$NON-NLS-1$
-								NLS.bind("AuthoringUI.saveLibraryToError.msg", libPath), //$NON-NLS-1$
+								AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_saveLibraryToError_msg, libPath), //$NON-NLS-1$
 								AuthoringUIResources.AuthoringUI_error_reason, //$NON-NLS-1$
 								e);
 			} finally {
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ViewHelper.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ViewHelper.java
index 8f68d89..097196e 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ViewHelper.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/views/ViewHelper.java
@@ -53,7 +53,6 @@
 import org.eclipse.epf.uma.util.UmaUtil;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IViewPart;
@@ -162,7 +161,7 @@
 				&& ((EObject) object).eResource() == null) {
 			AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
 					AuthoringUIResources.AuthoringUI_errorDialog_title, //$NON-NLS-1$
-					NLS.bind("AuthoringUI.elementAlreadyDeletedError.msg", ((MethodElement) object).getName()));
+					AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_elementAlreadyDeletedError_msg, ((MethodElement) object).getName()));
 			return null;
 		} else if (object instanceof FeatureValueWrapperItemProvider) {
 			FeatureValueWrapperItemProvider adapter = (FeatureValueWrapperItemProvider) object;
@@ -182,7 +181,7 @@
 							.getMsgDialog()
 							.displayPrompt(
 									AuthoringUIResources.AuthoringUI_deleteDialog_title, //$NON-NLS-1$						
-									NLS.bind("AuthoringUI.ViewHelper.alreadydeletedconfirm.text", ((MethodElement) value)
+									AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_ViewHelper_alreadydeletedconfirm_text, ((MethodElement) value)
 									.getName(), ownerName))) { //$NON-NLS-1$
 						// Remove the association.
 						if (feature.isMany()) {
@@ -196,7 +195,7 @@
 							.getMsgDialog()
 							.displayError(
 									AuthoringUIResources.AuthoringUI_errorDialog_title, //$NON-NLS-1$
-									NLS.bind("AuthoringUI.elementAlreadyDeletedError.msg", ((MethodElement) value)
+									AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_elementAlreadyDeletedError_msg, ((MethodElement) value)
 									.getName()));
 				}
 				return null;
@@ -207,7 +206,7 @@
 					&& ((EObject) object).eResource() == null) {
 				AuthoringUIPlugin.getDefault().getMsgDialog().displayError(
 						AuthoringUIResources.AuthoringUI_errorDialog_title, //$NON-NLS-1$
-						NLS.bind("AuthoringUI.elementAlreadyDeletedError.msg", ((MethodElement) object).getName()));
+						AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_elementAlreadyDeletedError_msg, ((MethodElement) object).getName()));
 				return null;
 			}
 		}
@@ -363,7 +362,7 @@
 					for (Iterator iter = modifiedResources.iterator(); iter
 							.hasNext();) {
 						Resource resource = (Resource) iter.next();
-						monitor.subTask(NLS.bind("AuthoringUI.savingTask.name", resource.getURI().toFileString()));
+						monitor.subTask(AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_savingTask_name, resource.getURI().toFileString()));
 						persister.save(resource);
 					}
 					persister.commit();
@@ -599,7 +598,7 @@
 					for (Iterator iter = modifiedResources.iterator(); iter
 							.hasNext();) {
 						Resource resource = (Resource) iter.next();
-						monitor.subTask(NLS.bind("AuthoringUI.savingTask.name", resource.getURI().toFileString()));
+						monitor.subTask(AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_savingTask_name, resource.getURI().toFileString()));
 						persister.save(resource);
 					}
 					persister.commit();
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationWizard.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationWizard.java
index 2000046..2e61b60 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationWizard.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewConfigurationWizard.java
@@ -17,7 +17,6 @@
 import org.eclipse.epf.library.LibraryServiceUtil;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
 
@@ -94,7 +93,7 @@
 						.getMsgDialog()
 						.displayError(
 								AuthoringUIResources.AuthoringUIPlugin_newConfigurationWizard_title, //$NON-NLS-1$				
-								NLS.bind("AuthoringUI.duplicateElementNameError.msg", configName)); //$NON-NLS-1$
+								AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_duplicateElementNameError_msg, configName)); //$NON-NLS-1$
 				return true;
 			}
 		}
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryWizard.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryWizard.java
index 7e171aa..c308a76 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryWizard.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewLibraryWizard.java
@@ -22,7 +22,6 @@
 import org.eclipse.epf.library.xmi.XMILibraryUtil;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.INewWizard;
 import org.eclipse.ui.IWorkbench;
 
@@ -125,7 +124,7 @@
 					.displayError(
 							AuthoringUIResources.AuthoringUI_newLibraryWizard_title, //$NON-NLS-1$
 							AuthoringUIResources.AuthoringUI_newLibraryError_msg, //$NON-NLS-1$
-							NLS.bind("AuthoringUI.newLibraryError.reason1", tmpLibPath) + "\n\n" + //$NON-NLS-1$ //$NON-NLS-2$
+							AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_newLibraryError_reason1, tmpLibPath) + "\n\n" + //$NON-NLS-1$ //$NON-NLS-2$
 									AuthoringUIResources.AuthoringUI_newLibraryError_advice); //$NON-NLS-1$ 
 			return false;
 		}
@@ -148,7 +147,7 @@
 						.displayError(
 								AuthoringUIResources.AuthoringUI_newLibraryWizard_title, //$NON-NLS-1$
 								AuthoringUIResources.AuthoringUI_newLibraryError_msg, //$NON-NLS-1$
-								NLS.bind("AuthoringUI.newLibraryError.reason2", tmpLibPath) + "\n\n" + //$NON-NLS-1$ //$NON-NLS-2$
+								AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_newLibraryError_reason2, tmpLibPath) + "\n\n" + //$NON-NLS-1$ //$NON-NLS-2$
 										AuthoringUIResources.AuthoringUI_newLibraryError_advice); //$NON-NLS-1$ 
 			} else
 				answer = true;
@@ -160,7 +159,7 @@
 						.displayError(
 								AuthoringUIResources.AuthoringUI_newLibraryWizard_title, //$NON-NLS-1$
 								AuthoringUIResources.AuthoringUI_newLibraryError_msg, //$NON-NLS-1$
-								NLS.bind("AuthoringUI.newLibraryError.reason3", file.getAbsolutePath()) + "\n\n" + //$NON-NLS-1$ //$NON-NLS-2$
+								AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_newLibraryError_reason3, file.getAbsolutePath()) + "\n\n" + //$NON-NLS-1$ //$NON-NLS-2$
 										AuthoringUIResources.AuthoringUI_newLibraryError_advice); //$NON-NLS-1$ 
 				answer = false;
 			} else {
diff --git a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewMethodPluginWizardPage.java b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewMethodPluginWizardPage.java
index dce5334..4013252 100755
--- a/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewMethodPluginWizardPage.java
+++ b/plugins/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/wizards/NewMethodPluginWizardPage.java
@@ -24,7 +24,6 @@
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
@@ -204,7 +203,7 @@
 			// Which fits in error message area of the wizard. 
 			int i = msg.indexOf("IUPL0101E"); //$NON-NLS-1$
 			if(i>=0){
-				msg = NLS.bind("AuthoringUI.duplicatePluginNameError.msg", nameText.getText()); //$NON-NLS-1$
+				msg = AuthoringUIResources.bind(AuthoringUIResources.AuthoringUI_duplicatePluginNameError_msg, nameText.getText()); //$NON-NLS-1$
 			}
 			setErrorMessage(msg);
 			setMessage(null);
diff --git a/plugins/org.eclipse.epf.base.feature/feature.xml b/plugins/org.eclipse.epf.base.feature/feature.xml
index 46376b1..9ab72e9 100755
--- a/plugins/org.eclipse.epf.base.feature/feature.xml
+++ b/plugins/org.eclipse.epf.base.feature/feature.xml
@@ -52,8 +52,7 @@
          id="org.eclipse.epf.richtext"
          download-size="0"
          install-size="0"
-         version="1.0.0"
-         unpack="false"/>
+         version="1.0.0"/>
 
    <plugin
          id="org.eclipse.epf.search"
@@ -94,8 +93,7 @@
          id="org.eclipse.epf.library"
          download-size="0"
          install-size="0"
-         version="1.0.0"
-         unpack="false"/>
+         version="1.0.0"/>
 
    <plugin
          id="org.eclipse.epf.library.xmi"
@@ -135,8 +133,7 @@
          id="org.eclipse.epf.uma.edit"
          download-size="0"
          install-size="0"
-         version="1.0.0"
-         unpack="false"/>
+         version="1.0.0"/>
 
    <plugin
          id="org.eclipse.epf.export"
diff --git a/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/FileUtil.java b/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/FileUtil.java
index b10af33..7a5f904 100755
--- a/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/FileUtil.java
+++ b/plugins/org.eclipse.epf.common/src/org/eclipse/epf/common/utils/FileUtil.java
@@ -29,6 +29,7 @@
 import java.nio.channels.OverlappingFileLockException;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetDecoder;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
@@ -832,5 +833,73 @@
 			}
 		}
 	}
+
+	/**
+	 * given a directory and extension, returns all files (recursively) whose
+	 * extension startsWith the given extension
+	 * 
+	 * @param f
+	 * @param extension
+	 * @return
+	 */
+	public static List fileList(File f, String extension) {
+		extension = extension.toUpperCase();
+		List returnList = new ArrayList();
+		try {
+			if (f.isDirectory()) { // if dir then recurse
+				String[] flist = f.list();
+				for (int i = 0; i < flist.length; ++i) {
+					File fc = new File(f.getPath(), flist[i]);
+					returnList.addAll(fileList(fc, extension));
+				}
+			} else { // ordinary file
+				if (extension != null) {
+					String name = f.getName().toUpperCase();
+					if (name.lastIndexOf(".") != -1) //$NON-NLS-1$
+						if (name
+								.substring(name.lastIndexOf(".") + 1).startsWith(extension)) { //$NON-NLS-1$
+							returnList.add(f);
+						}
+				} else
+					returnList.add(f);
+			}
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+		return returnList;
+	}
+
+	/**
+	 * given a directory and extension, returns all files (recursively)whose
+	 * extension does not startsWith the given extension
+	 * 
+	 * @param f
+	 * @param extension
+	 * @return
+	 */
+	public static List fileListExcludeExt(File f, String extension) {
+		List returnList = new ArrayList();
+		try {
+			if (f.isDirectory()) { // if dir then recurse
+				String[] flist = f.list();
+				for (int i = 0; i < flist.length; ++i) {
+					File fc = new File(f.getPath(), flist[i]);
+					returnList.addAll(fileListExcludeExt(fc, extension));
+				}
+			} else { // ordinary file
+				if (extension != null) {
+					String name = f.getName();
+					if (name.lastIndexOf(".") != -1) //$NON-NLS-1$
+						if (!(name.substring(name.lastIndexOf(".") + 1).startsWith(extension))) { //$NON-NLS-1$
+							returnList.add(f);
+						}
+				} else
+					returnList.add(f);
+			}
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+		return returnList;
+	}
 	
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.epf.library.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.epf.library.edit/META-INF/MANIFEST.MF
index a54d4fd..6129874 100755
--- a/plugins/org.eclipse.epf.library.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epf.library.edit/META-INF/MANIFEST.MF
@@ -3,6 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.epf.library.edit; singleton:=true
 Bundle-Version: 1.0.0
+Bundle-ClassPath: libedit.jar
 Bundle-Activator: org.eclipse.epf.library.edit.LibraryEditPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.epf.library.edit/build.properties b/plugins/org.eclipse.epf.library.edit/build.properties
index 321dc6b..377b7bd 100755
--- a/plugins/org.eclipse.epf.library.edit/build.properties
+++ b/plugins/org.eclipse.epf.library.edit/build.properties
@@ -1,6 +1,6 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
+source.libedit.jar = src/
+output.libedit.jar = bin/
+bin.includes = libedit.jar,\
                .options,\
                META-INF/,\
                icons/,\
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditResources.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditResources.java
index 2d07a4c..90d5056 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditResources.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/LibraryEditResources.java
@@ -1,91 +1,190 @@
-//------------------------------------------------------------------------------
-// Copyright (c) 2005, 2006 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
-//------------------------------------------------------------------------------
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
 package org.eclipse.epf.library.edit;
 
-import java.util.ResourceBundle;
+import org.eclipse.osgi.util.NLS;
 
-import org.eclipse.epf.common.utils.I18nUtil;
+public final class LibraryEditResources extends NLS {
 
+	private static final String BUNDLE_NAME = "org.eclipse.epf.library.edit.Resources";//$NON-NLS-1$
+	public static String localReplacementAndDeepCopy_text;
 
-/**
- * The Library Edit message resource bundle accessor class.
- * 
- * @author Kelvin Low
- * @since 1.0
- */
-public class LibraryEditResources {
-
-	private final static ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(LibraryEditResources.class.getPackage().getName()
-					+ ".Resources"); //$NON-NLS-1$
-
-	/**
-	 * Private constructor to prevent ths class from being instantiated.
-	 */
 	private LibraryEditResources() {
+		// Do not instantiate
 	}
 
-	/**
-	 * Returns the localized string associated with a resource key.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @return A localized string.
-	 */
-	public static String getString(String key) {
-		return I18nUtil.getString(RESOURCE_BUNDLE, key);
-	}
+	public static String deepCopy_promptMsg;
+	public static String deepCopy_title;
+	public static String moveDialog_title;
+	public static String deleteDialog_title;
+	public static String errorDialog_title;
+	public static String errorDialog_cannotRename;
+	public static String deleteReferencesDialog_title;
+	public static String deleteReferencesDialog_text;
+	public static String resolveNameConflictDialog_title;
+	public static String resolveNameConflictDialog_text;
+	public static String selectDeliverablesDialog_title;
+	public static String selectDeliverablesDialog_text;
+	public static String newProcessComponentDialog_title;
+	public static String nameLabel_text;
+	public static String defaultConfigLabel_text;
+	public static String baseProcessLabel_text;
+	public static String basedOnProcessesLabel_text;
+	public static String selectAssociationLabel_text;
+	public static String removeAssociationDialog_text;
+	public static String selectTeamsDialog_title;
+	public static String selectTeamsDialog_text;
+	public static String taskSelectionDialog_title;
+	public static String titleLabel_text;
+	public static String emptyElementNameError_msg;
+	public static String emptyElementNameError_simple_msg;
+	public static String duplicateElementNameError_msg;
+	public static String duplicateElementNameError_simple_msg;
+	public static String invalidElementNameError1_msg;
+	public static String invalidElementNameError2_msg;
+	public static String invalidElementNameError3_msg;
+	public static String noConfigError_msg;
+	public static String noDeliveryProcessError_msg;
+	public static String noDefaultConfigError_msg;
+	public static String noBaseProcessError_msg;
+	public static String createProcessError_msg;
+	public static String createElementError_msg;
+	public static String deleteElementError_msg;
+	public static String duplicateContentFileError_msg;
+	public static String duplicateContentFileError_simple_msg;
+	public static String undoCommandError_msg;
+	public static String invalidPredecessorError_msg;
+	public static String UserInteractionHelper_errRelationshipExists;
+	public static String error_msgWithDetails;
+	public static String error_msg;
+	public static String Suppression_nameDuplication;
+	public static String Suppression_presentationNameDuplication;
+	public static String error_reason;
+	public static String saveProcessError_reason;
+	public static String deleteReferencesError_reason;
+	public static String saveFileError_reason;
+	public static String invalidReferencesError_reason;
+	public static String unresolvedObjectError_reason;
+	public static String MethodElementAddCommand_originalNotFoundWarning_msg;
+	public static String ActivityAddCommand_originalNotFoundWarning_msg;
+	public static String ActivityDropCommand_deepCopy_promptConfigurationMsg;
+	public static String creatingProcessComponentTask_name;
+	public static String processingReferencesTask_name;
+	public static String deletingElementsTask_name;
+	public static String checkingReferencesTask_name;
+	public static String removingReferencestask_name;
+	public static String savingModifiedFilesTask_name;
+	public static String checkAffectedResourcesTask_name;
+	public static String movingTask_name;
+	public static String movingFilesTask_name;
+	public static String copyingResourcesTask_name;
+	public static String savingFileTask_name;
+	public static String element_text;
+	public static String createElement_text;
+	public static String createProcess_text;
+	public static String contributesTo_text;
+	public static String localContributesTo_text;
+	public static String extends_text;
+	public static String replaces_text;
+	public static String localReplaces_text;
+	public static String elementType_text;
+	public static String deliverables_text;
+	public static String contributeToActivity_text;
+	public static String ActivityDropCommand_label;
+	public static String replaceActivity_text;
+	public static String file_text;
+	public static String directory_text;
+	public static String unresolved_text;
+	public static String assists_text;
+	public static String unknown_text;
+	public static String command_done;
+	public static String Util_labelpath_variabilitywithplugin_info;
+	public static String Util_labelpath_variability_info;
+	public static String ui_ref_delete;
+	public static String ui_ref_delete2;
+	public static String ui_references;
+	public static String ui_workproduct_descriptor_description;
+	public static String ui_workproductdescriptor_options;
+	public static String ui_workproductdescriptor_outputlabel;
+	public static String ui_workproductdescriptor_delete_task;
+	public static String ui_UserInteractionHelper_defaultconfigcheck;
+	public static String ui_UserInteractionHelper_genericErr_message_text;
+	public static String ProcessAutoSynchronizeAction_noDescriptorToSynch;
+	public static String util_configurablecomposedadapter_refershingviewer;
+	public static String command_deleteElement_confir_mremove_references_text;
+	public static String util_configurablecomposedadapter_unhandled_exception;
+	public static String util_ProcessUtil_err_same_breakdown_element;
+	public static String ui_UserInteractionHelper_wplistdlgtitle0;
+	public static String ui_UserInteractionHelper_wplistdlgtitle1;
+	public static String ui_UserInteractionHelper_rolelistdlgtitle0;
+	public static String ui_UserInteractionHelper_rolelistdlgtitle1;
+	public static String util_configurablecomposedadapter_fatalerr;
+	public static String ui_UserInteractionHelper_workproducts;
+	public static String util_ProcessUtil_err_same_sub_element;
+	public static String util_ProcessUtil_err_wrong_element;
+	public static String util_ProcessUtil_err_child_element;
+	public static String ui_UserInteractionHelper_tasks;
+	public static String ui_association_task_selection;
+	public static String util_ProcessUtil_childadapter;
+	public static String util_ProcessUtil_err_setparent;
+	public static String util_tngutil_cannot_edit_resource;
+	public static String util_ProcessUtil_contributesto;
+	public static String util_ProcessUtil_localContributesto;
+	public static String process_extends;
+	public static String process_replaces;
+	public static String process_localReplaces;
+	public static String FilterConstants_disciplines_text;
+	public static String FilterConstants_disciplinegroupings_text;
+	public static String FilterConstants_whitepapers_text;
+	public static String FilterConstants_toolmentors_text;
+	public static String FilterConstants_tools_text;
+	public static String FilterConstants_roles_text;
+	public static String FilterConstants_tasks_text;
+	public static String FilterConstants_reusableassets_text;
+	public static String FilterConstants_all_text;
+	public static String FilterConstants_processes_text;
+	public static String FilterConstants_practices_text;
+	public static String FilterConstants_templates_text;
+	public static String FilterConstants_workproducts_text;
+	public static String FilterConstants_checklists_text;
+	public static String FilterConstants_guidelines_text;
+	public static String FilterConstants_rolesets_text;
+	public static String FilterConstants_guidance_text;
+	public static String FilterConstants_concepts_text;
+	public static String FilterConstants_examples_text;
+	public static String FilterConstants_contentpackages_text;
+	public static String FilterConstants_roledescriptors_text;
+	public static String FilterConstants_rolesetgropuings_text;
+	public static String FilterConstants_taskdescriptors_text;
+	public static String FilterConstants_contentelements_text;
+	public static String ProcessAutoSynchronizeAction_prepare;
+	public static String FilterConstants_workproductdescriptors_text;
+	public static String FilterConstants_allcontentelements_text;
+	public static String FilterConstants_supportingmaterials_text;
+	public static String MethodElementAddCommand_errorSavingFiles;
+	public static String FilterConstants_customcategories_text;
+	public static String FilterConstants_workproducttypes_text;
+	public static String DeleteMethodElementCommand_warningMsg;
+	public static String FilterConstants_methodplugins_text;
+	public static String UserInteractionHelper_lockedPlugin;
+	public static String FilterConstants_domains_text;
+	public static String FilterConstants_roadmap_text;
+	public static String FilterConstants_reports_text;
+	public static String AutoSynchronizeCommand_label;
+	public static String ManualSynchronizeCommand_label;
+	public static String AutoSynchronizeCommand_sucessful;
+	public static String UserInteractionHelper_ProcessPackage_Name;
+	public static String newElement_text;
 
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given string.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data1
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String formatString(String key, Object data) {
-		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, LibraryEditResources.class);
 	}
-
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given string.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data1
-	 *            An object.
-	 * @param data2
-	 *            An object.
-	 * @return A formatted localized string.
-	 */
-	public static String formatString(String key, Object data1, Object data2) {
-		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data1, data2);
-	}
-
-	/**
-	 * Returns the localized string associated with a resource key and formatted
-	 * with a given string.
-	 * 
-	 * @param key
-	 *            A resource key.
-	 * @param data
-	 *            An array of objects.
-	 * @return A formatted localized string.
-	 */
-	public static String formatString(String key, Object[] data) {
-		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
-	}
-
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Resources.properties b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Resources.properties
index 740074f..842c220 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Resources.properties
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/Resources.properties
@@ -11,197 +11,200 @@
 # NLS_MESSAGEFORMAT_VAR
 
 # Generic Dialog Titles
-LibraryEdit.moveDialog.title=Move
-LibraryEdit.deleteDialog.title=Delete Element
-LibraryEdit.errorDialog.title=Error
-LibraryEdit.errorDialog.cannotRename=Cannot rename {0} ''{1}'' to ''{2}''. Resolve the issue shown in Details and click OK to continue or Cancel to abort this operation.
+moveDialog_title=Move
+deleteDialog_title=Delete Element
+errorDialog_title=Error
+errorDialog_cannotRename=Cannot rename {0} ''{1}'' to ''{2}''. Resolve the issue shown in Details and click OK to continue or Cancel to abort this operation.
 
 # Confirm References Removal Dialog
-LibraryEdit.deleteReferencesDialog.title=Confirm References Removal
-LibraryEdit.deleteReferencesDialog.text=The element(s) you are about to delete are still being referenced by other elements in the method library. Deleting these elements will remove references to them, therefore, will update the referring elements as well.  Make sure you have permission to update the referring elements before clicking OK.  Click Details to review the list of elements that reference the element(s) that you are about to delete.
+deleteReferencesDialog_title=Confirm References Removal
+deleteReferencesDialog_text=The element(s) you are about to delete are still being referenced by other elements in the method library. Deleting these elements will remove references to them, therefore, will update the referring elements as well.  Make sure you have permission to update the referring elements before clicking OK.  Click Details to review the list of elements that reference the element(s) that you are about to delete.
 
 # Resolve Name Conflict Dialog
-LibraryEdit.resolveNameConflictDialog.title=Resolve Element Name Conflict
-LibraryEdit.resolveNameConflictDialog.text=Enter a new {0} for ''{1}'':
+resolveNameConflictDialog_title=Resolve Element Name Conflict
+resolveNameConflictDialog_text=Enter a new {0} for ''{1}'':
 
 # Select Deliverables Dialog
-LibraryEdit.selectDeliverablesDialog.title=Select Deliverables
-LibraryEdit.selectDeliverablesDialog.text=Select a deliverable where you want work product ''{0}'' to be assigned.
+selectDeliverablesDialog_title=Select Deliverables
+selectDeliverablesDialog_text=Select a deliverable where you want work product ''{0}'' to be assigned.
 
 # New Process Component Dialog
-LibraryEdit.newProcessComponentDialog.title=New Process Component
-LibraryEdit.nameLabel.text=Name:
-LibraryEdit.defaultConfigLabel.text=Default Configuration:
-LibraryEdit.baseProcessLabel.text=Base Process:
-LibraryEdit.basedOnProcessesLabel.text=Based on Processes:
+newProcessComponentDialog_title=New Process Component
+nameLabel_text=Name:
+defaultConfigLabel_text=Default Configuration:
+baseProcessLabel_text=Base Process:
+basedOnProcessesLabel_text=Based on Processes:
 
 # Role Association Dialog
-LibraryEdit.selectAssociationLabel.text=Select association for the task ''{0}''
+selectAssociationLabel_text=Select association for the task ''{0}''
 
 # Remove Association dialog
-LibraryEdit.removeAssociationDialog.text=Remove Association
+removeAssociationDialog_text=Remove Association
 
 # Select Teams Dialog
-LibraryEdit.selectTeamsDialog.title=Select Teams
-LibraryEdit.selectTeamsDialog.text=Select a team where you want a role ''{0}'' to be assigned.
+selectTeamsDialog_title=Select Teams
+selectTeamsDialog_text=Select a team where you want a role ''{0}'' to be assigned.
 
 # Tasl Selection Dialog
-LibraryEdit.taskSelectionDialog.title=Task Selection
-LibraryEdit.titleLabel.text=Select tasks..
+taskSelectionDialog_title=Task Selection
+titleLabel_text=Select tasks..
 
 # Error Messages
-LibraryEdit.emptyElementNameError.msg=IUPL0100E: The {0} name is missing.\n\nAll method and process elements must have a name.\n\nEnter a valid name and try again.
-LibraryEdit.emptyElementNameError.simple.msg=The name cannot be empty. Please specify a valid name.
-LibraryEdit.duplicateElementNameError.msg=IUPL0101E: The name ''{0}'' already exists. \n\nA method element must have a unique name.\n\nEnter a different name and try again.
-LibraryEdit.duplicateElementNameError.simple.msg=The same element name already exits. Please specify another name.
-LibraryEdit.invalidElementNameError1.msg=IUPL0102E: The name ''{0}'' is invalid.\n\nA method element name cannot start with a space.\n\nEnter a valid name and try again.
-LibraryEdit.invalidElementNameError2.msg=IUPL0103E: The name ''{0}'' is invalid.\n\nA method element name cannot end with a period.\n\nEnter a valid name and try again.
-LibraryEdit.invalidElementNameError3.msg=IUPL0104E: The name ''{0}'' is invalid.\n\nA method element name cannot contain these characters: \\ / : * ? " < > |\n\nEnter a valid name and try again.
-LibraryEdit.noConfigError.msg=IUPL0105E: The current method library does not contain any method configuration.\n\nA method configuration is needed to create a new process.\n\nCreate a method configuration and try again.
-LibraryEdit.noDeliveryProcessError.msg=IUPL0106E: The current method library does not contain any delivery process.\n\nA base delivery process is needed to create a new process contribution.\n\nCreate a delivery process and try again.
-LibraryEdit.noDefaultConfigError.msg=IUPL0107E: No method configuration has been selected.\n\nA default method configuration must be assigned to the new process.\n\nSelect a method configuration and try again.
-LibraryEdit.noBaseProcessError.msg=IUPL0108E: No delivery process has been selected.\n\nA process contribution requires a base delivery process.\n\nSelect a delivery process and try again.
-LibraryEdit.createProcessError.msg=IUPL0109E: The process cannot be created successfully.
-LibraryEdit.createElementError.msg=IUPL0110E: The element cannot be created successfully.
-LibraryEdit.deleteElementError.msg=IUPL0111E: The element cannot be deleted successfully.
-LibraryEdit.duplicateContentFileError.msg=IUPL0112E: The content file for the element cannot be created.\n\nA file ''{0}'' already exists.\n\nEnter a different name and try again.
-LibraryEdit.duplicateContentFileError.simple.msg=A content file with the same name exits. Please specify another name.
-LibraryEdit.undoCommandError.msg=IUPL0113E: The undo command ''{0}'' cannot be completed.\n\nAn error has occurred: {1}
-LibraryEdit.invalidPredecessorError.msg=IUPL0114E: The specified predecessor index is invalid.\n\nA predecessor index must be an integer value from the 'Index' column.\n\nSpecify a valid value and try again.
-LibraryEdit.UserInteractionHelper.errRelationshipExists=IUPL0115E: ''{0}'' is already associated to ''{1}''.  Only one association of this kind is allowed.  To assign ''{0}'' to ''{2}'' you need to first remove it from ''{1}''.
-LibraryEdit.error.msgWithDetails=IUPL0116E: An error has occurred. Click Details for more information.
-LibraryEdit.error.msg=IUPL0117E: An error has occurred. See error log for more details.
-LibraryEdit.Suppression.nameDuplication=IUPL0118E: Name conflict will occur after this operation. Check element''s name for duplication and try again
-LibraryEdit.Suppression.presentationNameDuplication=IUPL0119E: Name conflict will occur after this operation. Check element''s presentation name for duplication and try again
+emptyElementNameError_msg=IUPL0100E: The {0} name is missing.\n\nAll method and process elements must have a name.\n\nEnter a valid name and try again.
+emptyElementNameError_simple_msg=The name cannot be empty. Please specify a valid name.
+duplicateElementNameError_msg=IUPL0101E: The name ''{0}'' already exists. \n\nA method element must have a unique name.\n\nEnter a different name and try again.
+duplicateElementNameError_simple_msg=The same element name already exits. Please specify another name.
+invalidElementNameError1_msg=IUPL0102E: The name ''{0}'' is invalid.\n\nA method element name cannot start with a space.\n\nEnter a valid name and try again.
+invalidElementNameError2_msg=IUPL0103E: The name ''{0}'' is invalid.\n\nA method element name cannot end with a period.\n\nEnter a valid name and try again.
+invalidElementNameError3_msg=IUPL0104E: The name ''{0}'' is invalid.\n\nA method element name cannot contain these characters: \\ / : * ? " < > |\n\nEnter a valid name and try again.
+noConfigError_msg=IUPL0105E: The current method library does not contain any method configuration.\n\nA method configuration is needed to create a new process.\n\nCreate a method configuration and try again.
+noDeliveryProcessError_msg=IUPL0106E: The current method library does not contain any delivery process.\n\nA base delivery process is needed to create a new process contribution.\n\nCreate a delivery process and try again.
+noDefaultConfigError_msg=IUPL0107E: No method configuration has been selected.\n\nA default method configuration must be assigned to the new process.\n\nSelect a method configuration and try again.
+noBaseProcessError_msg=IUPL0108E: No delivery process has been selected.\n\nA process contribution requires a base delivery process.\n\nSelect a delivery process and try again.
+createProcessError_msg=IUPL0109E: The process cannot be created successfully.
+createElementError_msg=IUPL0110E: The element cannot be created successfully.
+deleteElementError_msg=IUPL0111E: The element cannot be deleted successfully.
+duplicateContentFileError_msg=IUPL0112E: The content file for the element cannot be created.\n\nA file ''{0}'' already exists.\n\nEnter a different name and try again.
+duplicateContentFileError_simple_msg=A content file with the same name exits. Please specify another name.
+undoCommandError_msg=IUPL0113E: The undo command ''{0}'' cannot be completed.\n\nAn error has occurred: {1}
+invalidPredecessorError_msg=IUPL0114E: The specified predecessor index is invalid.\n\nA predecessor index must be an integer value from the 'Index' column.\n\nSpecify a valid value and try again.
+UserInteractionHelper_errRelationshipExists=IUPL0115E: ''{0}'' is already associated to ''{1}''.  Only one association of this kind is allowed.  To assign ''{0}'' to ''{2}'' you need to first remove it from ''{1}''.
+error_msgWithDetails=IUPL0116E: An error has occurred. Click Details for more information.
+error_msg=IUPL0117E: An error has occurred. See error log for more details.
+Suppression_nameDuplication=IUPL0118E: Name conflict will occur after this operation. Check element''s name for duplication and try again
+Suppression_presentationNameDuplication=IUPL0119E: Name conflict will occur after this operation. Check element''s presentation name for duplication and try again
 
 # Error Reasons
-LibraryEdit.error.reason=An error has occurred. Click Details for more information.
-LibraryEdit.saveProcessError.reason=An error has occurred while saving the process ''{0}''. Click Details for more information.
-LibraryEdit.deleteReferencesError.reason=An error has occurred while removing references associated with this element. Click Details for more information.
-LibraryEdit.saveFileError.reason=An error has occurred while saving the file ''{0}''. Click Details for more information.
-LibraryEdit.invalidReferencesError.reason=Detected method elements with invalid references as a result of cross-plugin copy.\nThese references will be removed. Do you want to continue?
-LibraryEdit.unresolvedObjectError.reason=Cannot modify an unresolved object: {0}(URI = {1}){2}
+error_reason=An error has occurred. Click Details for more information.
+saveProcessError_reason=An error has occurred while saving the process ''{0}''. Click Details for more information.
+deleteReferencesError_reason=An error has occurred while removing references associated with this element. Click Details for more information.
+saveFileError_reason=An error has occurred while saving the file ''{0}''. Click Details for more information.
+invalidReferencesError_reason=Detected method elements with invalid references as a result of cross-plugin copy.\nThese references will be removed. Do you want to continue?
+unresolvedObjectError_reason=Cannot modify an unresolved object: {0}(URI = {1}){2}
 
 # Warning messages
-LibraryEdit.MethodElementAddCommand.originalNotFoundWarning.msg=IUPL0118W: Could not find one or more source elements. Associated files in the resources folder will not be copied.
-LibraryEdit.ActivityAddCommand.originalNotFoundWarning.msg=IUPL0119W: Could not find one or more source elements. Associated Process Packages will not be copied.
+MethodElementAddCommand_originalNotFoundWarning_msg=IUPL0118W: Could not find one or more source elements. Associated files in the resources folder will not be copied.
+ActivityAddCommand_originalNotFoundWarning_msg=IUPL0119W: Could not find one or more source elements. Associated Process Packages will not be copied.
+ActivityDropCommand_deepCopy_promptConfigurationMsg=Do you want to copy all descriptors?\n\nClicking on No will copy only the descriptors that are part of the current configuration.
+deepCopy_promptMsg=You will get a copy of all dynamically linked elements that you needs to maintain separately from now on. Do you want to continue?
+deepCopy_title=Deep Copy
 
 # Progress messages
-LibraryEdit.creatingProcessComponentTask.name=Creating process component ''{0}''...
-LibraryEdit.processingReferencesTask.name=Processing references...
-LibraryEdit.deletingElementsTask.name=Deleting elements and associated files...
-LibraryEdit.checkingReferencesTask.name=Checking for references...
-LibraryEdit.removingReferencestask.name=Removing references...
-LibraryEdit.savingModifiedFilesTask.name=Saving modified file(s)...
-LibraryEdit.checkAffectedResourcesTask.name=Checking affected resources...
-LibraryEdit.movingTask.name=Moving...
-LibraryEdit.movingFilesTask.name=Moving files...
-LibraryEdit.copyingResourcesTask.name=Copying resources...
-LibraryEdit.savingFileTask.name=Saving file ''{0}''...
+creatingProcessComponentTask_name=Creating process component ''{0}''...
+processingReferencesTask_name=Processing references...
+deletingElementsTask_name=Deleting elements and associated files...
+checkingReferencesTask_name=Checking for references...
+removingReferencestask_name=Removing references...
+savingModifiedFilesTask_name=Saving modified file(s)...
+checkAffectedResourcesTask_name=Checking affected resources...
+movingTask_name=Moving...
+movingFilesTask_name=Moving files...
+copyingResourcesTask_name=Copying resources...
+savingFileTask_name=Saving file ''{0}''...
 
 # UI Text
-LibraryEdit.element.text=element
-LibraryEdit.createElement.text=Create Element
-LibraryEdit.newElement.text=New
-LibraryEdit.createProcess.text=Create Process
-LibraryEdit.contributesTo.text=Contributes to
-LibraryEdit.localContributesTo.text=Locally Contributes to
-LibraryEdit.extends.text=Extends
-LibraryEdit.replaces.text=Replaces
-LibraryEdit.localReplaces.text=Locally Replaces
-LibraryEdit.elementType.text={0}: {1}
-LibraryEdit.deliverables.text=Deliverables
-LibraryEdit.contributeToActivity.text=Contribute To Activity
-LibraryEdit.ActivityDropCommand.label=Drop Activity
-LibraryEdit.replaceActivity.text=Replace Activity
-LibraryEdit.file.text=file
-LibraryEdit.directory.text=directory
-LibraryEdit.unresolved.text=(unresolved ''{0}'')
-LibraryEdit.assists.text=Assists
-LibraryEdit.unknown.text=Unknown
-LibraryEdit.command.done=Done
+element_text=element
+createElement_text=Create Element
+createProcess_text=Create Process
+contributesTo_text=Contributes to
+localContributesTo_text=Locally Contributes to
+extends_text=Extends
+replaces_text=Replaces
+localReplaces_text=Locally Replaces
+localReplacementAndDeepCopy_text=Local Replacement and Deep Copy
+elementType_text={0}: {1}
+deliverables_text=Deliverables
+contributeToActivity_text=Contribute To Activity
+ActivityDropCommand_label=Drop Activity
+replaceActivity_text=Replace Activity
+file_text=file
+directory_text=directory
+unresolved_text=(unresolved ''{0}'')
+assists_text=Assists
+unknown_text=Unknown
+command_done=Done
 
 # The following UI text should be reviewed.
-LibraryEdit.Util.labelpath.variabilitywithplugin.info={0} ({1} ''{2}'' in ''{3}'')
-LibraryEdit.Util.labelpath.variability.info={0} ({1} ''{2}'')
-LibraryEdit.ui.ref_delete=The descriptor ''{0}'' has the following references which are not used anywhere.\nSelect the ones which you would like to delete:
-LibraryEdit.ui.ref_delete2=These following references are not being used anywhere.\nSelect the ones which you would like to delete: 
-LibraryEdit.ui.references=References
-LibraryEdit.ui.workproduct_descriptor_description=Work product descriptor ''{0}'' is associated (Output From) with task descriptor ''{1}'' 
-LibraryEdit.ui.workproductdescriptor_options=Options
-LibraryEdit.ui.workproductdescriptor_outputlabel=Remove work product descriptor as output of the task descriptor
-LibraryEdit.ui.workproductdescriptor_delete_task=Delete task descriptor from the activity
-LibraryEdit.ui.UserInteractionHelper.defaultconfigcheck=The selected element ''{0}'' is not in the default configuration of your process.\nDo you want to add it and its dependencies to the default configuration?
-LibraryEdit.ui.UserInteractionHelper.genericErr.message.text=Errors occured in the operation. Click on details for more information
-LibraryEdit.ProcessAutoSynchronizeAction.noDescriptorToSynch=No descriptor with linked method element found to synchronize
-LibraryEdit.util.configurablecomposedadapter.refershingviewer=Error refreshing viewer
-LibraryEdit.command.deleteElement.confir.mremove.references.text=Illegal refernece(s) exist. Click on Details for more information.\n\nClick OK to remove them automatically. Close this dialog to quit.
-LibraryEdit.util.configurablecomposedadapter.unhandled.exception=Unhandled exception
-LibraryEdit.util.ProcessUtil.err_same_breakdown_element=Cannot have the same breakdown element as predecessor and successor
-LibraryEdit.ui.UserInteractionHelper.wplistdlgtitle0=The work product "
-LibraryEdit.ui.UserInteractionHelper.wplistdlgtitle1=" is an output to the following tasks.\nSelect the tasks for which you would like to create the corresponding descriptors.
-LibraryEdit.ui.UserInteractionHelper.rolelistdlgtitle0=The role "
-LibraryEdit.ui.UserInteractionHelper.rolelistdlgtitle1=" has the following responsible work products.\nSelect the work products for which you would like to create the corresponding descriptors.
-LibraryEdit.util.configurablecomposedadapter.fatalerr=Fatal error
-LibraryEdit.ui.UserInteractionHelper.workproducts=Work Products
-LibraryEdit.util.ProcessUtil.err_same_sub_element=Cannot link a breakdown element to one of its subelement
-LibraryEdit.util.ProcessUtil.err_wrong_element=Cannot link to element other than work breakdown element.
-LibraryEdit.util.ProcessUtil.err_child_element=Cannot link a breakdown element to one of its children.
-LibraryEdit.ui.UserInteractionHelper.tasks=Tasks
-LibraryEdit.ui.association_task_selection=Task Selection...
-LibraryEdit.util.ProcessUtil.childadapter=\ \ child's adapter: 
+Util_labelpath_variabilitywithplugin_info={0} ({1} ''{2}'' in ''{3}'')
+Util_labelpath_variability_info={0} ({1} ''{2}'')
+ui_ref_delete=The descriptor ''{0}'' has the following references which are not used anywhere.\nSelect the ones which you would like to delete:
+ui_ref_delete2=These following references are not being used anywhere.\nSelect the ones which you would like to delete:
+ui_references=References
+ui_workproduct_descriptor_description=Work product descriptor ''{0}'' is associated (Output From) with task descriptor ''{1}''
+ui_workproductdescriptor_options=Options
+ui_workproductdescriptor_outputlabel=Remove work product descriptor as output of the task descriptor
+ui_workproductdescriptor_delete_task=Delete task descriptor from the activity
+ui_UserInteractionHelper_defaultconfigcheck=The selected element ''{0}'' is not in the default configuration of your process.\nDo you want to add it and its dependencies to the default configuration?
+ui_UserInteractionHelper_genericErr_message_text=Errors occured in the operation. Click on details for more information
+ProcessAutoSynchronizeAction_noDescriptorToSynch=No descriptor with linked method element found to synchronize
+util_configurablecomposedadapter_refershingviewer=Error refreshing viewer
+command_deleteElement_confir_mremove_references_text=Illegal refernece(s) exist. Click on Details for more information.\n\nClick OK to remove them automatically. Close this dialog to quit.
+util_configurablecomposedadapter_unhandled_exception=Unhandled exception
+util_ProcessUtil_err_same_breakdown_element=Cannot have the same breakdown element as predecessor and successor
+ui_UserInteractionHelper_wplistdlgtitle0=The work product "
+ui_UserInteractionHelper_wplistdlgtitle1=" is an output to the following tasks.\nSelect the tasks for which you would like to create the corresponding descriptors.
+ui_UserInteractionHelper_rolelistdlgtitle0=The role "
+ui_UserInteractionHelper_rolelistdlgtitle1=" has the following responsible work products.\nSelect the work products for which you would like to create the corresponding descriptors.
+util_configurablecomposedadapter_fatalerr=Fatal error
+ui_UserInteractionHelper_workproducts=Work Products
+util_ProcessUtil_err_same_sub_element=Cannot link a breakdown element to one of its subelement
+util_ProcessUtil_err_wrong_element=Cannot link to element other than work breakdown element.
+util_ProcessUtil_err_child_element=Cannot link a breakdown element to one of its children.
+ui_UserInteractionHelper_tasks=Tasks
+ui_association_task_selection=Task Selection...
+util_ProcessUtil_childadapter=\ \ child's adapter:
 
-LibraryEdit.util.ProcessUtil.err_setparent=Could not set parent for child 
-LibraryEdit.util.tngutil.cannot_edit_resource=Cannot edit resource.
-LibraryEdit.util.ProcessUtil.contributesto=contributes to ''{0}''
-LibraryEdit.util.ProcessUtil.localContributesto=locally contributes to ''{0}''
-LibraryEdit.process.extends=extends ''{0}''
-LibraryEdit.process.replaces=replaces ''{0}''
-LibraryEdit.process.localReplaces=locally replaces ''{0}''
+util_ProcessUtil_err_setparent=Could not set parent for child
+util_tngutil_cannot_edit_resource=Cannot edit resource.
+util_ProcessUtil_contributesto=contributes to ''{0}''
+util_ProcessUtil_localContributesto=locally contributes to ''{0}''
+process_extends=extends ''{0}''
+process_replaces=replaces ''{0}''
+process_localReplaces=locally replaces ''{0}''
 # Filter constants externalized strings.
-LibraryEdit.FilterConstants.disciplines.text=Disciplines
-LibraryEdit.FilterConstants.disciplinegroupings.text=Discipline Groupings
-LibraryEdit.FilterConstants.whitepapers.text=Whitepapers
-LibraryEdit.FilterConstants.toolmentors.text=Tool Mentors
-LibraryEdit.FilterConstants.tools.text=Tools
-LibraryEdit.FilterConstants.roles.text=Roles
-LibraryEdit.FilterConstants.tasks.text=Tasks
-LibraryEdit.FilterConstants.reusableassets.text=Reusable Assets
-LibraryEdit.FilterConstants.all.text=All
-LibraryEdit.FilterConstants.processes.text=Processes
-LibraryEdit.FilterConstants.practices.text=Practices
-LibraryEdit.FilterConstants.templates.text=Templates
-LibraryEdit.FilterConstants.workproducts.text=Work Products
-LibraryEdit.FilterConstants.checklists.text=Checklists
-LibraryEdit.FilterConstants.guidelines.text=Guidelines
-LibraryEdit.FilterConstants.rolesets.text=Role Sets
-LibraryEdit.FilterConstants.guidance.text=Guidance
-LibraryEdit.FilterConstants.concepts.text=Concepts
-LibraryEdit.FilterConstants.examples.text=Examples
-LibraryEdit.FilterConstants.contentpackages.text=Content Packages
-LibraryEdit.FilterConstants.roledescriptors.text=Role Descriptors
-LibraryEdit.FilterConstants.rolesetgropuings.text=Role Set Groupings
-LibraryEdit.FilterConstants.taskdescriptors.text=Task Descriptors
-LibraryEdit.FilterConstants.contentelements.text=Content Elements
-LibraryEdit.ProcessAutoSynchronizeAction.prepare=Preparing synchronization...
-LibraryEdit.FilterConstants.workproductdescriptors.text=Work Product Descriptors
-LibraryEdit.FilterConstants.allcontentelements.text=All Content Elements
-LibraryEdit.FilterConstants.supportingmaterials.text=Supporting Materials
-LibraryEdit.MethodElementAddCommand.errorSavingFiles=Error saving file(s)
-LibraryEdit.FilterConstants.customcategories.text=Custom Categories
-LibraryEdit.FilterConstants.workproducttypes.text=Work Product Kinds
-LibraryEdit.DeleteMethodElementCommand.warningMsg=Deletion completed with warning
-LibraryEdit.FilterConstants.methodplugins.text=Method Plug-ins
-LibraryEdit.UserInteractionHelper.lockedPlugin=IUPL0120E: The plugin ''{0}'' is locked.
-LibraryEdit.FilterConstants.domains.text=Domains
-LibraryEdit.FilterConstants.roadmap.text=Roadmaps
-LibraryEdit.FilterConstants.reports.text=Reports
-LibraryEdit.AutoSynchronizeCommand.label=Default Synchronization from Method Content
-LibraryEdit.ManualSynchronizeCommand.label=Custom Synchronization...
-LibraryEdit.AutoSynchronizeCommand.sucessful=Synchronization has been completed successfully.
+FilterConstants_disciplines_text=Disciplines
+FilterConstants_disciplinegroupings_text=Discipline Groupings
+FilterConstants_whitepapers_text=Whitepapers
+FilterConstants_toolmentors_text=Tool Mentors
+FilterConstants_tools_text=Tools
+FilterConstants_roles_text=Roles
+FilterConstants_tasks_text=Tasks
+FilterConstants_reusableassets_text=Reusable Assets
+FilterConstants_all_text=All
+FilterConstants_processes_text=Processes
+FilterConstants_practices_text=Practices
+FilterConstants_templates_text=Templates
+FilterConstants_workproducts_text=Work Products
+FilterConstants_checklists_text=Checklists
+FilterConstants_guidelines_text=Guidelines
+FilterConstants_rolesets_text=Role Sets
+FilterConstants_guidance_text=Guidance
+FilterConstants_concepts_text=Concepts
+FilterConstants_examples_text=Examples
+FilterConstants_contentpackages_text=Content Packages
+FilterConstants_roledescriptors_text=Role Descriptors
+FilterConstants_rolesetgropuings_text=Role Set Groupings
+FilterConstants_taskdescriptors_text=Task Descriptors
+FilterConstants_contentelements_text=Content Elements
+ProcessAutoSynchronizeAction_prepare=Preparing synchronization...
+FilterConstants_workproductdescriptors_text=Work Product Descriptors
+FilterConstants_allcontentelements_text=All Content Elements
+FilterConstants_supportingmaterials_text=Supporting Materials
+MethodElementAddCommand_errorSavingFiles=Error saving file(s)
+FilterConstants_customcategories_text=Custom Categories
+FilterConstants_workproducttypes_text=Work Product Kinds
+DeleteMethodElementCommand_warningMsg=Deletion completed with warning
+FilterConstants_methodplugins_text=Method Plug-ins
+UserInteractionHelper_lockedPlugin=IUPL0120E: The plugin ''{0}'' is locked.
+FilterConstants_domains_text=Domains
+FilterConstants_roadmap_text=Roadmaps
+FilterConstants_reports_text=Reports
+AutoSynchronizeCommand_label=Default Synchronization from Method Content
+ManualSynchronizeCommand_label=Custom Synchronization...
+AutoSynchronizeCommand_sucessful=Synchronization has been completed successfully.
 
 # UserInteractionHelper
-LibraryEdit.UserInteractionHelper.ProcessPackage.Name=Name:
+UserInteractionHelper_ProcessPackage_Name=Name:
 
 # MethodCreateChildCommand
-LibraryEdit.newElement.text=New {0}
+newElement_text=New {0}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/DeleteMethodElementCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/DeleteMethodElementCommand.java
index 29a87a2..cac8212 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/DeleteMethodElementCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/DeleteMethodElementCommand.java
@@ -55,6 +55,7 @@
 import org.eclipse.epf.uma.util.IMethodLibraryPersister.FailSafeMethodLibraryPersister;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.widgets.Display;
 
@@ -155,8 +156,7 @@
 			}
 
 		};
-		UserInteractionHelper.runWithProgress(runnable, LibraryEditResources
-				.getString("LibraryEdit.processingReferencesTask.name")); //$NON-NLS-1$
+		UserInteractionHelper.runWithProgress(runnable, LibraryEditResources.processingReferencesTask_name); //$NON-NLS-1$
 
 		// confirm with user before removing illegal references
 		//
@@ -192,9 +192,7 @@
 					LibraryEditPlugin.INSTANCE.getSymbolicName(), 0, "", null); //$NON-NLS-1$
 			for (Iterator iter = referencers.iterator(); iter.hasNext();) {
 				MethodElement e = (MethodElement) iter.next();
-				String msg = LibraryEditResources
-						.formatString(
-								"LibraryEdit.elementType.text", e.eClass().getName(), TngUtil.getLabelWithPath(e)); //$NON-NLS-1$
+				String msg = NLS.bind(LibraryEditResources.elementType_text, e.eClass().getName(), TngUtil.getLabelWithPath(e)); 
 				IStatus status = new Status(IStatus.INFO,
 						LibraryEditPlugin.INSTANCE.getSymbolicName(), 0, msg,
 						null);
@@ -205,10 +203,8 @@
 					.getDefault()
 					.getMsgDialog()
 					.displayConfirmation(
-							LibraryEditResources
-									.getString("LibraryEdit.deleteReferencesDialog.title"), //$NON-NLS-1$
-							LibraryEditResources
-									.getString("LibraryEdit.deleteReferencesDialog.text"), //$NON-NLS-1$
+							LibraryEditResources.deleteReferencesDialog_title, //$NON-NLS-1$
+							LibraryEditResources.deleteReferencesDialog_text, //$NON-NLS-1$
 							multiStatus) == Dialog.CANCEL) { //$NON-NLS-1$
 				return;
 			}
@@ -219,10 +215,8 @@
 				IStatus status = UserInteractionHelper.checkModify((EObject) iter.next(), MsgBox.getDefaultShell());
 				if (!status.isOK()) {
 					LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-							LibraryEditResources
-									.getString("LibraryEdit.deleteDialog.title"), //$NON-NLS-1$
-							LibraryEditResources
-									.getString("LibraryEdit.deleteElementError.msg"), //$NON-NLS-1$
+							LibraryEditResources.deleteDialog_title, //$NON-NLS-1$
+							LibraryEditResources.deleteElementError_msg, //$NON-NLS-1$
 							status);
 					return;
 				}
@@ -260,12 +254,9 @@
 					.getDefault()
 					.getMsgDialog()
 					.displayError(
-							LibraryEditResources
-									.getString("LibraryEdit.deleteDialog.title"), //$NON-NLS-1$
-							LibraryEditResources
-									.getString("LibraryEdit.deleteElementError.msg"), //$NON-NLS-1$
-							LibraryEditResources
-									.getString("LibraryEdit.deleteReferencesError.reason"), //$NON-NLS-1$
+							LibraryEditResources.deleteDialog_title, //$NON-NLS-1$
+							LibraryEditResources.deleteElementError_msg, //$NON-NLS-1$
+							LibraryEditResources.deleteReferencesError_reason, //$NON-NLS-1$
 							exceptions[0]);
 			undo();
 			return;
@@ -279,10 +270,8 @@
 				MsgBox.getDefaultShell());
 		if (!status.isOK()) {
 			LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-					LibraryEditResources
-							.getString("LibraryEdit.deleteDialog.title"), //$NON-NLS-1$
-					LibraryEditResources
-							.getString("LibraryEdit.deleteElementError.msg"), //$NON-NLS-1$
+					LibraryEditResources.deleteDialog_title, //$NON-NLS-1$
+					LibraryEditResources.deleteElementError_msg, //$NON-NLS-1$
 					status);
 			undo();
 			return;
@@ -342,8 +331,7 @@
 		};
 
 		if (!UserInteractionHelper.runWithProgress(runnable,
-				LibraryEditResources
-						.getString("LibraryEdit.deletingElementsTask.name"))) { //$NON-NLS-1$
+				LibraryEditResources.deletingElementsTask_name)) { //$NON-NLS-1$
 			if (failed) {
 				notifyFailure();
 			} else {
@@ -356,8 +344,8 @@
 			notifyExecuted();
 			List warnings = persister.getWarnings();
 			if(!warnings.isEmpty()) {
-				String title = LibraryEditResources.getString("LibraryEdit.deleteDialog.title"); //$NON-NLS-1$
-				String msg = LibraryEditResources.getString("LibraryEdit.DeleteMethodElementCommand.warningMsg"); //$NON-NLS-1$
+				String title = LibraryEditResources.deleteDialog_title; 
+				String msg = LibraryEditResources.DeleteMethodElementCommand_warningMsg; 
 				StringBuffer reason = new StringBuffer();
 				for (Iterator iter = warnings.iterator(); iter.hasNext();) {
 					Exception e = (Exception) iter.next();
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/FullyRevertibleCommandStack.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/FullyRevertibleCommandStack.java
index 308e9a7..f5fef91 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/FullyRevertibleCommandStack.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/FullyRevertibleCommandStack.java
@@ -23,6 +23,7 @@
 import org.eclipse.epf.library.edit.LibraryEditResources;
 import org.eclipse.epf.library.edit.process.command.BSDragAndDropCommand;
 import org.eclipse.epf.library.edit.util.TngUtil;
+import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -130,8 +131,7 @@
 					Object[] object = new Object[1];
 					object[0] = command;
 					object[1] = exception;
-					errReporter.showError(LibraryEditResources.formatString(
-							"LibraryEdit.undoCommandError.msg", object)); //$NON-NLS-1$
+					errReporter.showError(NLS.bind(LibraryEditResources.undoCommandError_msg, object)); 
 				}
 			}
 			notifyListeners(new CommandStackChangedEvent(this,
@@ -162,9 +162,7 @@
 						object[0] = command;
 						object[1] = exception;
 						errReporter
-								.showError(LibraryEditResources
-										.formatString(
-												"LibraryEdit.undoCommandError.msg", object)); //$NON-NLS-1$
+								.showError(NLS.bind(LibraryEditResources.undoCommandError_msg, object)); 
 					}
 
 					return false;
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementAddCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementAddCommand.java
index fd3db21..5f53cd7 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementAddCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementAddCommand.java
@@ -77,6 +77,7 @@
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.operation.ModalContext;
 import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
@@ -146,8 +147,7 @@
 	}
 	
 	private void handleError(IStatus errorStatus) {
-		String msg = LibraryEditResources
-		.getString("LibraryEdit.createElementError.msg"); //$NON-NLS-1$
+		String msg = LibraryEditResources.createElementError_msg; //$NON-NLS-1$
 		LibraryEditPlugin.getDefault().getMsgDialog().displayError(
 				getLabel(), msg, errorStatus);
 		status.add(errorStatus);
@@ -668,10 +668,8 @@
 				// new name required, check if the element can be modified
 				//
 				IStatus status = UserInteractionHelper.checkModify(e, MsgBox.getDefaultShell());
-				String title = LibraryEditResources
-						.getString("LibraryEdit.errorDialog.title"); //$NON-NLS-1$
-				String msg = MessageFormat.format(LibraryEditResources
-						.getString("LibraryEdit.errorDialog.cannotRename") //$NON-NLS-1$
+				String title = LibraryEditResources.errorDialog_title; //$NON-NLS-1$
+				String msg = MessageFormat.format(LibraryEditResources.errorDialog_cannotRename
 						, new Object[] { TngUtil.getTypeText(e), e.getName(),
 								newName });
 				while (!status.isOK()) {
@@ -714,11 +712,8 @@
 			String msg = strValidator.isValid(str);
 			if (msg != null) {
 				String featureTxt = TngUtil.getFeatureText(feature);
-				String title = LibraryEditResources
-						.getString("LibraryEdit.resolveNameConflictDialog.title"); //$NON-NLS-1$			
-				String dlgMsg = LibraryEditResources
-						.formatString(
-								"LibraryEdit.resolveNameConflictDialog.text", StrUtil.toLower(featureTxt), e.getName()); //$NON-NLS-1$
+				String title = LibraryEditResources.resolveNameConflictDialog_title; //$NON-NLS-1$			
+				String dlgMsg = NLS.bind(LibraryEditResources.resolveNameConflictDialog_text, StrUtil.toLower(featureTxt), e.getName()); 
 				String currentValue = (String) e.eGet(feature);
 
 				IInputValidator inputValidator = new IInputValidator() {
@@ -808,8 +803,7 @@
 		}
 
 		if (removeXRefRequired) {
-			return LibraryEditResources
-					.getString("LibraryEdit.invalidReferencesError.reason"); //$NON-NLS-1$
+			return LibraryEditResources.invalidReferencesError_reason; //$NON-NLS-1$
 		}
 		return null;
 	}
@@ -826,9 +820,7 @@
 				persister.save(resource);
 				canUndo = false;
 			} catch (Exception e) {
-				String msg = LibraryEditResources
-						.formatString(
-								"LibraryEdit.saveFileError.reason", resource.getURI().toFileString()); //$NON-NLS-1$
+				String msg = NLS.bind(LibraryEditResources.saveFileError_reason, resource.getURI().toFileString()); 
 				status.add(new SaveStatus(IStatus.ERROR,
 						LibraryEditPlugin.INSTANCE.getSymbolicName(),
 						SaveStatus.SAVE_ERROR, msg, e));
@@ -850,9 +842,7 @@
 						try {
 							persister.save(resource);
 						} catch (Exception e) {
-							String msg = LibraryEditResources
-									.formatString(
-											"LibraryEdit.saveFileError.reason", resource.getURI().toFileString()); //$NON-NLS-1$
+							String msg = NLS.bind(LibraryEditResources.saveFileError_reason, resource.getURI().toFileString()); 
 							status.add(new SaveStatus(IStatus.ERROR,
 									LibraryEditPlugin.INSTANCE
 											.getSymbolicName(),
@@ -953,8 +943,7 @@
 						.getMsgDialog()
 						.displayWarning(
 								getLabel(),
-								LibraryEditResources
-										.getString("LibraryEdit.MethodElementAddCommand.originalNotFoundWarning.msg")); //$NON-NLS-1$
+								LibraryEditResources.MethodElementAddCommand_originalNotFoundWarning_msg); //$NON-NLS-1$
 			}
 
 			final StringBuffer msgBuff = new StringBuffer();
@@ -978,8 +967,7 @@
 				UserInteractionHelper
 						.runWithProgress(
 								operation,
-								LibraryEditResources
-										.getString("LibraryEdit.checkingReferencesTask.name")); //$NON-NLS-1$
+								LibraryEditResources.checkingReferencesTask_name); //$NON-NLS-1$
 			} else {
 				try {
 					operation.run(defaultMonitor);
@@ -1000,8 +988,7 @@
 			status = new MultiStatus(
 					LibraryEditPlugin.INSTANCE.getSymbolicName(),
 					IStatus.OK,
-					LibraryEditResources
-							.getString("LibraryEdit.MethodElementAddCommand.errorSavingFiles"), null); //$NON-NLS-1$
+					LibraryEditResources.MethodElementAddCommand_errorSavingFiles, null); //$NON-NLS-1$
 			operation = new IRunnableWithProgress() {
 
 				public void run(IProgressMonitor monitor) {
@@ -1021,8 +1008,7 @@
 					superExecute();
 
 					monitor
-							.subTask(LibraryEditResources
-									.getString("LibraryEdit.savingModifiedFilesTask.name")); //$NON-NLS-1$										
+							.subTask(LibraryEditResources.savingModifiedFilesTask_name); //$NON-NLS-1$										
 					saveModifiedResources();
 
 					if (!status.isOK()) {
@@ -1051,15 +1037,14 @@
 			if (!status.isOK()) {
 				LibraryEditPlugin.getDefault().getMsgDialog().displayError(
 						getLabel(),
-						LibraryEditResources
-								.getString("LibraryEdit.error.msgWithDetails"), //$NON-NLS-1$
+						LibraryEditResources.error_msgWithDetails, //$NON-NLS-1$
 						status);
 				return;
 			}
 		} catch (RuntimeException e) {
 			LibraryEditPlugin.getDefault().getMsgDialog().displayError(
 					getLabel(),
-					LibraryEditResources.getString("LibraryEdit.error.msg"), //$NON-NLS-1$
+					LibraryEditResources.error_msg, 
 					e);
 		}
 	}
@@ -1337,8 +1322,7 @@
 			state = STATE_START;
 
 			status = new MultiStatus(LibraryEditPlugin.INSTANCE
-					.getSymbolicName(), IStatus.OK, LibraryEditResources
-					.getString("LibraryEdit.error.reason"), null); //$NON-NLS-1$
+					.getSymbolicName(), IStatus.OK, LibraryEditResources.error_reason, null); //$NON-NLS-1$
 
 			if (checkName()) {
 				// check if the configurations that will be updated after this command can be modified
@@ -1349,8 +1333,7 @@
 					.getDefault()
 					.getMsgDialog()
 					.displayError(
-							LibraryEditResources
-							.getString("LibraryEdit.moveDialog.title"), //$NON-NLS-1$
+							LibraryEditResources.moveDialog_title, //$NON-NLS-1$
 							execStatus);
 					return;
 				}
@@ -1362,8 +1345,7 @@
 							throws InvocationTargetException,
 							InterruptedException {
 						monitor
-								.subTask(LibraryEditResources
-										.getString("LibraryEdit.checkingReferencesTask.name")); //$NON-NLS-1$
+								.subTask(LibraryEditResources.checkingReferencesTask_name); //$NON-NLS-1$
 						String msg = checkForIllegalReferences();
 						if (msg != null) {
 							msgBuffer.append(msg);
@@ -1424,8 +1406,7 @@
 								throws InvocationTargetException,
 								InterruptedException {
 							monitor
-									.subTask(LibraryEditResources
-											.getString("LibraryEdit.checkAffectedResourcesTask.name")); //$NON-NLS-1$
+									.subTask(LibraryEditResources.checkAffectedResourcesTask_name); //$NON-NLS-1$
 							modifiedResources = illegalReferenceRemover
 									.getAffectedResources();
 						}
@@ -1458,16 +1439,14 @@
 								.getDefault()
 								.getMsgDialog()
 								.displayError(
-										LibraryEditResources
-												.getString("LibraryEdit.moveDialog.title"), //$NON-NLS-1$
+										LibraryEditResources.moveDialog_title, //$NON-NLS-1$
 										execStatus);
 						return;
 					}
 
 					try {
 						monitor
-								.subTask(LibraryEditResources
-										.getString("LibraryEdit.removingReferencestask.name")); //$NON-NLS-1$
+								.subTask(LibraryEditResources.removingReferencestask_name); //$NON-NLS-1$
 						illegalReferenceRemover.removeIllegalReferences();
 					} catch (Exception e) {
 						undo();
@@ -1507,8 +1486,7 @@
 					public void run(IProgressMonitor monitor)
 							throws InvocationTargetException,
 							InterruptedException {
-						monitor.setTaskName(LibraryEditResources
-								.getString("LibraryEdit.movingTask.name")); //$NON-NLS-1$
+						monitor.setTaskName(LibraryEditResources.movingTask_name); //$NON-NLS-1$
 						doMove(monitor, elementToOldResourceMap,
 								modifiedResources);
 					}
@@ -1542,8 +1520,7 @@
 						resources, shell);
 				if (!execStatus.isOK()) {
 					LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-							LibraryEditResources
-									.getString("LibraryEdit.moveDialog.title"), //$NON-NLS-1$
+							LibraryEditResources.moveDialog_title, //$NON-NLS-1$
 							execStatus);
 					undo();
 					return;
@@ -1674,8 +1651,7 @@
 				}
 			}
 			if (removeXRefRequired || isRefenrecedIllegally) {
-				return LibraryEditResources
-						.getString("LibraryEdit.invalidReferencesError.reason"); //$NON-NLS-1$
+				return LibraryEditResources.invalidReferencesError_reason; //$NON-NLS-1$
 			}
 			return null;
 		}
@@ -1776,19 +1752,16 @@
 			MultiStatus status = new MultiStatus(
 					LibraryEditPlugin.INSTANCE.getSymbolicName(),
 					IStatus.OK,
-					LibraryEditResources
-							.getString("LibraryEdit.MethodElementAddCommand.errorSavingFiles"), null); //$NON-NLS-1$
+					LibraryEditResources.MethodElementAddCommand_errorSavingFiles, null); //$NON-NLS-1$
 
-			monitor.subTask(LibraryEditResources
-					.getString("LibraryEdit.savingModifiedFilesTask.name")); //$NON-NLS-1$
+			monitor.subTask(LibraryEditResources.savingModifiedFilesTask_name); //$NON-NLS-1$
 			IMethodLibraryPersister.FailSafeMethodLibraryPersister persister = ContentDescriptionFactory
 					.getMethodLibraryPersister().getFailSafePersister();
 			save: do {
 				try {
 
 					if (!movedResources.isEmpty()) {
-						monitor.subTask(LibraryEditResources
-								.getString("LibraryEdit.movingFilesTask.name")); //$NON-NLS-1$
+						monitor.subTask(LibraryEditResources.movingFilesTask_name); //$NON-NLS-1$
 
 						// move the moved resources
 						//
@@ -1807,9 +1780,7 @@
 							persister.save(resource);
 
 						} catch (Exception e) {
-							String msg = LibraryEditResources
-									.formatString(
-											"LibraryEdit.saveFileError.reason", resource.getURI().toFileString()); //$NON-NLS-1$
+							String msg = NLS.bind(LibraryEditResources.saveFileError_reason, resource.getURI().toFileString()); 
 							status.add(new SaveStatus(IStatus.ERROR,
 									LibraryEditPlugin.INSTANCE
 											.getSymbolicName(),
@@ -1822,8 +1793,7 @@
 
 					if (resMgr != null) {
 						monitor
-								.subTask(LibraryEditResources
-										.getString("LibraryEdit.copyingResourcesTask.name")); //$NON-NLS-1$
+								.subTask(LibraryEditResources.copyingResourcesTask_name); //$NON-NLS-1$
 
 						Collection elementsToCopyRefContents = new ArrayList();
 						for (Iterator iter = movedResources.iterator(); iter
@@ -1848,14 +1818,12 @@
 									monitor
 											.subTask(MessageFormat
 													.format(
-															LibraryEditResources
-																	.getString("LibraryEdit.savingFileTask.name"), pathArgs)); //$NON-NLS-1$
+															LibraryEditResources.savingFileTask_name, pathArgs)); //$NON-NLS-1$
 									persister.save(resource);
 								} catch (Exception e) {
 									String msg = MessageFormat
 											.format(
-													LibraryEditResources
-															.getString("LibraryEdit.saveFileError.reason"), pathArgs); //$NON-NLS-1$
+													LibraryEditResources.saveFileError_reason, pathArgs); //$NON-NLS-1$
 									status.add(new SaveStatus(IStatus.ERROR,
 											LibraryEditPlugin.INSTANCE
 													.getSymbolicName(),
@@ -1894,8 +1862,7 @@
 				}
 			} while (false);
 
-			monitor.subTask(LibraryEditResources
-					.getString("LibraryEdit.command.done")); //$NON-NLS-1$
+			monitor.subTask(LibraryEditResources.command_done); //$NON-NLS-1$
 			return status;
 		}
 	}
@@ -1999,9 +1966,8 @@
 					String str = (String) e.eGet(feature);
 					if (obj != e && classID == e.eClass().getClassifierID()
 							&& newText.equalsIgnoreCase(str)) {
-						return LibraryEditResources
-								.formatString(
-										"LibraryEdit.duplicateElementNameError.msg", newText); //$NON-NLS-1$
+						//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+						return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, newText); 
 					}
 				}
 			}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementCreateChildCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementCreateChildCommand.java
index 4ed9c87..22c0b1d 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementCreateChildCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/command/MethodElementCreateChildCommand.java
@@ -24,6 +24,7 @@
 import org.eclipse.epf.library.edit.validation.IValidator;
 import org.eclipse.epf.uma.NamedElement;
 import org.eclipse.epf.uma.UmaPackage;
+import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -55,19 +56,16 @@
 			validator = new IValidator() {
 				public String isValid(String newText) {
 					if (newText.trim().length() == 0) {
-						String elementText = LibraryEditResources
-						.getString("LibraryEdit.element.text"); //$NON-NLS-1$
-						return LibraryEditResources
-						.formatString(
-								"LibraryEdit.emptyElementNameError.msg", elementText); //$NON-NLS-1$
+						String elementText = LibraryEditResources.element_text; //$NON-NLS-1$
+						//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+						return NLS.bind(LibraryEditResources.emptyElementNameError_msg, elementText); 
 					}
 					List children = (List) owner.eGet(feature);
 					for (Iterator iter = children.iterator(); iter.hasNext();) {
 						NamedElement child = (NamedElement) iter.next();
 						if (child.getName().equalsIgnoreCase(newText)) {
-							return LibraryEditResources
-							.formatString(
-									"LibraryEdit.duplicateElementNameError.msg", newText); //$NON-NLS-1$
+							//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+							return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, newText); 
 						}
 					}
 					return null;
@@ -81,9 +79,7 @@
 	 * @see org.eclipse.emf.common.command.CommandWrapper#execute()
 	 */
 	public void execute() {
-		String title = LibraryEditResources
-				.formatString(
-						"LibraryEdit.newElement.text", helper.getCreateChildText(owner, feature, child, selection)); //$NON-NLS-1$
+		String title = NLS.bind(LibraryEditResources.newElement_text, helper.getCreateChildText(owner, feature, child, selection)); 
 		IValidator validator = getValidator();
 		final String name = UserInteractionHelper.requestName(child,
 				UmaPackage.eINSTANCE.getNamedElement_Name(), title, validator);
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ActivityItemProvider.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ActivityItemProvider.java
index d17bd69..25ba08a 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ActivityItemProvider.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ActivityItemProvider.java
@@ -14,8 +14,10 @@
 
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
+import org.eclipse.epf.library.edit.util.TngUtil;
 import org.eclipse.epf.uma.Activity;
 import org.eclipse.epf.uma.Descriptor;
+import org.eclipse.epf.uma.VariabilityElement;
 
 /**
  * Item provider for activity used by configuration view and filter dialog. This item provider return
@@ -51,7 +53,7 @@
 	 * @see org.eclipse.epf.library.edit.process.BSActivityItemProvider#acceptAsChild(java.lang.Object)
 	 */
 	protected boolean acceptAsChild(Object child) {
-		return child instanceof Activity;
+		return child instanceof Activity && !TngUtil.isContributorOrReplacer((VariabilityElement) child);
 	}
 	
 	/* (non-Javadoc)
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessPackageItemProvider.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessPackageItemProvider.java
index cf653e4..034a5cd 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessPackageItemProvider.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/configuration/ProcessPackageItemProvider.java
@@ -19,7 +19,7 @@
 import org.eclipse.epf.library.edit.IConfigurator;
 import org.eclipse.epf.library.edit.IFilter;
 import org.eclipse.epf.library.edit.Providers;
-import org.eclipse.epf.library.edit.util.ProcessUtil;
+import org.eclipse.epf.library.edit.util.TngUtil;
 import org.eclipse.epf.uma.MethodConfiguration;
 import org.eclipse.epf.uma.Process;
 import org.eclipse.epf.uma.ProcessComponent;
@@ -50,14 +50,16 @@
 		}
 		if (element instanceof ProcessComponent) {
 			Process process = ((ProcessComponent) element).getProcess();
-			if (process != null) {
-				// don't show process that itself or its activity contributes to or replace activity in other process
+			if (process != null) {				
+				// don't show process that is a contributor or replacer
 				//
-				if(!ProcessUtil.isContributorOrReplacer(process)) {
+				if(!TngUtil.isContributorOrReplacer(process)) {
 					if(config != null) {
-						process = (Process) Providers.getConfigurationApplicator().resolve(process, config);
+						children.add(Providers.getConfigurationApplicator().resolve(process, config));
 					}
-					children.add(process);
+					else {
+						children.add(process);
+					}
 					return true;
 				}
 			}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterConstants.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterConstants.java
index 287809f..eaf0e19 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterConstants.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/FilterConstants.java
@@ -24,104 +24,71 @@
  */
 public class FilterConstants {
 
-	public static final String CUSTOM_CATEGORIES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.customcategories.text"); //$NON-NLS-1$
+	public static final String CUSTOM_CATEGORIES = LibraryEditResources.FilterConstants_customcategories_text; //$NON-NLS-1$
 
-	public static final String METHO_PLUGINS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.methodplugins.text"); //$NON-NLS-1$
+	public static final String METHO_PLUGINS = LibraryEditResources.FilterConstants_methodplugins_text; //$NON-NLS-1$
 
-	public static final String CONTENT_PACKAGES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.contentpackages.text"); //$NON-NLS-1$
+	public static final String CONTENT_PACKAGES = LibraryEditResources.FilterConstants_contentpackages_text; //$NON-NLS-1$
 
-	public static final String ROLESETS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.rolesets.text"); //$NON-NLS-1$
+	public static final String ROLESETS = LibraryEditResources.FilterConstants_rolesets_text; //$NON-NLS-1$
 
-	public static final String DISCIPLINES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.disciplines.text"); //$NON-NLS-1$
+	public static final String DISCIPLINES = LibraryEditResources.FilterConstants_disciplines_text; //$NON-NLS-1$
 
-	public static final String WORKPRODUCTTYPES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.workproducttypes.text"); //$NON-NLS-1$
+	public static final String WORKPRODUCTTYPES = LibraryEditResources.FilterConstants_workproducttypes_text; //$NON-NLS-1$
 
-	public static final String DOMAINS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.domains.text"); //$NON-NLS-1$
+	public static final String DOMAINS = LibraryEditResources.FilterConstants_domains_text; //$NON-NLS-1$
 
-	public static final String TOOLS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.tools.text"); //$NON-NLS-1$
+	public static final String TOOLS = LibraryEditResources.FilterConstants_tools_text; //$NON-NLS-1$
 
-	public static final String ALL_ELEMENTS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.all.text"); //$NON-NLS-1$
+	public static final String ALL_ELEMENTS = LibraryEditResources.FilterConstants_all_text; //$NON-NLS-1$
 
-	public static final String ROLES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.roles.text"); //$NON-NLS-1$
+	public static final String ROLES = LibraryEditResources.FilterConstants_roles_text; //$NON-NLS-1$
 
-	public static final String TASKS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.tasks.text"); //$NON-NLS-1$
+	public static final String TASKS = LibraryEditResources.FilterConstants_tasks_text; //$NON-NLS-1$
 
-	public static final String WORKPRODUCTS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.workproducts.text"); //$NON-NLS-1$
+	public static final String WORKPRODUCTS = LibraryEditResources.FilterConstants_workproducts_text; //$NON-NLS-1$
 
-	public static final String GUIDANCE = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.guidance.text"); //$NON-NLS-1$
+	public static final String GUIDANCE = LibraryEditResources.FilterConstants_guidance_text; //$NON-NLS-1$
 
-	public static final String PROCESSES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.processes.text"); //$NON-NLS-1$
+	public static final String PROCESSES = LibraryEditResources.FilterConstants_processes_text; //$NON-NLS-1$
 
-	public static final String WORK_PRODUCT_DESCRIPTORS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.workproductdescriptors.text"); //$NON-NLS-1$
+	public static final String WORK_PRODUCT_DESCRIPTORS = LibraryEditResources.FilterConstants_workproductdescriptors_text; //$NON-NLS-1$
 
-	public static final String ROLE_DESCRIPTORS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.roledescriptors.text"); //$NON-NLS-1$
+	public static final String ROLE_DESCRIPTORS = LibraryEditResources.FilterConstants_roledescriptors_text; //$NON-NLS-1$
 
-	public static final String TASK_DESCRIPTORS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.taskdescriptors.text"); //$NON-NLS-1$
+	public static final String TASK_DESCRIPTORS = LibraryEditResources.FilterConstants_taskdescriptors_text; //$NON-NLS-1$
 
-	public static final String ONLY_CONTENT_ELEMENTS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.contentelements.text"); //$NON-NLS-1$
+	public static final String ONLY_CONTENT_ELEMENTS = LibraryEditResources.FilterConstants_contentelements_text; //$NON-NLS-1$
 
-	public static final String CONFIG_CONTENT_ELEMENT = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.allcontentelements.text"); //$NON-NLS-1$
+	public static final String CONFIG_CONTENT_ELEMENT = LibraryEditResources.FilterConstants_allcontentelements_text; //$NON-NLS-1$
 
-	public static final String ROADMAP = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.roadmap.text"); //$NON-NLS-1$
+	public static final String ROADMAP = LibraryEditResources.FilterConstants_roadmap_text; //$NON-NLS-1$
 
-	public static final String CHECKLISTS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.checklists.text"); //$NON-NLS-1$
+	public static final String CHECKLISTS = LibraryEditResources.FilterConstants_checklists_text; //$NON-NLS-1$
 
-	public static final String CONCEPTS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.concepts.text"); //$NON-NLS-1$
+	public static final String CONCEPTS = LibraryEditResources.FilterConstants_concepts_text; //$NON-NLS-1$
 
-	public static final String PRACTICES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.practices.text"); //$NON-NLS-1$
+	public static final String PRACTICES = LibraryEditResources.FilterConstants_practices_text; //$NON-NLS-1$
 
-	public static final String REPORTS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.reports.text"); //$NON-NLS-1$
+	public static final String REPORTS = LibraryEditResources.FilterConstants_reports_text; //$NON-NLS-1$
 
-	public static final String REUSABLE_ASSETS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.reusableassets.text"); //$NON-NLS-1$
+	public static final String REUSABLE_ASSETS = LibraryEditResources.FilterConstants_reusableassets_text; //$NON-NLS-1$
 
-	public static final String WHITE_PAPERS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.whitepapers.text"); //$NON-NLS-1$
+	public static final String WHITE_PAPERS = LibraryEditResources.FilterConstants_whitepapers_text; //$NON-NLS-1$
 
-	public static final String TEMPLATES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.templates.text"); //$NON-NLS-1$
+	public static final String TEMPLATES = LibraryEditResources.FilterConstants_templates_text; //$NON-NLS-1$
 
-	public static final String GUIDELINES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.guidelines.text"); //$NON-NLS-1$
+	public static final String GUIDELINES = LibraryEditResources.FilterConstants_guidelines_text; //$NON-NLS-1$
 
-	public static final String SUPPORTING_MATERIALS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.supportingmaterials.text"); //$NON-NLS-1$
+	public static final String SUPPORTING_MATERIALS = LibraryEditResources.FilterConstants_supportingmaterials_text; //$NON-NLS-1$
 
-	public static final String TOOL_MENTORS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.toolmentors.text"); //$NON-NLS-1$
+	public static final String TOOL_MENTORS = LibraryEditResources.FilterConstants_toolmentors_text; //$NON-NLS-1$
 
-	public static final String EXAMPLES = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.examples.text"); //$NON-NLS-1$
+	public static final String EXAMPLES = LibraryEditResources.FilterConstants_examples_text; //$NON-NLS-1$
 
-	public static final String ROLE_SET_GROUPINGS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.rolesetgropuings.text"); //$NON-NLS-1$
+	public static final String ROLE_SET_GROUPINGS = LibraryEditResources.FilterConstants_rolesetgropuings_text; //$NON-NLS-1$
 
-	public static final String DISCIPLINE_GROUPINGS = LibraryEditResources
-			.getString("LibraryEdit.FilterConstants.disciplinegroupings.text"); //$NON-NLS-1$
+	public static final String DISCIPLINE_GROUPINGS = LibraryEditResources.FilterConstants_disciplinegroupings_text; //$NON-NLS-1$
 
 	// public static final String
 
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessPackageItemProvider.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessPackageItemProvider.java
index 8e0f2e5..b3a1b41 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessPackageItemProvider.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/itemsfilter/ProcessPackageItemProvider.java
@@ -32,7 +32,7 @@
  */
 public class ProcessPackageItemProvider extends
 		org.eclipse.epf.library.edit.navigator.ProcessPackageItemProvider implements
-		IConfigurable, ILibraryItemProvider {
+		IConfigurable {
 
 	private IFilter filter;
 
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BSActivityItemProvider.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BSActivityItemProvider.java
index 2e371f4..bb4a215 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BSActivityItemProvider.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/BSActivityItemProvider.java
@@ -485,7 +485,8 @@
 						if(ip instanceof BSActivityItemProvider) {
 							for (Iterator iterator = ((BSActivityItemProvider)ip).getImmediateChildren(e).iterator(); iterator
 									.hasNext();) {
-								e = (Object) iterator.next();
+								e = iterator.next();
+								e = Providers.getConfigurationApplicator().resolve(e, configurator.getMethodConfiguration());
 								if(!TngUtil.contains(children, e)) {
 									contributedChildren.add(e);
 								}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescriptorItemProvider.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescriptorItemProvider.java
index 03d09b6..1a51631 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescriptorItemProvider.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/DescriptorItemProvider.java
@@ -83,11 +83,9 @@
 						if (desc != null) {
 							String str = null;
 							if (ve.getVariabilityType() == VariabilityType.EXTENDS_LITERAL) {
-								str = LibraryEditResources
-										.getString("LibraryEdit.process.extends"); //$NON-NLS-1$
+								str = LibraryEditResources.process_extends; //$NON-NLS-1$
 							} else if (ve.getVariabilityType() == VariabilityType.REPLACES_LITERAL) {
-								str = LibraryEditResources
-										.getString("LibraryEdit.process.replaces"); //$NON-NLS-1$
+								str = LibraryEditResources.process_replaces; //$NON-NLS-1$
 							}
 							String name = ((DescribableElement) desc)
 									.getPresentationName();
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityAddCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityAddCommand.java
index f9b2bb0..9593b64 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityAddCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityAddCommand.java
@@ -95,8 +95,7 @@
 							.getMsgDialog()
 							.displayWarning(
 									getLabel(),
-									LibraryEditResources
-											.getString("LibraryEdit.ActivityAddCommand.originalNotFoundWarning.msg")); //$NON-NLS-1$
+									LibraryEditResources.ActivityAddCommand_originalNotFoundWarning_msg); //$NON-NLS-1$
 				}
 
 				if (!procPackages.isEmpty()) {
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDeepCopyCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDeepCopyCommand.java
index 2a7758e..be9ec23 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDeepCopyCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDeepCopyCommand.java
@@ -417,7 +417,7 @@
 			ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(act, ITreeItemContentProvider.class);
 			IBSItemProvider bsIp = (IBSItemProvider) ip;
 			Object top = bsIp.getTopItem();
-			if(!(top instanceof Process)) {
+			if(!(top instanceof Process) || !(((EObject)top).eContainer() instanceof ProcessComponent)) {
 				// item provider tree of the owner's process is not initialized yet
 				//
 				ProcessUtil.initializeItemProviderPath(act, adapterFactory);
@@ -430,11 +430,10 @@
 				Object child = iter.next();
 				Object e = TngUtil.unwrap(child);
 				MethodElement copy = (MethodElement) copyHelper.get(e);
-				Assert.isNotNull(copy);
 
 				// copy suppression state, consider current process that inherits this element
 				//
-				if(suppression.isSuppressed(child)) {
+				if(copy != null && suppression.isSuppressed(child)) {
 					copy.setSuppressed(Boolean.TRUE);
 				}
 			}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDropCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDropCommand.java
index 274329a..a81e1a5 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDropCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ActivityDropCommand.java
@@ -18,12 +18,14 @@
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.common.util.AbstractTreeIterator;
 import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
 import org.eclipse.epf.common.serviceability.MsgBox;
 import org.eclipse.epf.library.edit.IConfigurator;
 import org.eclipse.epf.library.edit.IFilter;
+import org.eclipse.epf.library.edit.LibraryEditPlugin;
 import org.eclipse.epf.library.edit.LibraryEditResources;
 import org.eclipse.epf.library.edit.TngAdapterFactory;
 import org.eclipse.epf.library.edit.ui.IActionTypeProvider;
@@ -67,8 +69,6 @@
 
 	private int type;
 	
-	private boolean executed;
-	
 	private Collection appliedActivities;
 
 	private AdapterFactory adapterFactory;
@@ -77,7 +77,7 @@
 
 	public ActivityDropCommand(Activity target, List activities, Viewer viewer, AdapterFactory adapterFactory) {
 		super(target, activities);
-		setLabel(LibraryEditResources.getString("LibraryEdit.ActivityDropCommand.label")); //$NON-NLS-1$
+		setLabel(LibraryEditResources.ActivityDropCommand_label); 
 		this.viewer = viewer;
 		this.adapterFactory = adapterFactory;
 		targetProcess = TngUtil.getOwningProcess(target);
@@ -87,8 +87,13 @@
 					.getIncludesPatterns());
 		}
 		for (Iterator iter = activities.iterator(); iter.hasNext();) {
-			Process proc = TngUtil.getOwningProcess((BreakdownElement) iter
-					.next());
+			BreakdownElement element = (BreakdownElement) iter.next();
+			if ((element instanceof Activity) && (ProcessUtil.hasContributorOrReplacer((Activity) element)))
+			{
+				canExtend = false;
+				break;
+			}
+			Process proc = TngUtil.getOwningProcess(element);
 			if (proc instanceof CapabilityPattern && proc != targetProcess) {
 				canExtend = true;
 				break;
@@ -117,7 +122,6 @@
 		}
 
 		super.execute();
-		executed = true;
 	}
 
 	/*
@@ -136,25 +140,17 @@
 		if (isDeliveryProcess) {
 			patterns = new ArrayList();
 		}
+		
 		if(type == IActionTypeProvider.DEEP_COPY) {
-			IFilter filter = ProcessUtil.getFilter(adapterFactory);
+			if(!UserInteractionHelper.confirmDeepCopy(dropElements)) {
+				return false;
+			}
 			MethodConfiguration deepCopyConfig = null;
-			if(filter instanceof IConfigurator) {
-				MethodConfiguration currentConfig = ((IConfigurator)filter).getMethodConfiguration();
-				if(currentConfig != null && currentConfig != targetProcess.getDefaultContext()) {
-					if(UserInteractionHelper.canInteract()) {
-						String msg = "Do you want to copy all descriptors?\nClicking on No will copy only the descriptors that are part of the current configuration.";
-						switch(MsgBox.prompt(msg)) {
-						case SWT.YES:
-							break;
-						case SWT.NO:
-							deepCopyConfig = currentConfig;
-							break;
-						case SWT.CANCEL:
-							return false;
-						}
-					}
-				}
+			try {
+				deepCopyConfig = UserInteractionHelper.chooseDeepCopyConfiguration(targetProcess, adapterFactory);
+			}
+			catch(OperationCanceledException e) {
+				return false;
 			}
 			activityHandler.setDeepCopyConfig(deepCopyConfig);
 			activityHandler.setTargetProcess(targetProcess);
@@ -165,6 +161,7 @@
 			// && element != target
 			) {
 				Activity act = (Activity) element;
+				
 				if(type == IActionTypeProvider.DEEP_COPY) {
 					activityHandler.deepCopy(act);
 				}
@@ -421,4 +418,10 @@
 		}
 	}
 	
-}
+	/* (non-Javadoc)
+	 * @see org.eclipse.emf.common.command.AbstractCommand#getResult()
+	 */
+	public Collection getResult() {
+		return getAffectedObjects();
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDropCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDropCommand.java
index e5a6ffd..70db33f 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDropCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/BSDropCommand.java
@@ -10,7 +10,6 @@
 //------------------------------------------------------------------------------
 package org.eclipse.epf.library.edit.process.command;
 
-import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -22,7 +21,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.common.command.AbstractCommand;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -47,10 +45,6 @@
 import org.eclipse.epf.uma.TaskDescriptor;
 import org.eclipse.epf.uma.UmaPackage;
 import org.eclipse.epf.uma.WorkProductDescriptor;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.swt.custom.BusyIndicator;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
 
 
 /**
@@ -143,6 +137,8 @@
 
 	private BatchCommand refreshResponsibleForCommand;
 
+	protected boolean executed;
+
 //	protected Object UIContext;
 
 	/**
@@ -455,7 +451,8 @@
 			}
 			
 			doExecute();
-			updateDescriptors();	
+			updateDescriptors();
+			executed = true;
 		}
 		catch(RuntimeException e) {
 			e.printStackTrace();
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ContributeToActivityCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ContributeToActivityCommand.java
index 641854b..0b852a6 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ContributeToActivityCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ContributeToActivityCommand.java
@@ -27,8 +27,7 @@
 	public ContributeToActivityCommand(
 			BreakdownElementWrapperItemProvider wrapper) {
 		super(wrapper);
-		setLabel(LibraryEditResources
-				.getString("LibraryEdit.contributeToActivity.text")); //$NON-NLS-1$
+		setLabel(LibraryEditResources.contributeToActivity_text); //$NON-NLS-1$
 	}
 
 	/*
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CreateProcessComponentCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CreateProcessComponentCommand.java
index 3021108..6b6c075 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CreateProcessComponentCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/CreateProcessComponentCommand.java
@@ -50,6 +50,7 @@
 import org.eclipse.epf.uma.util.IMethodLibraryPersister;
 import org.eclipse.epf.uma.util.UmaUtil;
 import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 
@@ -110,10 +111,8 @@
 		if (methodConfigs.isEmpty()) {
 			// TODO: Return an IStatus object.
 			LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-					LibraryEditResources
-							.getString("LibraryEdit.createProcess.text"), //$NON-NLS-1$
-					LibraryEditResources
-							.getString("LibraryEdit.noConfigError.msg")); //$NON-NLS-1$
+					LibraryEditResources.createProcess_text, //$NON-NLS-1$
+					LibraryEditResources.noConfigError_msg); //$NON-NLS-1$
 			return;
 		}
 
@@ -156,10 +155,8 @@
 						.getDefault()
 						.getMsgDialog()
 						.displayError(
-								LibraryEditResources
-										.getString("LibraryEdit.createProcess.text"), //$NON-NLS-1$
-								LibraryEditResources
-										.getString("LibraryEdit.noDefaultConfigError.msg")); //$NON-NLS-1$
+								LibraryEditResources.createProcess_text, //$NON-NLS-1$
+								LibraryEditResources.noDefaultConfigError_msg); //$NON-NLS-1$
 			} else {
 				String msg = IValidatorFactory.INSTANCE.createNameValidator(
 						owner, procComp).isValid(procComp.getName());
@@ -171,8 +168,7 @@
 							.getDefault()
 							.getMsgDialog()
 							.displayError(
-									LibraryEditResources
-											.getString("LibraryEdit.createProcess.text"), //$NON-NLS-1$
+									LibraryEditResources.createProcess_text, //$NON-NLS-1$
 									msg);
 				}
 			}
@@ -246,13 +242,9 @@
 									.getDefault()
 									.getMsgDialog()
 									.displayError(
-											LibraryEditResources
-													.getString("LibraryEdit.createProcess.text"), //$NON-NLS-1$
-											LibraryEditResources
-													.getString("LibraryEdit.createProcessError.msg"), //$NON-NLS-1$
-											LibraryEditResources
-													.formatString(
-															"LibraryEdit.saveProcessError.reason", procComp.getName()), //$NON-NLS-1$
+											LibraryEditResources.createProcess_text, //$NON-NLS-1$
+											LibraryEditResources.createProcessError_msg, //$NON-NLS-1$
+											NLS.bind(LibraryEditResources.saveProcessError_reason, procComp.getName()), 
 											e);
 						}
 					}
@@ -264,8 +256,7 @@
 							runnable,
 							MessageFormat
 									.format(
-											LibraryEditResources
-													.getString("LibraryEdit.creatingProcessComponentTask.name"), new Object[] { procComp.getName() })); //$NON-NLS-1$
+											LibraryEditResources.creatingProcessComponentTask_name, new Object[] { procComp.getName() })); //$NON-NLS-1$
 		}
 	}
 
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LocallyReplaceAndDeepCopyCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LocallyReplaceAndDeepCopyCommand.java
new file mode 100755
index 0000000..0755cca
--- /dev/null
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/LocallyReplaceAndDeepCopyCommand.java
@@ -0,0 +1,115 @@
+//------------------------------------------------------------------------------
+// Copyright (c) 2005, 2006 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.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.epf.library.edit.LibraryEditResources;
+import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
+import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
+import org.eclipse.epf.library.edit.util.ActivityHandler;
+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.Process;
+import org.eclipse.epf.uma.ecore.util.OppositeFeature;
+
+/**
+ * @author Phong Nguyen Le - Jul 6, 2006
+ * @since  1.0
+ */
+public class LocallyReplaceAndDeepCopyCommand extends ReplaceActivityCommand {
+
+	/**
+	 * @param wrapper
+	 */
+	public LocallyReplaceAndDeepCopyCommand(BreakdownElementWrapperItemProvider wrapper) {
+		super(wrapper);		
+		setLabel(LibraryEditResources.localReplacementAndDeepCopy_text);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.epf.library.edit.process.command.ReplaceActivityCommand#doVary()
+	 */
+	protected void doVary() {
+		// deep copy the activity
+		//
+		Activity activity = (Activity) TngUtil.unwrap(wrapper);
+		if(!UserInteractionHelper.confirmDeepCopy(Collections.singletonList(activity))) {
+			return;
+		}		
+		Process targetProcess = (Process) wrapper.getTopItem();
+		MethodConfiguration deepCopyConfig = null;
+		try {
+			deepCopyConfig = UserInteractionHelper.chooseDeepCopyConfiguration(targetProcess, wrapper.getAdapterFactory());
+		}
+		catch(OperationCanceledException e) {
+			return;
+		}
+		ActivityHandler activityHandler = new ActivityHandler();
+		activityHandler.setDeepCopyConfig(deepCopyConfig);
+		activityHandler.setTargetProcess(targetProcess);
+		activityHandler.deepCopy(activity);
+		Activity copy = (Activity) activityHandler.getActivities().get(0);
+		
+		super.doVary();
+		
+		// replace the local replacement with deep copy
+		//
+		int pos = createdActivities.size() - 1;
+		Activity localReplacement = (Activity) createdActivities.get(pos);		
+		for (Iterator iter = localReplacement.getOppositeFeatures().iterator(); iter.hasNext();) {
+			OppositeFeature oppositeFeature = (OppositeFeature) iter.next();
+			Object value = localReplacement.getOppositeFeatureValue(oppositeFeature);
+			EStructuralFeature feature = oppositeFeature.getTargetFeature();
+			if(oppositeFeature.isMany()) {
+				for (Iterator iterator = new ArrayList(((Collection)value)).iterator(); iterator
+						.hasNext();) {		
+					EObject o = (EObject) iterator.next();
+					if(feature.isMany()) {
+						List list = (List) o.eGet(feature);
+						list.remove(localReplacement);
+						list.add(copy);
+					}
+					else {
+						o.eSet(feature, copy);
+					}
+				}
+			}
+			else {
+				EObject o = (EObject) value;
+				if(feature.isMany()) {
+					List list = (List) o.eGet(feature);
+					list.remove(localReplacement);
+					list.add(copy);
+				}
+				else {
+					o.eSet(feature, copy);
+				}
+			}
+		}
+		createdActivities.set(pos, copy);
+		copy.setVariabilityBasedOnElement(localReplacement.getVariabilityBasedOnElement());
+		copy.setVariabilityType(localReplacement.getVariabilityType());
+		copy.setPresentedAfter(localReplacement.getPresentedAfter());
+		copy.setPresentedBefore(localReplacement.getPresentedBefore());
+		Activity superAct = localReplacement.getSuperActivities();
+		int id = superAct.getBreakdownElements().indexOf(localReplacement);
+		superAct.getBreakdownElements().set(id, copy);
+	}
+}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ReplaceActivityCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ReplaceActivityCommand.java
index 16ca3a9..97340bb 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ReplaceActivityCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/ReplaceActivityCommand.java
@@ -26,8 +26,7 @@
 	 */
 	public ReplaceActivityCommand(BreakdownElementWrapperItemProvider wrapper) {
 		super(wrapper);
-		setLabel(LibraryEditResources
-				.getString("LibraryEdit.replaceActivity.text")); //$NON-NLS-1$
+		setLabel(LibraryEditResources.localReplaces_text); //$NON-NLS-1$
 	}
 
 	/*
@@ -36,7 +35,7 @@
 	 * @see com.ibm.library.edit.process.command.VaryActivityCommand#doVary()
 	 */
 	protected void doVary() {
-		ProcessUtil.replaceActivity(wrapper, createdActivities);
+		ProcessUtil.replaceActivityLocally(wrapper, createdActivities);
 	}
 
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeCommand.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeCommand.java
index b847b61..99a0473 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeCommand.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/process/command/SynchronizeCommand.java
@@ -107,7 +107,7 @@
 	 * @param synchFeatures the synchronizable features
 	 */
 	public SynchronizeCommand(Collection elements, MethodConfiguration config, Set synchFeatures) {
-		super(LibraryEditResources.getString("LibraryEdit.AutoSynchronizeCommand.label")); //$NON-NLS-1$
+		super(LibraryEditResources.AutoSynchronizeCommand_label); 
 		this.elements = elements;
 		this.config = config;
 		this.synchFeatures = synchFeatures;
@@ -372,8 +372,7 @@
 						.getMsgDialog()
 						.displayInfo(
 								getLabel(),
-								LibraryEditResources
-										.getString("LibraryEdit.AutoSynchronizeCommand.sucessful")); //$NON-NLS-1$
+								LibraryEditResources.AutoSynchronizeCommand_sucessful); //$NON-NLS-1$
 			}
 		}
 	}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/DeliverableSelection.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/DeliverableSelection.java
index 6f86c47..ba83747 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/DeliverableSelection.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/DeliverableSelection.java
@@ -18,6 +18,7 @@
 import org.eclipse.epf.uma.WorkProduct;
 import org.eclipse.epf.uma.WorkProductDescriptor;
 import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 
 
@@ -51,15 +52,12 @@
 		ElementListSelectionDialog dlg = new ElementListSelectionDialog(null,
 				labelProvider);
 
-		dlg.setTitle(LibraryEditResources
-				.getString("LibraryEdit.deliverables.text")); //$NON-NLS-1$
+		dlg.setTitle(LibraryEditResources.deliverables_text); //$NON-NLS-1$
 		dlg.setBlockOnOpen(true);
 		dlg.setElements(deliverableList.toArray());
 		dlg.setMultipleSelection(false);
-		dlg.setMessage(LibraryEditResources.formatString(
-				"LibraryEdit.selectDeliverablesDialog.text", wp.getName())); //$NON-NLS-1$ 
-		dlg.setTitle(LibraryEditResources
-				.getString("LibraryEdit.selectDeliverablesDialog.title")); //$NON-NLS-1$
+		dlg.setMessage(NLS.bind(LibraryEditResources.selectDeliverablesDialog_text, wp.getName())); 
+		dlg.setTitle(LibraryEditResources.selectDeliverablesDialog_title); //$NON-NLS-1$
 		dlg.setFilter(null);
 		dlg.open();
 
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/NewProcessComponentDialog.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/NewProcessComponentDialog.java
index 5f02a8d..9832389 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/NewProcessComponentDialog.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/NewProcessComponentDialog.java
@@ -115,8 +115,7 @@
 
 		// Name
 		Label nameLabel = new Label(area, SWT.NONE);
-		nameLabel.setText(LibraryEditResources
-				.getString("LibraryEdit.nameLabel.text")); //$NON-NLS-1$
+		nameLabel.setText(LibraryEditResources.nameLabel_text); //$NON-NLS-1$
 		{
 			GridData gridData = new GridData(GridData.BEGINNING);
 			nameLabel.setLayoutData(gridData);
@@ -132,8 +131,7 @@
 
 		// Ref. Models
 		Label refModelLabel = new Label(area, SWT.NONE);
-		refModelLabel.setText(LibraryEditResources
-				.getString("LibraryEdit.defaultConfigLabel.text")); //$NON-NLS-1$
+		refModelLabel.setText(LibraryEditResources.defaultConfigLabel_text); //$NON-NLS-1$
 		{
 			GridData gridData = new GridData(GridData.BEGINNING);
 			refModelLabel.setLayoutData(gridData);
@@ -186,8 +184,7 @@
 			// based on processes
 			//
 			Label label = new Label(area, SWT.NONE);
-			label.setText(LibraryEditResources
-					.getString("LibraryEdit.basedOnProcessesLabel.text")); //$NON-NLS-1$
+			label.setText(LibraryEditResources.basedOnProcessesLabel_text); //$NON-NLS-1$
 			{
 				GridData gridData = new GridData(GridData.BEGINNING);
 				label.setLayoutData(gridData);
@@ -228,8 +225,7 @@
 		super
 				.getShell()
 				.setText(
-						LibraryEditResources
-								.getString("LibraryEdit.newProcessComponentDialog.title")); //$NON-NLS-1$
+						LibraryEditResources.newProcessComponentDialog_title); //$NON-NLS-1$
 
 		// addListeners();
 
@@ -293,8 +289,7 @@
 		String msg = validator.isValid(name);
 		if (msg != null) {
 			LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-					LibraryEditResources
-							.getString("LibraryEdit.createProcess.text"), //$NON-NLS-1$
+					LibraryEditResources.createProcess_text, //$NON-NLS-1$
 					msg);
 			ctrl_name.setFocus();
 			ctrl_name.selectAll();
@@ -305,10 +300,8 @@
 				.getSelection();
 		if (selected.isEmpty()) {
 			LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-					LibraryEditResources
-							.getString("LibraryEdit.createProcess.text"), //$NON-NLS-1$
-					LibraryEditResources
-							.getString("LibraryEdit.noDefaultConfigError.msg")); //$NON-NLS-1$
+					LibraryEditResources.createProcess_text, //$NON-NLS-1$
+					LibraryEditResources.noDefaultConfigError_msg); //$NON-NLS-1$
 			return;
 		}
 
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/ReferenceSelection.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/ReferenceSelection.java
index a4127ba..09b9a76 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/ReferenceSelection.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/ReferenceSelection.java
@@ -21,6 +21,7 @@
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.PlatformUI;
 
 
@@ -33,8 +34,7 @@
 public class ReferenceSelection {
 
 	public static Object[] getReferences(List ref, Descriptor desc) {
-		return getReferences(ref, LibraryEditResources.formatString(
-				"LibraryEdit.ui.ref_delete", desc.getName())); //$NON-NLS-1$
+		return getReferences(ref, NLS.bind(LibraryEditResources.ui_ref_delete, desc.getName())); 
 	}
 
 	/**
@@ -46,8 +46,7 @@
 	 */
 	public static Object[] getReferences(List ref) {
 
-		String message = LibraryEditResources
-				.getString("LibraryEdit.ui.ref_delete2");
+		String message = LibraryEditResources.ui_ref_delete2;
 		try {
 			return getReferences(ref, message);
 		} catch (OperationCanceledException e) {
@@ -82,8 +81,7 @@
 					.getWorkbench().getActiveWorkbenchWindow().getShell(), ref,
 					contentProvider, labelProvider, msg);
 
-			dlg.setTitle(LibraryEditResources
-					.getString("LibraryEdit.ui.references")); //$NON-NLS-1$
+			dlg.setTitle(LibraryEditResources.ui_references); //$NON-NLS-1$
 			dlg.setBlockOnOpen(true);
 			if (dlg.open() == Dialog.CANCEL) {
 				throw new OperationCanceledException();
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/TeamSelection.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/TeamSelection.java
index 266ac7e..612fe83 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/TeamSelection.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/TeamSelection.java
@@ -18,6 +18,7 @@
 import org.eclipse.epf.uma.Role;
 import org.eclipse.epf.uma.TeamProfile;
 import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
@@ -61,11 +62,8 @@
 		dlg.setElements(teamList.toArray());
 		dlg.setMultipleSelection(false);
 		dlg
-				.setMessage(LibraryEditResources
-						.formatString(
-								"LibraryEdit.selectTeamsDialog.text", new Object[] { role.getName() })); //$NON-NLS-1$ 
-		dlg.setTitle(LibraryEditResources
-				.getString("LibraryEdit.selectTeamsDialog.title")); //$NON-NLS-1$
+				.setMessage(NLS.bind(LibraryEditResources.selectTeamsDialog_text, (new Object[] { role.getName() }))); 
+		dlg.setTitle(LibraryEditResources.selectTeamsDialog_title); //$NON-NLS-1$
 		dlg.setFilter(null);
 		dlg.open();
 		Object obj = dlg.getFirstResult();
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/UserInteractionHelper.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/UserInteractionHelper.java
index c1e20fc..26c6666 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/UserInteractionHelper.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/ui/UserInteractionHelper.java
@@ -23,6 +23,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.emf.common.CommonPlugin;
 import org.eclipse.emf.common.notify.AdapterFactory;
@@ -36,6 +37,7 @@
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
 import org.eclipse.epf.common.serviceability.MsgBox;
 import org.eclipse.epf.library.edit.IConfigurator;
+import org.eclipse.epf.library.edit.IFilter;
 import org.eclipse.epf.library.edit.LibraryEditPlugin;
 import org.eclipse.epf.library.edit.LibraryEditResources;
 import org.eclipse.epf.library.edit.Providers;
@@ -46,6 +48,7 @@
 import org.eclipse.epf.uma.Activity;
 import org.eclipse.epf.uma.BreakdownElement;
 import org.eclipse.epf.uma.Deliverable;
+import org.eclipse.epf.uma.MethodConfiguration;
 import org.eclipse.epf.uma.MethodElement;
 import org.eclipse.epf.uma.MethodLibrary;
 import org.eclipse.epf.uma.MethodPackage;
@@ -68,6 +71,7 @@
 import org.eclipse.jface.viewers.ILabelProvider;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
@@ -127,14 +131,14 @@
 		// object is not in the configuration
 		// ask user if he/she want to add it to the default configuration
 		//
-		String msg = LibraryEditResources
-				.formatString(
-						"LibraryEdit.ui.UserInteractionHelper.defaultconfigcheck", ((MethodElement) e).getName()); //$NON-NLS-1$
+		String msg = NLS.bind(LibraryEditResources.ui_UserInteractionHelper_defaultconfigcheck, ((MethodElement) e).getName()); 
 
 		int ret = MsgBox.prompt(msg);
-		System.out
-				.println("UserInteractionHelper.checkAgainstDefaultConfiguration(): element="
-						+ e + ", path=" + TngUtil.getLabelWithPath(e));
+		if(TngUtil.DEBUG) {
+			System.out
+			.println("UserInteractionHelper.checkAgainstDefaultConfiguration(): element=" //$NON-NLS-1$
+					+ e + ", path=" + TngUtil.getLabelWithPath(e)); //$NON-NLS-1$
+		}
 		switch (ret) {
 		case SWT.YES:
 			IStatus status = TngUtil.checkEdit(proc.getDefaultContext(), null);
@@ -204,11 +208,9 @@
 					taskList,
 					contentProvider,
 					labelProvider,
-					LibraryEditResources
-							.getString("LibraryEdit.ui.UserInteractionHelper.wplistdlgtitle0") + wp.getName() + LibraryEditResources.getString("LibraryEdit.ui.UserInteractionHelper.wplistdlgtitle1")); //$NON-NLS-1$ //$NON-NLS-2$
+					LibraryEditResources.ui_UserInteractionHelper_wplistdlgtitle0 + wp.getName() + LibraryEditResources.ui_UserInteractionHelper_wplistdlgtitle1); 
 
-			dlg.setTitle(LibraryEditResources
-					.getString("LibraryEdit.ui.UserInteractionHelper.tasks")); //$NON-NLS-1$
+			dlg.setTitle(LibraryEditResources.ui_UserInteractionHelper_tasks); //$NON-NLS-1$
 			dlg.setBlockOnOpen(true);
 			dlg.open();
 			Object[] objs = dlg.getResult();
@@ -262,12 +264,10 @@
 					wpList,
 					contentProvider,
 					labelProvider,
-					LibraryEditResources
-							.getString("LibraryEdit.ui.UserInteractionHelper.rolelistdlgtitle0") + role.getName() + LibraryEditResources.getString("LibraryEdit.ui.UserInteractionHelper.rolelistdlgtitle1")); //$NON-NLS-1$ //$NON-NLS-2$
+					LibraryEditResources.ui_UserInteractionHelper_rolelistdlgtitle0 + role.getName() + LibraryEditResources.ui_UserInteractionHelper_rolelistdlgtitle1); 
 
 			dlg
-					.setTitle(LibraryEditResources
-							.getString("LibraryEdit.ui.UserInteractionHelper.workproducts")); //$NON-NLS-1$
+					.setTitle(LibraryEditResources.ui_UserInteractionHelper_workproducts); //$NON-NLS-1$
 			dlg.setBlockOnOpen(true);
 			dlg.open();
 			Object[] objs = dlg.getResult();
@@ -317,8 +317,7 @@
 		InputDialog inputDialog = new InputDialog(
 				Display.getCurrent().getActiveShell(),
 				title,
-				LibraryEditResources
-						.getString("LibraryEdit.UserInteractionHelper.ProcessPackage.Name"), name, inputValidator); //$NON-NLS-1$
+				LibraryEditResources.UserInteractionHelper_ProcessPackage_Name, name, inputValidator); //$NON-NLS-1$
 		if (inputDialog.open() == Window.OK) {
 			return inputDialog.getValue();
 		}
@@ -335,25 +334,19 @@
 		if (s >= 0) {
 			prefix = msg.substring(0, s);
 
-			String emptyElementNameErrorMsg = LibraryEditResources
-					.getString("LibraryEdit.emptyElementNameError.msg"); //$NON-NLS-1$
-			String dupContentFileErrorMsg = LibraryEditResources
-					.getString("LibraryEdit.duplicateContentFileError.msg"); //$NON-NLS-1$
-			String dupElementNameErrorMsg = LibraryEditResources
-					.getString("LibraryEdit.duplicateElementNameError.msg"); //$NON-NLS-1$
+			String emptyElementNameErrorMsg = LibraryEditResources.emptyElementNameError_msg; //$NON-NLS-1$
+			String dupContentFileErrorMsg = LibraryEditResources.duplicateContentFileError_msg; //$NON-NLS-1$
+			String dupElementNameErrorMsg = LibraryEditResources.duplicateElementNameError_msg; //$NON-NLS-1$
 
 			if (emptyElementNameErrorMsg != null
 					&& emptyElementNameErrorMsg.startsWith(prefix))
-				return LibraryEditResources
-						.getString("LibraryEdit.emptyElementNameError.simple.msg"); //$NON-NLS-1$
+				return LibraryEditResources.emptyElementNameError_simple_msg; //$NON-NLS-1$
 			else if (dupContentFileErrorMsg != null
 					&& dupContentFileErrorMsg.startsWith(prefix))
-				return LibraryEditResources
-						.getString("LibraryEdit.duplicateContentFileError.simple.msg"); //$NON-NLS-1$
+				return LibraryEditResources.duplicateContentFileError_simple_msg; //$NON-NLS-1$
 			else if (dupElementNameErrorMsg != null
 					&& dupElementNameErrorMsg.startsWith(prefix))
-				return LibraryEditResources
-						.getString("LibraryEdit.duplicateElementNameError.simple.msg"); //$NON-NLS-1$
+				return LibraryEditResources.duplicateElementNameError_simple_msg; //$NON-NLS-1$
 		}
 
 		if (s < 0)
@@ -435,8 +428,7 @@
 	public static final boolean runWithProgress(final Runnable runnable,
 			final String msg) {
 		final MultiStatus status = new MultiStatus(LibraryEditPlugin.INSTANCE
-				.getSymbolicName(), IStatus.OK, LibraryEditResources
-				.getString("LibraryEdit.error.reason"), null); //$NON-NLS-1$
+				.getSymbolicName(), IStatus.OK, LibraryEditResources.error_reason, null); //$NON-NLS-1$
 
 		IRunnableWithProgress operation = new IRunnableWithProgress() {
 
@@ -474,10 +466,8 @@
 
 			if (!status.isOK()) {
 				LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-						LibraryEditResources
-								.getString("LibraryEdit.errorDialog.title"), //$NON-NLS-1$
-						LibraryEditResources
-								.getString("LibraryEdit.error.msgWithDetails"), //$NON-NLS-1$
+						LibraryEditResources.errorDialog_title, //$NON-NLS-1$
+						LibraryEditResources.error_msgWithDetails, //$NON-NLS-1$
 						status);
 			} else {
 				return true;
@@ -603,7 +593,7 @@
 			return true;
 		} catch (Exception e) {
 			LibraryEditPlugin.getDefault().getLogger().logError(e);
-			String title = LibraryEditResources.getString("LibraryEdit.errorDialog.title"); //$NON-NLS-1$
+			String title = LibraryEditResources.errorDialog_title; 
 			LibraryEditPlugin.getDefault().getMsgDialog().displayError(
 					title, e.toString(), e);
 		}
@@ -615,8 +605,7 @@
 			final ProgressMonitorDialog monitorDlg, final boolean canCancel,
 			final String msg) {
 		final MultiStatus status = new MultiStatus(LibraryEditPlugin.INSTANCE
-				.getSymbolicName(), IStatus.OK, LibraryEditResources
-				.getString("LibraryEdit.error.reason"), null); //$NON-NLS-1$
+				.getSymbolicName(), IStatus.OK, LibraryEditResources.error_reason, null); //$NON-NLS-1$
 
 		final IRunnableWithProgress operation = new IRunnableWithProgress() {
 
@@ -682,10 +671,8 @@
 
 			if (!status.isOK()) {
 				LibraryEditPlugin.getDefault().getMsgDialog().displayError(
-						LibraryEditResources
-								.getString("LibraryEdit.errorDialog.title"), //$NON-NLS-1$
-						LibraryEditResources
-								.getString("LibraryEdit.error.msgWithDetails"), //$NON-NLS-1$
+						LibraryEditResources.errorDialog_title, //$NON-NLS-1$
+						LibraryEditResources.error_msgWithDetails, //$NON-NLS-1$
 						status);
 			} else {
 				return true;
@@ -784,8 +771,7 @@
 		if (TngUtil.isLocked(element)) {
 			String msg = MessageFormat
 					.format(
-							LibraryEditResources
-									.getString("LibraryEdit.UserInteractionHelper.lockedPlugin"), new Object[] { UmaUtil.getMethodPlugin(element).getName() }); //$NON-NLS-1$
+							LibraryEditResources.UserInteractionHelper_lockedPlugin, new Object[] { UmaUtil.getMethodPlugin(element).getName() }); //$NON-NLS-1$
 			return new Status(IStatus.ERROR,
 					LibraryEditPlugin.INSTANCE.getId(), 0, msg, null);
 		}
@@ -841,8 +827,7 @@
 				//
 				String msg = MessageFormat
 						.format(
-								LibraryEditResources
-										.getString("LibraryEdit.UserInteractionHelper.errRelationshipExists") //$NON-NLS-1$
+								LibraryEditResources.UserInteractionHelper_errRelationshipExists
 								,
 								new Object[] {
 										element.getName(),
@@ -850,8 +835,7 @@
 												.getLabelWithPath(oldOppositeFeatureValue),
 										featureOwner.getName() });
 				LibraryEditPlugin.INSTANCE.getMsgDialog().displayError(
-						LibraryEditResources
-								.getString("LibraryEdit.errorDialog.title") //$NON-NLS-1$
+						LibraryEditResources.errorDialog_title
 						, msg);
 				return false;
 
@@ -921,4 +905,59 @@
 		}
 		return Status.OK_STATUS;
 	}
+	
+	public static boolean confirmDeepCopy(Collection activities) {
+		if(UserInteractionHelper.canInteract()) {
+			// checks if the pattern or activity contains any extending elements and prompts the user if he really 
+			// wants to deep copy dynamically linked activities warning the process author that he will get a copy 
+			// of all dynamically linked elements that he needs to maintain separately from now on
+			boolean promptNeeded = false; 
+			for (Iterator iter = activities.iterator(); iter.hasNext();) {
+				Object e = (Object) iter.next();
+				if(e instanceof Activity && ProcessUtil.hasInherited((Activity) e)) {
+					promptNeeded = true;
+					break;
+				}
+			}
+			if(promptNeeded) {
+				String title = LibraryEditResources.deepCopy_title;
+				String msg = LibraryEditResources.deepCopy_promptMsg;
+				if(!LibraryEditPlugin.getDefault().getMsgDialog().displayConfirmation(title, msg)) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+	
+	/**
+	 * Prompts user to choose configuration for deep copy
+	 * 
+	 * @param targetProcess
+	 * @param adapterFactory
+	 * @return
+	 * @exception OperationCanceledException if user cancelled
+	 */
+	public static MethodConfiguration chooseDeepCopyConfiguration(Process targetProcess, AdapterFactory adapterFactory) {		
+		IFilter filter = ProcessUtil.getFilter(adapterFactory);
+		MethodConfiguration deepCopyConfig = null;
+		if(filter instanceof IConfigurator) {
+			MethodConfiguration currentConfig = ((IConfigurator)filter).getMethodConfiguration();
+			if(currentConfig != null && currentConfig != targetProcess.getDefaultContext()) {
+				if(UserInteractionHelper.canInteract()) {
+					String msg = LibraryEditResources.ActivityDropCommand_deepCopy_promptConfigurationMsg; 
+					switch(MsgBox.prompt(msg)) {
+					case SWT.YES:
+						break;
+					case SWT.NO:
+						deepCopyConfig = currentConfig;
+						break;
+					case SWT.CANCEL:
+						throw new OperationCanceledException();
+					}
+				}
+			}
+		}
+		return deepCopyConfig;
+	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityHandler.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityHandler.java
index 002a15b..8ea28a2 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityHandler.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ActivityHandler.java
@@ -149,10 +149,6 @@
 					ProcessUtil.fixBreakdonwElementOrderRecursively((Activity) iter.next());					
 				}
 				
-				// copy suppression states
-				//
-				
-				
 				activities.addAll(deepCopies);
 			}
 		}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurableComposedAdapterFactory.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurableComposedAdapterFactory.java
index 9e38a19..fdff377 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurableComposedAdapterFactory.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ConfigurableComposedAdapterFactory.java
@@ -120,8 +120,7 @@
 						.getDefault()
 						.getMsgDialog()
 						.displayError(
-								LibraryEditResources
-										.getString("LibraryEdit.util.configurablecomposedadapter.fatalerr"), LibraryEditResources.getString("LibraryEdit.util.configurablecomposedadapter.refershingviewer"), LibraryEditResources.getString("LibraryEdit.util.configurablecomposedadapter.unhandled.exception"), strWriter.toString(), e); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+								LibraryEditResources.util_configurablecomposedadapter_fatalerr, LibraryEditResources.util_configurablecomposedadapter_refershingviewer, LibraryEditResources.util_configurablecomposedadapter_unhandled_exception, strWriter.toString(), e); 
 				return;
 			}
 			throw e;
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ProcessUtil.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ProcessUtil.java
index 84ded6d..8c29a80 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ProcessUtil.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/ProcessUtil.java
@@ -417,11 +417,9 @@
 			((IBSItemProvider) adapter).setParent(parent);
 		} else {
 			System.out
-					.println(LibraryEditResources
-							.getString("LibraryEdit.util.ProcessUtil.err_setparent") + child); //$NON-NLS-1$
+					.println(LibraryEditResources.util_ProcessUtil_err_setparent + child); //$NON-NLS-1$
 			System.out
-					.println(LibraryEditResources
-							.getString("LibraryEdit.util.ProcessUtil.childadapter") + adapter); //$NON-NLS-1$
+					.println(LibraryEditResources.util_ProcessUtil_childadapter + adapter); //$NON-NLS-1$
 		}
 	}
 
@@ -661,20 +659,16 @@
 			if (obj instanceof WorkBreakdownElement) {
 				WorkBreakdownElement pred = (WorkBreakdownElement) obj;
 				if (ProcessUtil.checkCircular(e, pred, allElements)) {
-					return LibraryEditResources
-							.getString("LibraryEdit.util.ProcessUtil.err_same_breakdown_element"); //$NON-NLS-1$
+					return LibraryEditResources.util_ProcessUtil_err_same_breakdown_element; //$NON-NLS-1$
 				}
 				if (TngUtil.isSubelementOf(pred, e, adapterFactory)) {
-					return LibraryEditResources
-							.getString("LibraryEdit.util.ProcessUtil.err_same_sub_element"); //$NON-NLS-1$
+					return LibraryEditResources.util_ProcessUtil_err_same_sub_element; //$NON-NLS-1$
 				}
 				if (TngUtil.isSuperElementOf(pred, e, adapterFactory)) {
-					return LibraryEditResources
-							.getString("LibraryEdit.util.ProcessUtil.err_child_element"); //$NON-NLS-1$
+					return LibraryEditResources.util_ProcessUtil_err_child_element; //$NON-NLS-1$
 				}
 			} else
-				return LibraryEditResources
-						.getString("LibraryEdit.util.ProcessUtil.err_wrong_element"); //$NON-NLS-1$
+				return LibraryEditResources.util_ProcessUtil_err_wrong_element; //$NON-NLS-1$
 		}
 
 		if (predecessors != null)
@@ -778,8 +772,7 @@
 			try {
 				id = new Integer(token);
 			} catch (NumberFormatException ex) {
-				return LibraryEditResources
-						.getString("LibraryEdit.invalidPredecessorError.msg"); //$NON-NLS-1$
+				return LibraryEditResources.invalidPredecessorError_msg; //$NON-NLS-1$
 			}
 			idList.add(id);
 		}
@@ -1213,20 +1206,15 @@
 				}
 				String pattern = null;
 				if (type == VariabilityType.CONTRIBUTES_LITERAL) {
-					pattern = LibraryEditResources
-							.getString("LibraryEdit.util.ProcessUtil.contributesto"); //$NON-NLS-1$
+					pattern = LibraryEditResources.util_ProcessUtil_contributesto; //$NON-NLS-1$
 				} else if (type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-					pattern = LibraryEditResources
-						.getString("LibraryEdit.util.ProcessUtil.localContributesto"); //$NON-NLS-1$
+					pattern = LibraryEditResources.util_ProcessUtil_localContributesto; //$NON-NLS-1$
 				} else if (type == VariabilityType.EXTENDS_LITERAL) {
-					pattern = LibraryEditResources
-							.getString("LibraryEdit.process.extends"); //$NON-NLS-1$
+					pattern = LibraryEditResources.process_extends; //$NON-NLS-1$
 				} else if (type == VariabilityType.REPLACES_LITERAL) {
-					pattern = LibraryEditResources
-							.getString("LibraryEdit.process.replaces"); //$NON-NLS-1$
+					pattern = LibraryEditResources.process_replaces; //$NON-NLS-1$
 				} else if (type == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-					pattern = LibraryEditResources
-							.getString("LibraryEdit.process.localReplaces"); //$NON-NLS-1$
+					pattern = LibraryEditResources.process_localReplaces; //$NON-NLS-1$
 				}
 
 				// if(adapter instanceof ItemProviderAdapter) {
@@ -2192,7 +2180,7 @@
 	 * @param adapter
 	 * @param createdActivities
 	 */
-	public static void replaceActivity(
+	public static void replaceActivityLocally(
 			BreakdownElementWrapperItemProvider adapter, List createdActivities) {
 		Object parent = adapter.getParent(null);
 		Object[] prevAndNext = ProcessUtil
@@ -2575,6 +2563,44 @@
 		&& ((BreakdownElementWrapperItemProvider)object).isInherited();
 	}
 	
+	/**
+	 * Checks if the given activity has inherited any breakdown element via extension of local contribution
+	 * 
+	 * @param activity
+	 * @return
+	 */
+	public static boolean hasInherited(Activity activity) {
+		Iterator iter = new AbstractTreeIterator(activity) {
+
+			/**
+			 * Comment for <code>serialVersionUID</code>
+			 */
+			private static final long serialVersionUID = 0L;
+
+			protected Iterator getChildren(Object object) {
+				if(object instanceof Activity) {
+					return ((Activity)object).getBreakdownElements().iterator();
+				}
+				return Collections.EMPTY_LIST.iterator();
+			}
+			
+		};
+		while(iter.hasNext()) {
+			Object o = iter.next();
+			if(o instanceof Activity) {
+				Activity act = (Activity) o;
+				VariabilityElement ve = act.getVariabilityBasedOnElement();
+				if(ve != null) {
+					VariabilityType type = act.getVariabilityType();
+					if(type == VariabilityType.EXTENDS_LITERAL || type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+	
 	public static boolean isContributed(Object object) {
 		return object instanceof BreakdownElementWrapperItemProvider
 		&& ((BreakdownElementWrapperItemProvider)object).isContributed();
@@ -3019,14 +3045,16 @@
 			ITreeItemContentProvider ip = (ITreeItemContentProvider) adapterFactory.adapt(act, ITreeItemContentProvider.class);
 			ip.getChildren(act);
 		}
-	}
+	}		
 
 	/**
-	 * @param process
+	 * Check if the given activity or any of its subactivities is a contributor or replacer
+	 * 
+	 * @param activity
 	 * @return
 	 */
-	public static boolean isContributorOrReplacer(Process process) {
-		Iterator iter = new AbstractTreeIterator(process) {
+	public static boolean hasContributorOrReplacer(Activity activity) {
+		Iterator iter = new AbstractTreeIterator(activity) {
 
 			/**
 			 * Comment for <code>serialVersionUID</code>
@@ -3055,10 +3083,12 @@
 			VariabilityElement base = ve.getVariabilityBasedOnElement();
 			VariabilityType vType = ve.getVariabilityType();
 			if(base != null && (vType == VariabilityType.CONTRIBUTES_LITERAL || vType == VariabilityType.REPLACES_LITERAL)) {
-				Process proc = TngUtil.getOwningProcess((BreakdownElement) base);
-				if(proc != process) {
-					return true;
-				}
+//				Process proc = TngUtil.getOwningProcess((BreakdownElement) base);
+//				if(proc != process) {
+//					return true;
+//				}
+				
+				return true;
 			}
 		}
 		
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Suppression.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Suppression.java
index 1f9204f..6ba4e0b 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Suppression.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/Suppression.java
@@ -1047,14 +1047,12 @@
 				String msg = ProcessUtil.checkBreakdownElementName(
 						adapterFactory, be, be.getName(), this);
 				if (msg != null) {
-					return LibraryEditResources
-							.getString("LibraryEdit.Suppression.nameDuplication"); //$NON-NLS-1$
+					return LibraryEditResources.Suppression_nameDuplication; //$NON-NLS-1$
 				}
 				msg = ProcessUtil.checkBreakdownElementPresentationName(
 						adapterFactory, be, be.getPresentationName(), this);
 				if (msg != null) {
-					return LibraryEditResources
-							.getString("LibraryEdit.Suppression.presentationNameDuplication"); //$NON-NLS-1$
+					return LibraryEditResources.Suppression_presentationNameDuplication; //$NON-NLS-1$
 				}
 			} else {
 				Object unwrapped = TngUtil.unwrap(element);
@@ -1099,8 +1097,7 @@
 													adapterFactory, be, be
 															.getName(), this);
 									if (msg != null) {
-										return LibraryEditResources
-												.getString("LibraryEdit.Suppression.nameDuplication"); //$NON-NLS-1$
+										return LibraryEditResources.Suppression_nameDuplication; //$NON-NLS-1$
 									}
 									msg = ProcessUtil
 											.checkBreakdownElementPresentationName(
@@ -1108,8 +1105,7 @@
 													be.getPresentationName(),
 													this);
 									if (msg != null) {
-										return LibraryEditResources
-												.getString("LibraryEdit.Suppression.presentationNameDuplication"); //$NON-NLS-1$
+										return LibraryEditResources.Suppression_presentationNameDuplication; //$NON-NLS-1$
 									}
 								}
 							}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/TngUtil.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/TngUtil.java
index a56ec2e..22c00d9 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/TngUtil.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/util/TngUtil.java
@@ -26,14 +26,8 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.CommonPlugin;
 import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.common.command.CommandWrapper;
 import org.eclipse.emf.common.notify.Adapter;
@@ -135,7 +129,7 @@
 import org.eclipse.epf.uma.util.ContentDescriptionFactory;
 import org.eclipse.epf.uma.util.IMethodLibraryPersister;
 import org.eclipse.epf.uma.util.UmaUtil;
-import org.osgi.framework.Bundle;
+import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -234,8 +228,8 @@
 			NamedElement child = (NamedElement) children.get(i);
 			if (child != e && isEClassInstanceOf(eClasses, child)
 					&& name.equalsIgnoreCase(child.getName())) {
-				return LibraryEditResources.formatString(
-						"LibraryEdit.duplicateElementNameError.msg", name); //$NON-NLS-1$
+				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+				return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
 			}
 		}
 		return null;
@@ -253,8 +247,8 @@
 			NamedElement child = (NamedElement) children.get(i);
 			if (child != e && childFilter.accept(child)
 					&& name.equalsIgnoreCase(child.getName())) {
-				return LibraryEditResources.formatString(
-						"LibraryEdit.duplicateElementNameError.msg", name); //$NON-NLS-1$
+				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+				return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
 			}
 		}
 		return null;
@@ -301,15 +295,12 @@
 		}
 		boolean b = file.exists();
 		if (b && !file.equals(currentFile)) {
-			msg = LibraryEditResources.formatString(
-					"LibraryEdit.duplicateElementNameError.msg", name); //$NON-NLS-1$
+			msg = NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
 			Object[] params = new Object[2];
 			if (file.isFile()) {
-				params[0] = LibraryEditResources
-						.getString("LibraryEdit.file.text"); //$NON-NLS-1$
+				params[0] = LibraryEditResources.file_text; //$NON-NLS-1$
 			} else {
-				params[0] = LibraryEditResources
-						.getString("LibraryEdit.directory.text"); //$NON-NLS-1$
+				params[0] = LibraryEditResources.directory_text; //$NON-NLS-1$
 			}
 			params[1] = file;
 			return MessageFormat.format(msg, params).toString();
@@ -317,8 +308,8 @@
 		for (Iterator iter = siblings.iterator(); iter.hasNext();) {
 			NamedElement child = (NamedElement) iter.next();
 			if (child != e && name.equalsIgnoreCase(child.getName())) {
-				return LibraryEditResources.formatString(
-						"LibraryEdit.duplicateElementNameError.msg", name); //$NON-NLS-1$
+				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+				return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
 			}
 		}
 		// 
@@ -328,14 +319,17 @@
 
 	public static String checkElementName(String name, String elementTypeText) {
 		if (name == null || name.trim().length() == 0)
-			return LibraryEditResources
-					.formatString(
-							"LibraryEdit.emptyElementNameError.msg", StrUtil.toLower(elementTypeText)); //$NON-NLS-1$
-		if (name.startsWith(" "))return LibraryEditResources.formatString("LibraryEdit.invalidElementNameError1.msg", name); //$NON-NLS-1$		
-		if (name.endsWith("."))return LibraryEditResources.formatString("LibraryEdit.invalidElementNameError2.msg", name); //$NON-NLS-1$
+			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+			return NLS.bind(LibraryEditResources.emptyElementNameError_msg, StrUtil.toLower(elementTypeText)); 
+		if (name.startsWith(" "))
+			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+			return NLS.bind(LibraryEditResources.invalidElementNameError1_msg, name); 
+		if (name.endsWith("."))
+			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+			return NLS.bind(LibraryEditResources.invalidElementNameError2_msg, name); 
 		if (!isValidFileName(name))
-			return LibraryEditResources.formatString(
-					"LibraryEdit.invalidElementNameError3.msg", name); //$NON-NLS-1$
+			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+			return NLS.bind(LibraryEditResources.invalidElementNameError3_msg, name); 
 		return null;
 	}
 
@@ -446,8 +440,8 @@
 				} else {
 					path = ""; //$NON-NLS-1$
 				}
-				return LibraryEditResources.formatString(
-						"LibraryEdit.unresolved.text", path); //$NON-NLS-1$
+				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+				return NLS.bind(LibraryEditResources.unresolved_text, path); 
 			}
 		}
 		String label = null;
@@ -469,46 +463,36 @@
 			VariabilityType type = object.getVariabilityType();
 			String variabilityTxt = null;
 			if (type == VariabilityType.CONTRIBUTES_LITERAL) {
-				variabilityTxt = LibraryEditResources
-						.getString("LibraryEdit.contributesTo.text"); //$NON-NLS-1$
+				variabilityTxt = LibraryEditResources.contributesTo_text; //$NON-NLS-1$
 			} else if (type == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
-					variabilityTxt = LibraryEditResources
-						.getString("LibraryEdit.localContributesTo.text"); //$NON-NLS-1$
+					variabilityTxt = LibraryEditResources.localContributesTo_text; //$NON-NLS-1$
 			} else if (type == VariabilityType.EXTENDS_LITERAL) {
-				variabilityTxt = LibraryEditResources
-						.getString("LibraryEdit.extends.text"); //$NON-NLS-1$
+				variabilityTxt = LibraryEditResources.extends_text; //$NON-NLS-1$
 			} else if (type == VariabilityType.REPLACES_LITERAL) {
-				variabilityTxt = LibraryEditResources
-						.getString("LibraryEdit.replaces.text"); //$NON-NLS-1$
+				variabilityTxt = LibraryEditResources.replaces_text; //$NON-NLS-1$
 			} else if (type == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-				variabilityTxt = LibraryEditResources
-						.getString("LibraryEdit.localReplaces.text"); //$NON-NLS-1$
+				variabilityTxt = LibraryEditResources.localReplaces_text; //$NON-NLS-1$
 			}
 			if (variabilityTxt != null) {
 				MethodPlugin basePlugin = UmaUtil.getMethodPlugin(object
 						.getVariabilityBasedOnElement());
 				if (basePlugin != null) {
-					label = LibraryEditResources
-							.formatString(
-									"LibraryEdit.Util.labelpath.variabilitywithplugin.info",
-									new String[] {
-											label,
-											variabilityTxt,
-											TngUtil
-													.getLabel(
-															object
-																	.getVariabilityBasedOnElement(),
-															alternativeLabel),
-											basePlugin.getName() });
-				} else {
-					label = LibraryEditResources.formatString(
-							"LibraryEdit.Util.labelpath.variability.info",
-							new String[] {
-									label,
-									variabilityTxt,
-									TngUtil.getLabel(object
+					label = NLS.bind(LibraryEditResources.Util_labelpath_variabilitywithplugin_info, (new String[] {
+					label,
+					variabilityTxt,
+					TngUtil
+							.getLabel(
+									object
 											.getVariabilityBasedOnElement(),
-											alternativeLabel) });
+									alternativeLabel),
+					basePlugin.getName() }));
+				} else {
+					label = NLS.bind(LibraryEditResources.Util_labelpath_variability_info, (new String[] {
+					label,
+					variabilityTxt,
+					TngUtil.getLabel(object
+							.getVariabilityBasedOnElement(),
+							alternativeLabel) }));
 				}
 			}
 		}
@@ -1862,8 +1846,7 @@
 			} else {
 				location = ""; //$NON-NLS-1$
 			}
-			String msg = MessageFormat.format(LibraryEditResources
-					.getString("LibraryEdit.unresolvedObjectError.reason") //$NON-NLS-1$
+			String msg = MessageFormat.format(LibraryEditResources.unresolvedObjectError_reason
 					, new Object[] { proxy.eClass().getName(), uri, location });
 			return new Status(IStatus.ERROR, LibraryEditPlugin.INSTANCE
 					.getSymbolicName(), 0, msg, null);
@@ -1888,8 +1871,7 @@
 			msg = strBuf.toString();
 		}
 		if (msg == null || msg.length() == 0) {
-			msg = LibraryEditResources
-					.getString("LibraryEdit.util.tngutil.cannot_edit_resource"); //$NON-NLS-1$
+			msg = LibraryEditResources.util_tngutil_cannot_edit_resource; //$NON-NLS-1$
 		}
 		return msg;
 	}
@@ -1898,6 +1880,12 @@
 		return e.getVariabilityBasedOnElement() != null
 		&& (e.getVariabilityType() == VariabilityType.CONTRIBUTES_LITERAL);
 	}
+	
+	public static boolean isContributorOrReplacer(VariabilityElement e) {
+		VariabilityElement base = e.getVariabilityBasedOnElement();
+		VariabilityType type = e.getVariabilityType();
+		return base != null && (type == VariabilityType.CONTRIBUTES_LITERAL || type == VariabilityType.REPLACES_LITERAL);
+	}
 
 	public static boolean isGeneralizer(Object obj, Collection types) {
 		if (!(obj instanceof VariabilityElement))
@@ -2025,7 +2013,7 @@
 		// case UmaPackage.TASK_DESCRIPTOR__ADDITIONALLY_PERFORMED_BY:
 		// return "Secondary Performer";
 		case UmaPackage.TASK_DESCRIPTOR__ASSISTED_BY:
-			return LibraryEditResources.getString("LibraryEdit.assists.text"); //$NON-NLS-1$
+			return LibraryEditResources.assists_text; 
 		}
 
 		String featureKey;
@@ -2034,8 +2022,7 @@
 			featureKey = eFeature.getEContainingClass().getName()
 					+ "_" + eFeature.getName(); //$NON-NLS-1$
 		} else {
-			featureKey = LibraryEditResources
-					.getString("LibraryEdit.unknown.text"); //$NON-NLS-1$
+			featureKey = LibraryEditResources.unknown_text; //$NON-NLS-1$
 		}
 		return UmaEditPlugin.INSTANCE
 				.getString("_UI_" + featureKey + "_feature"); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/NameChecker.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/NameChecker.java
index 1f33f2b..3f368c7 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/NameChecker.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/NameChecker.java
@@ -32,6 +32,7 @@
 import org.eclipse.epf.uma.TeamProfile;
 import org.eclipse.epf.uma.UmaPackage;
 import org.eclipse.epf.uma.WorkProductDescriptor;
+import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -40,8 +41,7 @@
  */
 public final class NameChecker {
 
-	private static final String ELEMENT_TEXT = LibraryEditResources
-			.getString("LibraryEdit.element.text"); //$NON-NLS-1$
+	private static final String ELEMENT_TEXT = LibraryEditResources.element_text; //$NON-NLS-1$
 
 	private static String checkName(AdapterFactory adapterFactory,
 			Object parent, Object e, final Class type,
@@ -99,8 +99,8 @@
 			if (child != e && childFilter.accept(child)) {
 				String name = nameProvider.getName(child);
 				if (name.equalsIgnoreCase(newName)) {
-					return LibraryEditResources.formatString(
-							"LibraryEdit.duplicateElementNameError.msg", name); //$NON-NLS-1$
+					//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+					return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
 				}
 			}
 		}
@@ -145,9 +145,8 @@
 			elementType = ELEMENT_TEXT;
 		}
 		if (newName == null || newName.trim().length() == 0) {
-			return LibraryEditResources
-					.formatString(
-							"LibraryEdit.emptyElementNameError.msg", StrUtil.toLower(elementType)); //$NON-NLS-1$
+			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+			return NLS.bind(LibraryEditResources.emptyElementNameError_msg, StrUtil.toLower(elementType)); 
 		}
 		ITreeItemContentProvider adapter = (ITreeItemContentProvider) adapterFactory
 				.adapt(e, ITreeItemContentProvider.class);
@@ -206,9 +205,8 @@
 				if (child != e && childFilter.accept(child)) {
 					String childName = (String) ((EObject) child).eGet(feature);
 					if (name.equalsIgnoreCase(childName)) {
-						return LibraryEditResources
-								.formatString(
-										"LibraryEdit.duplicateElementNameError.msg", name); //$NON-NLS-1$
+						//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+						return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, name); 
 					}
 
 				}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ContentElementNameValidator.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ContentElementNameValidator.java
index 472f47b..5aef1f7 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ContentElementNameValidator.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ContentElementNameValidator.java
@@ -23,6 +23,7 @@
 import org.eclipse.epf.uma.UmaPackage;
 import org.eclipse.epf.uma.util.ContentDescriptionFactory;
 import org.eclipse.epf.uma.util.UmaUtil;
+import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -82,8 +83,8 @@
 				currentFile = file;
 			}
 			if (file.exists() && !file.equals(currentFile)) {
-				return LibraryEditResources.formatString(
-						"LibraryEdit.duplicateContentFileError.msg", file); //$NON-NLS-1$
+				//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+				return NLS.bind(LibraryEditResources.duplicateContentFileError_msg, file); 
 			}
 		}
 
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/UniquenessValidator.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/UniquenessValidator.java
index f21c28c..608ef57 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/UniquenessValidator.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/UniquenessValidator.java
@@ -20,6 +20,7 @@
 import org.eclipse.epf.library.edit.LibraryEditResources;
 import org.eclipse.epf.library.edit.util.TngUtil;
 import org.eclipse.epf.library.edit.validation.IValidator;
+import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -67,8 +68,8 @@
 			return null;
 		newText = newText.trim();
 		if (StrUtil.isBlank(newText)) {
-			return LibraryEditResources.formatString(
-					"LibraryEdit.emptyElementNameError.msg", featureName); //$NON-NLS-1$
+			//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+			return NLS.bind(LibraryEditResources.emptyElementNameError_msg, featureName); 
 		}
 		Collection children;
 		if (containingFeature == null) {
@@ -81,9 +82,8 @@
 			if (child != object && childFilter.accept(child)) {
 				String name = (String) ((EObject) child).eGet(feature);
 				if (name.equalsIgnoreCase(newText)) {
-					return LibraryEditResources
-							.formatString(
-									"LibraryEdit.duplicateElementNameError.msg", newText); //$NON-NLS-1$
+					//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+					return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, newText); 
 				}
 			}
 		}
diff --git a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ValidatorFactory.java b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ValidatorFactory.java
index aa9938a..27c126e 100755
--- a/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ValidatorFactory.java
+++ b/plugins/org.eclipse.epf.library.edit/src/org/eclipse/epf/library/edit/validation/internal/ValidatorFactory.java
@@ -37,6 +37,7 @@
 import org.eclipse.epf.uma.ProcessComponent;
 import org.eclipse.epf.uma.ProcessPackage;
 import org.eclipse.epf.uma.UmaPackage;
+import org.eclipse.osgi.util.NLS;
 
 
 /**
@@ -89,9 +90,8 @@
 						BreakdownElement element = (BreakdownElement) itor
 								.next();
 						if (element.getPresentationName().equals(newText)) {
-							return LibraryEditResources
-									.formatString(
-											"LibraryEdit.duplicateElementNameError.msg", newText);//$NON-NLS-1$
+							//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+							return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, newText);
 						}
 					}
 					return null;
@@ -109,9 +109,8 @@
 						BreakdownElement element = (BreakdownElement) itor
 								.next();
 						if (element.getPresentationName().equals(newText)) {
-							return LibraryEditResources
-									.formatString(
-											"LibraryEdit.duplicateElementNameError.msg", newText);//$NON-NLS-1$
+							//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+							return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, newText);
 						}
 					}
 					return null;
@@ -189,9 +188,8 @@
 						BreakdownElement element = (BreakdownElement) itor
 								.next();
 						if (element.getPresentationName().equals(newText)) {
-							return LibraryEditResources
-									.formatString(
-											"LibraryEdit.duplicateElementNameError.msg", newText); //$NON-NLS-1$
+							//		return I18nUtil.formatString(RESOURCE_BUNDLE, key, data);
+							return NLS.bind(LibraryEditResources.duplicateElementNameError_msg, newText); 
 						}
 					}
 					return null;
diff --git a/plugins/org.eclipse.epf.library/META-INF/MANIFEST.MF b/plugins/org.eclipse.epf.library/META-INF/MANIFEST.MF
index 071fcd9..dae8ca7 100755
--- a/plugins/org.eclipse.epf.library/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epf.library/META-INF/MANIFEST.MF
@@ -3,6 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.epf.library; singleton:=true
 Bundle-Version: 1.0.0
+Bundle-ClassPath: library.jar
 Bundle-Activator: org.eclipse.epf.library.LibraryPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.epf.library/build.properties b/plugins/org.eclipse.epf.library/build.properties
index 062d37e..1cfe429 100755
--- a/plugins/org.eclipse.epf.library/build.properties
+++ b/plugins/org.eclipse.epf.library/build.properties
@@ -1,6 +1,6 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
+source.library.jar = src/
+output.library.jar = bin/
+bin.includes = library.jar,\
                .options,\
                META-INF/,\
                icons/,\
diff --git a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationHelper.java b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationHelper.java
index 88e68ad..faf9a6d 100755
--- a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationHelper.java
+++ b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/configuration/ConfigurationHelper.java
@@ -15,6 +15,7 @@
 import java.util.List;
 import java.util.TreeSet;
 
+import org.apache.tools.ant.taskdefs.Length;
 import org.eclipse.emf.ecore.EAttribute;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
@@ -1436,7 +1437,7 @@
 	 * @param config
 	 * @return String
 	 */
-	public static String getActivityStringAttribute(MethodElement e, EAttribute attrib) {
+	public static String getActivityStringAttribute(MethodElement e, EAttribute attrib, MethodConfiguration config) {
 		if(!String.class.isAssignableFrom(attrib.getEAttributeType().getInstanceClass())) {
 			throw new IllegalArgumentException("The specified attribute is not of type String: " + attrib); //$NON-NLS-1$
 		}
@@ -1457,86 +1458,110 @@
 		if(attrib == UmaPackage.eINSTANCE.getMethodElement_Guid() || attrib == UmaPackage.eINSTANCE.getNamedElement_Name()) {
 			return (String)e.eGet(attrib);
 		}		
-				
-		List values = new ArrayList();
-		VariabilityElement base;
-		VariabilityType variabilityType;	
-		boolean concat = attrib != UmaPackage.eINSTANCE.getDescribableElement_PresentationName();
-		while(true) {
-			base = ve.getVariabilityBasedOnElement();
-			if(base == null) {
-				Object str;
-				if ( isDesc ) {
-					str = ((DescribableElement)ve).getPresentation().eGet(attrib); 
-				} else {
-					str =  ve.eGet(attrib); 
-				}
-				if(str == null || str.toString().length() == 0) {
-					if(values.isEmpty()) {
-						values.add(str);
-					}
-				}
-				else {
-					values.add(0, str);
-				}
-				break;
+			
+		VariabilityElement base = ve.getVariabilityBasedOnElement();
+		VariabilityType variabilityType = ve.getVariabilityType();
+		Object str;
+		if( base != null && variabilityType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {
+			// for local contribution, append the text to the base
+			str = ((DescribableElement)ve).getPresentation().eGet(attrib);
+			Object strBase;
+			if ( isDesc ) {
+				strBase = calcAttributeFeatureValue( ((DescribableElement)base).getPresentation(), base, attrib, config);
+			} else {
+				strBase = calcAttributeFeatureValue(base, null, attrib, config);				
 			}
-			else if(base instanceof Activity) {
-				Object str;
-				if ( isDesc ) {
-					str = ((DescribableElement)ve).getPresentation().eGet(attrib); 
-				} else {
-					str = ve.eGet(attrib); 
-				}
+			
+			if ( str != null && str.toString().length() > 0 
+					&& strBase != null && strBase.toString().length() > 0 ) {
+				str = strBase + ATTRIBUTE_VALUE_SEPERATOR + str;
+			}
+			
+		} else {
+			str = calcAttributeFeatureValue(e, ve, attrib, config);
+		}
 
-				variabilityType = ve.getVariabilityType();
-				if(variabilityType == VariabilityType.EXTENDS_LITERAL) {
-					if(str == null || str.toString().length() == 0) {
-						// use the value of the base
-						//
-						ve = base;
-					}
-					else {
-						values.add(0, str);
-						break;
-					}
-				}
-				else if(variabilityType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {					
-					if(str != null && str.toString().length() > 0) {
-						// add to the list
-						//
-						values.add(0, str);
-						if(!concat) {
-							break;
-						}
-					}
-					// go to the base
-					ve = base;
-				}
-				else if(variabilityType == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
-					values.add(0, str);
-					break;
-				}
-				//TODO: handle CONTRIBUTES AND REPLACES
-			}
-		}
+		return (str==null) ? "" : str.toString();
 		
-		if ( values.size() == 0 ) {
-			return ""; //$NON-NLS-1$
-		}
-		else if ( values.size() ==1 ) {
-			return (String)values.get(0);
-		}
-		else {
-			StringBuffer buffer = new StringBuffer();
-			for (Iterator it = values.iterator(); it.hasNext(); ) {
-				if ( buffer.length() > 0 ) {
-					buffer.append(ATTRIBUTE_VALUE_SEPERATOR);
-				}
-				buffer.append(it.next());
-			}
-			return buffer.toString();			
-		}
+//		List values = new ArrayList();
+//		VariabilityElement base;
+//		VariabilityType variabilityType;	
+//		boolean concat = attrib != UmaPackage.eINSTANCE.getDescribableElement_PresentationName();
+//		while(true) {
+//			base = ve.getVariabilityBasedOnElement();
+//			if(base == null) {
+//				Object str;
+//				if ( isDesc ) {
+//					str = ((DescribableElement)ve).getPresentation().eGet(attrib); 
+//				} else {
+//					str =  ve.eGet(attrib); 
+//				}
+//				if(str == null || str.toString().length() == 0) {
+//					if(values.isEmpty()) {
+//						values.add(str);
+//					}
+//				}
+//				else {
+//					values.add(0, str);
+//				}
+//				break;
+//			}
+//			else if(base instanceof Activity) {
+//				Object str;
+//				if ( isDesc ) {
+//					str = ((DescribableElement)ve).getPresentation().eGet(attrib); 
+//				} else {
+//					str = ve.eGet(attrib); 
+//				}
+//
+//				variabilityType = ve.getVariabilityType();
+//				if(variabilityType == VariabilityType.EXTENDS_LITERAL) {
+//					if(str == null || str.toString().length() == 0) {
+//						// use the value of the base
+//						//
+//						ve = base;
+//					}
+//					else {
+//						values.add(0, str);
+//						break;
+//					}
+//				}
+//				else if(variabilityType == VariabilityType.LOCAL_CONTRIBUTION_LITERAL) {					
+//					if(str != null && str.toString().length() > 0) {
+//						// add to the list
+//						//
+//						values.add(0, str);
+//						if(!concat) {
+//							break;
+//						}
+//					}
+//					// go to the base
+//					ve = base;
+//				}
+//				else if(variabilityType == VariabilityType.LOCAL_REPLACEMENT_LITERAL) {
+//					values.add(0, str);
+//					break;
+//				}
+//				//TODO: handle CONTRIBUTES AND REPLACES
+//			}
+//		}
+//		
+//		if ( values.size() == 0 ) {
+//			return ""; //$NON-NLS-1$
+//		}
+//		else if ( values.size() ==1 ) {
+//			return (String)values.get(0);
+//		}
+//		else {
+//			StringBuffer buffer = new StringBuffer();
+//			for (Iterator it = values.iterator(); it.hasNext(); ) {
+//				if ( buffer.length() > 0 ) {
+//					buffer.append(ATTRIBUTE_VALUE_SEPERATOR);
+//				}
+//				buffer.append(it.next());
+//			}
+//			return buffer.toString();			
+//		}
 	}
 	
 	public static List getAllProcesses(MethodConfiguration config) {
diff --git a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractElementLayout.java b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractElementLayout.java
index 8a2225f..9e50c9c 100755
--- a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractElementLayout.java
+++ b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/AbstractElementLayout.java
@@ -363,6 +363,7 @@
 				}
 				EAttribute attrib = (EAttribute)p;
 				String name = p.getName();
+								
 				Object value;
 				if (name.equals("presentationName")) //$NON-NLS-1$
 				{
@@ -372,7 +373,7 @@
 				} else if( isActivityAttribute && String.class.isAssignableFrom(attrib.getEAttributeType().getInstanceClass())) {
 					
 					// for activity, the way to merge attribute from base is different
-					value = ConfigurationHelper.getActivityStringAttribute(element, attrib);
+					value = ConfigurationHelper.getActivityStringAttribute(element, attrib, getLayoutMgr().getConfiguration());
 				} else {
 					value = getAttributeFeatureValue(p);
 				}
diff --git a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayout.java b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayout.java
index e00dc09..58ca758 100755
--- a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayout.java
+++ b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/layout/elements/ActivityLayout.java
@@ -73,6 +73,8 @@
 	org.eclipse.epf.diagram.model.util.DiagramInfo userDiagramInfo = null;
 	boolean debug = LibraryPlugin.getDefault().isDebugging();
 	
+	private TBSItemDetail itemDetail = new TBSItemDetail();
+	
 	public ActivityLayout() {
 		super();
 	}
@@ -238,7 +240,6 @@
 			t.start();
 		}
 
-		
 		buildWBS(elementXml, sup);
 		if ( debug ) {
 			t.stop();
@@ -435,11 +436,7 @@
 		// roolup the layout
 		IBSItemProvider provider = (IBSItemProvider) adapterFactory.adapt(
 				super.element, ITreeItemContentProvider.class);
-		provider.setRolledUp(true);
-		
-		ActivityLayoutSetting setting = new ActivityLayoutSetting(adapterFactory, crs, sup);
-		setting.rollupRoles = true;
-		
+				
 		// need to get the raw item provider from the adapter factory
 		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
 		if ( wrapper == null ) {
@@ -447,6 +444,14 @@
 		}
 		ProcessElementItem elementItem = new ProcessElementItem(wrapper, super.element, super.elementProcessPath);
 
+		// collect all RoleDescriptors before rollup
+		provider.setRolledUp(false);
+		itemDetail.iterate(adapterFactory, wrapper);
+
+		provider.setRolledUp(true);		
+		ActivityLayoutSetting setting = new ActivityLayoutSetting(adapterFactory, crs, sup);
+		setting.rollupRoles = true;
+
 		iterate(elementItem, bs, setting);
 	}
 	
@@ -601,7 +606,10 @@
 		// lat the presentation to determine when to show
 		// set generate the flag for browsing
 		boolean isSupressed = setting.sup.isSuppressed(elementItem.rawItem);
-				
+		if ( isSupressed ) {
+			itemDetail.addSuppressed(elementItem.element);
+		}
+		
 		XmlElement child = l.getXmlElement(false);
 
 		// we still generate the item even though it's suppressed, 
@@ -755,38 +763,68 @@
 	
 	private void buildRoleRollup(RoleDescriptor roleItem, XmlElement parentXml,
 			ActivityLayoutSetting setting) {
-		EStructuralFeature feature = UmaPackage.eINSTANCE
-				.getRoleDescriptor_ResponsibleFor();
-		List responsibleFor = ConfigurationHelper.calc0nFeatureValue(roleItem,
-				feature, getLayoutMgr().getElementRealizer());
+		Role r = roleItem.getRole();
+		List descriptors = itemDetail.getDescriptors(r);
+		if ( descriptors == null ) {
+			descriptors = new ArrayList();
+		}
+		if ( !descriptors.contains(roleItem) ) {
+			descriptors.add(roleItem);
+		}
+		
+		List responsibleFor = new ArrayList();
+		List modifies = new ArrayList();
+		List primaryTasks = new ArrayList();
+		List additionalTasks = new ArrayList();	
+		List items;
+		
+		for ( Iterator it = descriptors.iterator(); it.hasNext(); ) {
+			
+			roleItem = (RoleDescriptor) it.next();
+			
+			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
+					UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor(), 
+					getLayoutMgr().getElementRealizer());
+			responsibleFor.addAll(items);
+				
+			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
+					UmaPackage.eINSTANCE.getRoleDescriptor_Modifies(), getLayoutMgr().getElementRealizer());
+			modifies.addAll(items);
+			
+			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
+					AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors,
+					getLayoutMgr().getElementRealizer());
+			primaryTasks.addAll(items);
+			
+			items = ConfigurationHelper.calc0nFeatureValue(roleItem,
+					AssociationHelper.RoleDescriptor_AdditionalTaskDescriptors, 
+					getLayoutMgr().getElementRealizer());
+			additionalTasks.addAll(items);
+		}
+		
 		createRoleRollupNodes(parentXml, responsibleFor, TngUtil
-				.getFeatureText(feature));
+				.getFeatureText(UmaPackage.eINSTANCE.getRoleDescriptor_ResponsibleFor()));
 
-		feature = UmaPackage.eINSTANCE.getRoleDescriptor_Modifies();
-		List modifies = ConfigurationHelper.calc0nFeatureValue(roleItem,
-				feature, getLayoutMgr().getElementRealizer());
 		createRoleRollupNodes(parentXml, modifies, TngUtil
-				.getFeatureText(feature));
+				.getFeatureText(UmaPackage.eINSTANCE.getRoleDescriptor_Modifies()));
 
-//		feature = UmaPackage.eINSTANCE.getRoleDescriptor_PerformsAsOwner();
-		OppositeFeature ofeature = AssociationHelper.RoleDescriptor_PrimaryTaskDescriptors;		
-		List primaryTasks = ConfigurationHelper.calc0nFeatureValue(roleItem,
-				ofeature,  getLayoutMgr().getElementRealizer());
-		createRoleRollupNodes(parentXml, primaryTasks, TngUtil
-				.getFeatureText(feature));
+		createRoleRollupNodes(parentXml, primaryTasks, "Performs as Owner");
 
-//		feature = UmaPackage.eINSTANCE.getRoleDescriptor_PerformsAdditionally();
-		List additionalTasks = ConfigurationHelper.calc0nFeatureValue(roleItem,
-				ofeature, getLayoutMgr().getElementRealizer());
-		createRoleRollupNodes(parentXml, additionalTasks, TngUtil
-				.getFeatureText(feature));
+		createRoleRollupNodes(parentXml, additionalTasks, "Performs as Additional");
 
 	}
 
 	private void createRoleRollupNodes(XmlElement parentXml, List items,
 			String info) {
+		List processed = new ArrayList();
 		for (Iterator it = items.iterator(); it.hasNext();) {
 			MethodElement e = (MethodElement) it.next();
+			if ( processed.contains(e) ) {
+				continue;
+			}
+			
+			processed.add(e);
+			
 			IElementLayout l = layoutManager.getLayout(e, true);
 			XmlElement child = l.getXmlElement(false);
 			child.setAttribute("ModelInfo", info); //$NON-NLS-1$
@@ -959,6 +997,75 @@
 		}
 	}
 
+	public class TBSItemDetail {
+		
+		// record the suppressed items
+		List suppressedItems = new ArrayList();
+		
+		// map of role to role descriptors
+		Map roleDescriptorMap = new HashMap();
+		
+		public TBSItemDetail() {
+			
+		}
+		
+		public void addSuppressed(Object item) {
+			if ( !suppressedItems.contains(item) ) {
+				suppressedItems.add(item);
+			}
+		}
+		
+		public void iterate(ComposedAdapterFactory adapterFactory, Object parentObj) {
+		
+			ITreeItemContentProvider provider = null;
+			if (parentObj instanceof ITreeItemContentProvider) {
+				provider = (ITreeItemContentProvider) parentObj;
+			} else {
+				provider = (ITreeItemContentProvider) adapterFactory.adapt(
+						parentObj, ITreeItemContentProvider.class);
+			}
+
+			// Either delegate the call or return nothing.
+			if (provider == null) {
+				return;
+			}
+				
+			Collection items = provider.getChildren(parentObj);
+			for (Iterator it = items.iterator(); it.hasNext();) {
+				Object rawitem = it.next();
+
+				MethodElement item = (MethodElement) LibraryUtil.unwrap(rawitem);
+				if ( item instanceof RoleDescriptor ) {
+					addRoleDescriptor( (RoleDescriptor)item );
+				} else {
+					iterate(adapterFactory, rawitem);
+				}
+			}
+		}
+		
+		
+		private void addRoleDescriptor(RoleDescriptor rdesc) {
+			Role r = rdesc.getRole();
+			if (r != null ) {
+				List items = (List)roleDescriptorMap.get(r);
+				if ( items == null ) {
+					items = new ArrayList();
+					roleDescriptorMap.put(r, items);
+					if (debug ) {
+						System.out.println("Added RoleDescriptor " + rdesc.getPresentationName());
+					}
+				}
+				
+				if ( !items.contains(rdesc) ) {
+					items.add(rdesc);
+				}
+			}
+		}
+		
+		public List getDescriptors(Role r) {
+			return (List)roleDescriptorMap.get(r);
+		}
+	}
 	
 	/**
 	 * load the process specific layout data for publishing.
@@ -1170,4 +1277,79 @@
 			}
 		}
 	}	
+	
+	/**
+	 * get all the linked tasks, roles, and workproducts for this activity and all it's breakdown elements, recursively.
+	 * 
+	 * @return List
+	 */
+	public void findAllLinkedElements() {
+		// iterate the breakdown structure and collect the info.
+		Process proc = getOwningProcess();
+		
+		// need to handle the supressed breakdown elements
+		// use the Supress utility
+		Suppression sup = getSuppression(proc);
+
+		// publish the consolidated view
+		ComposedAdapterFactory adapterFactory = layoutManager
+				.getCBSAdapterFactory();
+
+		// need to get the raw item provider from the adapter factory
+		Object wrapper = sup.getObjectByPath(super.paths, adapterFactory);
+		if ( wrapper == null ) {
+			wrapper = super.element;
+		}
+		
+		getLayoutMgr().getValidator().addReferencedElement(null, super.element);
+
+		iterateItemForLinkedElements(wrapper, adapterFactory, sup);
+	}
+
+	private void iterateItemForLinkedElements(Object parentObj, ComposedAdapterFactory adapterFactory, Suppression sup) {
+		
+		ITreeItemContentProvider provider = null;
+		
+		if (parentObj instanceof ITreeItemContentProvider) {
+			provider = (ITreeItemContentProvider) parentObj;
+		} else {
+			provider = (ITreeItemContentProvider) adapterFactory.adapt(
+					parentObj, ITreeItemContentProvider.class);
+		}
+
+		// Either delegate the call or return nothing.
+		if (provider == null) {
+			return;
+		}
+		
+		Collection items = provider.getChildren(parentObj);
+		for (Iterator it = items.iterator(); it.hasNext();) {
+			Object rawitem = it.next();			
+			
+			if ( sup.isSuppressed(rawitem) ) {
+				continue;
+			}
+			
+			MethodElement item = (MethodElement) LibraryUtil
+					.unwrap(rawitem);
+			MethodElement e = null;
+			if ( item instanceof TaskDescriptor ) {
+				e = ((TaskDescriptor)item).getTask();
+			} else if ( item instanceof RoleDescriptor ) {
+				e = ((RoleDescriptor)item).getRole();
+			} else if ( item instanceof WorkProductDescriptor ) {
+				e = ((WorkProductDescriptor)item).getWorkProduct();
+			} 
+			
+			if ( e != null ) {
+				getLayoutMgr().getValidator().addReferencedElement(item, e);
+			} 
+				
+			MethodElement parent = (MethodElement) LibraryUtil.unwrap(rawitem);
+			getLayoutMgr().getValidator().addReferencedElement(parent, item);
+
+			iterateItemForLinkedElements(rawitem, adapterFactory, sup);
+		}
+	}	
+	
 }
diff --git a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/CopyAttachmentsToNewLocation.java b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/CopyAttachmentsToNewLocation.java
index d62b1c9..a2b5b37 100755
--- a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/CopyAttachmentsToNewLocation.java
+++ b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/CopyAttachmentsToNewLocation.java
@@ -288,7 +288,7 @@
 
 		// get list of .xmi files in newLibDir
 		if (xmiList == null)
-			xmiList = ImportExportUtil.fileList(new File(newLibDir), "xmi"); //$NON-NLS-1$
+			xmiList = FileUtil.fileList(new File(newLibDir), "xmi"); //$NON-NLS-1$
 
 		if (monitor != null)
 			monitor.subTask(LibraryResources
diff --git a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ImportExportUtil.java b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ImportExportUtil.java
index 8f306d4..48bee6e 100755
--- a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ImportExportUtil.java
+++ b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/ImportExportUtil.java
@@ -14,329 +14,30 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.text.MessageFormat;
-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.Map;
-import java.util.Set;
-import java.util.logging.FileHandler;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-import java.util.logging.SimpleFormatter;
 
 import javax.xml.parsers.FactoryConfigurationError;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.provider.DelegatingWrapperItemProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
 import org.eclipse.epf.common.utils.FileUtil;
 import org.eclipse.epf.library.ILibraryManager;
 import org.eclipse.epf.library.LibraryResources;
 import org.eclipse.epf.library.LibraryService;
-import org.eclipse.epf.library.edit.TransientGroupItemProvider;
-import org.eclipse.epf.library.edit.navigator.ConfigurationsItemProvider;
 import org.eclipse.epf.persistence.MultiFileResourceSetImpl;
 import org.eclipse.epf.persistence.MultiFileSaveUtil;
-import org.eclipse.epf.resourcemanager.ResourceDescriptor;
 import org.eclipse.epf.resourcemanager.ResourceManager;
-import org.eclipse.epf.uma.ContentElement;
-import org.eclipse.epf.uma.Domain;
-import org.eclipse.epf.uma.MethodConfiguration;
-import org.eclipse.epf.uma.MethodElement;
-import org.eclipse.epf.uma.MethodLibrary;
-import org.eclipse.epf.uma.MethodPlugin;
 import org.eclipse.epf.uma.Process;
 import org.eclipse.epf.uma.ProcessComponent;
 import org.eclipse.epf.uma.Task;
 import org.eclipse.epf.uma.TaskDescriptor;
-import org.eclipse.jface.viewers.IStructuredSelection;
 import org.xml.sax.SAXException;
 
 public class ImportExportUtil {
 	
-	public static final String NEW_LINE = System.getProperty(
-			"line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-
-	/**
-	 * gets a Logger for all import/export routines
-	 * 
-	 * @param classname
-	 * @param filename
-	 * @return
-	 */
-	public static Logger getLogger(String classname, String filename) {
-		Logger logger = Logger.getLogger(classname);
-		try {
-			new File(filename).getParentFile().mkdirs();
-			FileHandler fh = new FileHandler(filename, false);
-			fh.setFormatter(new SimpleFormatter() {
-				public String format(LogRecord rec) {
-					StringBuffer buf = new StringBuffer(1000);
-					buf.append(new java.util.Date());
-					buf.append(' ');
-					// buf.append(rec.getLevel());
-					// buf.append(' ');
-					buf.append(formatMessage(rec));
-					buf.append('\n');
-					return buf.toString();
-				}
-			});
-
-			fh.setLevel(Level.ALL);
-			logger.addHandler(fh);
-			logger.setUseParentHandlers(false);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		return logger;
-	}
-
-	public static void closeLog(Logger logger) {
-		Handler[] handlers = logger.getHandlers();
-		for (int i = 0; i < handlers.length; i++)
-			handlers[i].close();
-	}
-
-	/**
-	 * given a directory and extension, returns all files (recursively) whose
-	 * extension startsWith the given extension
-	 * 
-	 * @param f
-	 * @param extension
-	 * @return
-	 */
-	public static List fileList(File f, String extension) {
-		extension = extension.toUpperCase();
-		List returnList = new ArrayList();
-		try {
-			if (f.isDirectory()) { // if dir then recurse
-				String[] flist = f.list();
-				for (int i = 0; i < flist.length; ++i) {
-					File fc = new File(f.getPath(), flist[i]);
-					returnList.addAll(fileList(fc, extension));
-				}
-			} else { // ordinary file
-				if (extension != null) {
-					String name = f.getName().toUpperCase();
-					if (name.lastIndexOf(".") != -1) //$NON-NLS-1$
-						if (name
-								.substring(name.lastIndexOf(".") + 1).startsWith(extension)) { //$NON-NLS-1$
-							returnList.add(f);
-						}
-				} else
-					returnList.add(f);
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		return returnList;
-	}
-
-	/**
-	 * given a directory and extension, returns all files (recursively)whose
-	 * extension does not startsWith the given extension
-	 * 
-	 * @param f
-	 * @param extension
-	 * @return
-	 */
-	public static List fileListExcludeExt(File f, String extension) {
-		List returnList = new ArrayList();
-		try {
-			if (f.isDirectory()) { // if dir then recurse
-				String[] flist = f.list();
-				for (int i = 0; i < flist.length; ++i) {
-					File fc = new File(f.getPath(), flist[i]);
-					returnList.addAll(fileListExcludeExt(fc, extension));
-				}
-			} else { // ordinary file
-				if (extension != null) {
-					String name = f.getName();
-					if (name.lastIndexOf(".") != -1) //$NON-NLS-1$
-						if (!(name.substring(name.lastIndexOf(".") + 1).startsWith(extension))) { //$NON-NLS-1$
-							returnList.add(f);
-						}
-				} else
-					returnList.add(f);
-			}
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-		return returnList;
-	}
-
-	private static void addGuidsOfMethodElement(MethodElement element,
-			List list, List children) {
-		list.add(element.getGuid());
-		// now add stuff that is shown as children in lib nav
-		for (Iterator iter = element.eAdapters().iterator(); iter.hasNext();) {
-			Object adapter = iter.next();
-			if (adapter instanceof ItemProviderAdapter) {
-				children.addAll(((ItemProviderAdapter) adapter)
-						.getChildren(element));
-				break;
-			}
-		}
-
-		if (element instanceof Domain) {
-			children.addAll(((Domain) element).getWorkProducts());
-		} else if (element instanceof MethodConfiguration) {
-			children.addAll(((MethodConfiguration) element)
-					.getMethodPackageSelection());
-			// children.addAll(((MethodConfiguration)o).getMethodPluginSelection());
-		}
-		if (element instanceof ContentElement) {
-			children.addAll(((ContentElement) element).getAssets());
-			children.addAll(((ContentElement) element).getChecklists());
-			children.addAll(((ContentElement) element).getConceptsAndPapers());
-			children.addAll(((ContentElement) element).getExamples());
-			children.addAll(((ContentElement) element).getGuidelines());
-			children
-					.addAll(((ContentElement) element).getSupportingMaterials());
-		}
-	}
-
-	/**
-	 * Given an object (from the library navigator), creates a list of children.
-	 * Used by Internal export wizards to determine which elements to export
-	 * based on user selection.
-	 * 
-	 * @param o
-	 * @return
-	 */
-	private static Collection getMethodElementChildren(Object o,
-			Set visitedElements) {
-		List list = new ArrayList();
-		List children = new ArrayList();
-		if (o == null)
-			return list;
-		if (visitedElements.contains(o)) {
-			return list;
-		} else
-			visitedElements.add(o);
-		if (o instanceof MethodElement) {
-			addGuidsOfMethodElement((MethodElement) o, list, children);
-		} else if (o instanceof TransientGroupItemProvider) {
-			children.addAll(((TransientGroupItemProvider) o).getChildren(o));
-		} else if (o instanceof ItemProviderAdapter) {
-			children.addAll(((ItemProviderAdapter) o).getChildren(o));
-		} else if (o instanceof DelegatingWrapperItemProvider) {
-			Object e = ((DelegatingWrapperItemProvider) o).getEditableValue(o);
-			if (e instanceof MethodElement)
-				addGuidsOfMethodElement((MethodElement) e, list, children);
-			children.addAll(((DelegatingWrapperItemProvider) o).getChildren(o));
-		} else if (o instanceof ConfigurationsItemProvider) {
-			children.addAll(((ConfigurationsItemProvider) o).getChildren(o));
-		}
-
-		if (children != null && children.size() > 0) {
-			Iterator iterator = children.iterator();
-			while (iterator.hasNext()) {
-				Object obj = (Object) iterator.next();
-				list.addAll(getMethodElementChildren(obj, visitedElements));
-			}
-		}
-
-		return list;
-	}
-
-	public static Collection getSelectedElements(IStructuredSelection selection) {
-		List exportList = new ArrayList();
-		if (selection != null && selection.size() > 0) {
-			Iterator iter = selection.iterator();
-			while (iter.hasNext()) {
-				Object o = iter.next();
-				if (o instanceof MethodPlugin) {
-					MethodPlugin e = (MethodPlugin) o;
-					// // initialize list of elements to export
-					exportList.add(e.getGuid());
-				} else
-					exportList
-							.addAll(getMethodElementChildren(o, new HashSet()));
-			}
-		} else {
-			// selection is null, so export whole library
-			MethodLibrary library = LibraryService.getInstance()
-					.getCurrentMethodLibrary();
-			List plugins = (library == null) ? new ArrayList() : library
-					.getMethodPlugins();
-			Iterator iter = plugins.iterator();
-			while (iter.hasNext()) {
-				MethodPlugin plugin = (MethodPlugin) iter.next();
-				exportList.add(plugin.getGuid());
-			}
-		}
-		return exportList;
-	}
-
-	/**
-	 * Escapes the given string to make it HTML friendly. Converts '&' to
-	 * "&amp;"
-	 * 
-	 * @param str
-	 *            The source string.
-	 * @return The escaped string.
-	 */
-	public static String escapeHTML(String str) {
-		StringBuffer sb = new StringBuffer();
-		int len = (str == null) ? 0 : str.length();
-		for (int i = 0; i < len; i++) {
-			char ch = str.charAt(i);
-			switch (ch) {
-			case '&':
-				sb.append("&amp;"); //$NON-NLS-1$
-				break;
-			default:
-				sb.append(ch);
-				break;
-			}
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * The reverse of escapeHTML - converts "&amp;" to '&'
-	 * 
-	 * @param str
-	 * @return
-	 */
-	public static String unescapeHTML(String str) {
-		if (str == null)
-			return ""; //$NON-NLS-1$
-		str = str.replaceAll("&amp;", "&"); //$NON-NLS-1$ //$NON-NLS-2$
-		return str;
-	}
-
-	public static String findPresUri(ResourceManager resMgr, String guid)
-			throws RuntimeException {
-		String presUri = null;
-		try {
-			ResourceDescriptor resDesc = MultiFileSaveUtil
-					.findResourceDescriptor(resMgr, guid);
-			if (resDesc != null) {
-				presUri = resDesc.getResolvedURI().toFileString();
-			} else {
-				ILibraryManager manager = LibraryService.getInstance()
-						.getCurrentLibraryManager();
-				if (manager != null) {
-					MethodElement element = manager.getMethodElement(guid);
-					if (element != null)
-						presUri = element.eResource().getURI().toFileString();
-				}
-			}
-			return presUri;
-		} catch (RuntimeException e) {
-			throw e;
-		}
-	}
-
 	public static void replace(ProcessComponent procComp, String dir)
 			throws IOException, ParserConfigurationException,
 			FactoryConfigurationError, SAXException {
diff --git a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/TextReferenceReplacerImpl.java b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/TextReferenceReplacerImpl.java
index 3e5175f..632121a 100755
--- a/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/TextReferenceReplacerImpl.java
+++ b/plugins/org.eclipse.epf.library/src/org/eclipse/epf/library/util/TextReferenceReplacerImpl.java
@@ -24,10 +24,15 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.epf.library.LibraryPlugin;
 import org.eclipse.epf.library.edit.util.ITextReferenceReplacer;
+import org.eclipse.epf.persistence.MultiFileSaveUtil;
+import org.eclipse.epf.uma.CapabilityPattern;
+import org.eclipse.epf.uma.DeliveryProcess;
 import org.eclipse.epf.uma.MethodElement;
 
 public class TextReferenceReplacerImpl implements ITextReferenceReplacer {
 	
+	private static String CAPABILITY_PATH = MultiFileSaveUtil.CAPABILITY_PATTERN_PATH + "/";
+	private static String DELIVERY_PATH = MultiFileSaveUtil.DELIVERY_PROCESS_PATH + "/";
 	private static boolean debug = LibraryPlugin.getDefault().isDebugging();
 	private final static boolean localDebug  = false;	
 	
@@ -86,8 +91,20 @@
 		if (localMap == null) {
 			return source;
 		}
-		//source = ResourceHelper.validateTag(source);
-
+		
+		String replacingPath = null;
+		String replacedPath = null;			
+		if (owner instanceof DeliveryProcess) {
+			replacingPath = DELIVERY_PATH;
+			replacedPath = CAPABILITY_PATH;
+		}
+		else if (owner instanceof CapabilityPattern) {
+			replacingPath = CAPABILITY_PATH;
+			replacedPath = DELIVERY_PATH;
+		} else {
+			throw new UnsupportedOperationException();
+		}
+		
 		StringBuffer sb = new StringBuffer();
 		Matcher m = ResourceHelper.p_link_ref.matcher(source);
 
@@ -104,8 +121,10 @@
 				System.out.println("LD> newGuid: " + newGuid);
 			}			
 			if (newGuid != null && !newGuid.equals(oldGuid)) {
-				StringBuffer sb1 = new StringBuffer(oldGuid);				
 				String replacement = text.replaceAll(oldGuid, newGuid);
+				if (replacement.indexOf(replacedPath) > 0) {
+					replacement = replacement.replaceFirst(replacedPath, replacingPath);
+				}
 				if (localDebug) {
 					System.out.println("LD> replacement: " + replacement);
 				}
diff --git a/plugins/org.eclipse.epf.platform.feature/feature.xml b/plugins/org.eclipse.epf.platform.feature/feature.xml
index e6773ac..6f9c70a 100755
--- a/plugins/org.eclipse.epf.platform.feature/feature.xml
+++ b/plugins/org.eclipse.epf.platform.feature/feature.xml
@@ -592,4 +592,10 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.epf.platform"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
 </feature>
diff --git a/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/wizards/PublishConfigurationWizard.java b/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/wizards/PublishConfigurationWizard.java
index 7eb713a..18f3c99 100755
--- a/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/wizards/PublishConfigurationWizard.java
+++ b/plugins/org.eclipse.epf.publishing.ui/src/org/eclipse/epf/publishing/wizards/PublishConfigurationWizard.java
@@ -202,7 +202,7 @@
 					.getMsgDialog()
 					.displayPrompt(
 							PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
-							PublishingUIResources.bind("PublishingUI.confirmPathDialog.text", path)); //$NON-NLS-1$
+							PublishingUIResources.bind(PublishingUIResources.confirmPathDialog_text, path)); //$NON-NLS-1$
 
 			if (answer) {
 				dataModel.setPublicationPath(dir);
@@ -221,7 +221,7 @@
 						.getMsgDialog()
 						.displayConfirmation(
 								PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
-								PublishingUIResources.bind("PublishingUI.overwriteDialog.text", dir)); //$NON-NLS-1$
+								PublishingUIResources.bind(PublishingUIResources.overwriteDialog_text, dir)); //$NON-NLS-1$
 
 				if (answer == true) {
 					try {
@@ -234,7 +234,7 @@
 									.displayError(
 											PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
 											PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$							
-											PublishingUIResources.bind("PublishingUI.deleteFilesError.reason", dir)); //$NON-NLS-1$
+											PublishingUIResources.bind(PublishingUIResources.deleteFilesError_reason, dir)); //$NON-NLS-1$
 							return false;
 
 						}
@@ -245,7 +245,7 @@
 								.displayError(
 										PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
 										PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$							
-										PublishingUIResources.bind("PublishingUI.deleteFilesError.reason", dir), e); //$NON-NLS-1$
+										PublishingUIResources.bind(PublishingUIResources.deleteFilesError_reason, dir), e); //$NON-NLS-1$
 						return false;
 					}
 				}
@@ -262,7 +262,7 @@
 						.displayError(
 								PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
 								PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$
-								PublishingUIResources.bind("PublishingUI.createDirError.reason", file.getAbsolutePath()), e); //$NON-NLS-1$
+								PublishingUIResources.bind(PublishingUIResources.createDirError_reason, file.getAbsolutePath()), e); //$NON-NLS-1$
 				return false;
 			}
 			if (!answer) {
@@ -272,7 +272,7 @@
 						.displayError(
 								PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
 								PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$
-								PublishingUIResources.bind("PublishingUI.createDirError.reason", file.getAbsolutePath())); //$NON-NLS-1$
+								PublishingUIResources.bind(PublishingUIResources.createDirError_reason, file.getAbsolutePath())); //$NON-NLS-1$
 				return false;
 			}
 		}
diff --git a/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java b/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
index 189f63a..0f62b94 100755
--- a/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
+++ b/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ConfigurationViewBuilder.java
@@ -25,13 +25,11 @@
 import org.eclipse.epf.common.utils.Timer;
 import org.eclipse.epf.library.configuration.ConfigurationFilter;
 import org.eclipse.epf.library.configuration.ConfigurationHelper;
-import org.eclipse.epf.library.configuration.ElementRealizer;
 import org.eclipse.epf.library.edit.IFilter;
 import org.eclipse.epf.library.edit.TngAdapterFactory;
 import org.eclipse.epf.library.edit.process.IBSItemProvider;
 import org.eclipse.epf.library.edit.util.ProcessUtil;
 import org.eclipse.epf.library.edit.util.Suppression;
-import org.eclipse.epf.library.layout.ElementLayoutManager;
 import org.eclipse.epf.library.layout.HtmlBuilder;
 import org.eclipse.epf.library.layout.IElementLayout;
 import org.eclipse.epf.library.layout.elements.ActivityLayout;
@@ -47,7 +45,6 @@
 import org.eclipse.epf.uma.DeliveryProcess;
 import org.eclipse.epf.uma.Discipline;
 import org.eclipse.epf.uma.Guidance;
-import org.eclipse.epf.uma.MethodConfiguration;
 import org.eclipse.epf.uma.MethodElement;
 import org.eclipse.epf.uma.MethodLibrary;
 import org.eclipse.epf.uma.MethodPackage;
@@ -284,9 +281,13 @@
 		// need to build a closure of all the elements involved in the
 		// processes
 		List processes = options.getDeliverProcessList();
-		publishProcessElements(processes);
-		if (monitor.isCanceled()) {
-			return;
+		if ( processes != null && processes.size() > 0 ) {
+			for (Iterator it = processes.iterator(); it.hasNext(); ) {
+				makeProcessClosure( (org.eclipse.epf.uma.Process)it.next());
+				if (monitor.isCanceled()) {
+					return;
+				}
+			}
 		}
 		
 		// make the first level closure to include all the process elements and it's referenced elements
@@ -324,61 +325,29 @@
 		getValidator().makeElementClosure();
 	}
 	
-	private void publishProcessElements(List processes) {
+	private void makeProcessClosure(org.eclipse.epf.uma.Process proc) {
 	
-		if ( processes == null || processes.size() == 0 ) {
+		if ( proc == null ) {
 			return;
 		}
 		
-		for ( Iterator it = processes.iterator(); it.hasNext(); )
+		if ( ConfigurationHelper.canShow(proc, config) )
 		{
-			if (monitor.isCanceled()) {
-				return;
-			}
-			
-			org.eclipse.epf.uma.Process p = (org.eclipse.epf.uma.Process) it.next();
-			if ( ConfigurationHelper.canShow(p, config) )
-			{
-				// publish the processes and all the process
-				// elements to build up the element closure
-				super.publish(monitor, p);
-				
-				// collect process specific layout info with suppression status
-				// this will incldue the diagrams and the supression states of
-				// each item under the current procee
-				publishProcessLayout(p);
-			}
+			ActivityLayout l = new ActivityLayout();
+			l.init(getLayoutMgr(), proc, proc, null);
+			l.findAllLinkedElements();
 		}
 	
 		if (monitor.isCanceled()) {
 			return;
 		}
 		
-		// now process the referenced elements within the process and publish the contents
-		// save the elements in a new array since the reference list will be updated again 
-		// and we don't want the newly added references
-		List elements = new ArrayList(getValidator().getReferencedElements() );
-		
-		// also collect all referenced processes (most likely base Capability Patterns)
-		List refProcs = new ArrayList();
-		
-		while (elements.size() > 0) {	
-			if (monitor.isCanceled()) {
-				return;
+		if ( ConfigurationHelper.isExtender(proc) ) {
+			org.eclipse.epf.uma.Process baseProc = (org.eclipse.epf.uma.Process)
+				proc.getVariabilityBasedOnElement();
+			if ( ConfigurationHelper.inConfig(baseProc, config) ) {
+				makeProcessClosure(baseProc);
 			}
-			
-			MethodElement e = (MethodElement) elements.remove(0);
-			
-			if ( e instanceof org.eclipse.epf.uma.Process ) {
-				refProcs.add(e);
-			} else if ( e instanceof ProcessElement ) {
-				super.publish(monitor, e);
-			}
-		}
-		
-		// publish the procs recursively
-		if ( refProcs.size() > 0 ) {
-			publishProcessElements(refProcs);
 		}
 		
 	}
diff --git a/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingContentValidator.java b/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingContentValidator.java
index 5eb640d..bbabb0b 100755
--- a/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingContentValidator.java
+++ b/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/ProcessPublishingContentValidator.java
@@ -10,15 +10,16 @@
 //------------------------------------------------------------------------------
 package org.eclipse.epf.publishing.services;
 
+import java.io.PrintStream;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 import org.eclipse.epf.library.util.LibraryUtil;
 import org.eclipse.epf.publishing.PublishingPlugin;
+import org.eclipse.epf.uma.BreakdownElement;
 import org.eclipse.epf.uma.ContentCategory;
+import org.eclipse.epf.uma.Descriptor;
 import org.eclipse.epf.uma.Guidance;
 import org.eclipse.epf.uma.MethodElement;
 import org.eclipse.epf.uma.Practice;
@@ -29,18 +30,26 @@
 
 public class ProcessPublishingContentValidator extends PublishingContentValidator {
 
+	public static final String CLOSURE_LOG_FILENAME = "processClosure.html"; //$NON-NLS-1$
+
 	// closure elements for process publishing, null for config publishing
 	List closureElements = null;
 	private boolean isFinalClosure = false;
 	
-	// maintain the object references generated from TaskDescriptors
-	// map of owner element to a list of referenced elements
-	Map objReferences = new HashMap();
+//	// maintain the object references generated from TaskDescriptors
+//	// map of owner element to a list of referenced elements
+//	Map objReferences = new HashMap();
 	
 	private boolean debug = PublishingPlugin.getDefault().isDebugging();
 	
+	protected PrintStream closureLog = null;
+	
 	public ProcessPublishingContentValidator(String pubDir, boolean validateExternalLinks) {
 		super(pubDir, validateExternalLinks);
+		
+		closureLog = getStream(CLOSURE_LOG_FILENAME);
+		beginClosureLog();
+
 	}
 
 	public void addClosureElements(List items) {
@@ -64,7 +73,9 @@
 	 */
 	public void makeElementClosure() {
 		this.isFinalClosure = true;
-				
+		
+		endClosureLog();
+		
 		// test
 		if ( debug) {
 			System.out.println("====================== Closure elements ======================="); //$NON-NLS-1$
@@ -187,11 +198,63 @@
 			closureElements.clear();
 		}
 		
-		if ( objReferences != null ) {
-			objReferences.clear();
+//		if ( objReferences != null ) {
+//			objReferences.clear();
+//		}
+		
+		if ( closureLog != null ) {
+			closureLog.close();
+			closureLog = null;
 		}
 		
 		super.dispose();
+		
 	}
 	
+	private void beginClosureLog() {
+		closureLog.println("<table>");
+		addLogEntry("<b>Element</b>", "<b>Referenced By</b>");
+	}
+	
+	private void endClosureLog() {
+		closureLog.println("</table>");
+	}
+	
+	private void addLogEntry(String str1, String str2) {
+		StringBuffer b = new StringBuffer();
+		b.append("<tr><td>").append(str1).append("</td><td>").append(str2).append("</td></tr>");
+		closureLog.println(b);
+	}
+	
+	public void logReference(MethodElement owner, MethodElement e)
+	{
+		super.logReference(owner, e);
+		if ( e instanceof Descriptor ) {
+			return;
+		}
+		
+		if ( !isFinalClosure && closureLog != null) {
+			
+			StringBuffer b = new StringBuffer();
+			if ( owner instanceof BreakdownElement ) {
+				b.append(getBreakdownElementLabel((BreakdownElement)owner));
+			} else if ( owner != null ) {
+				b.append(LibraryUtil.getTypeName(owner));
+			}
+			
+			addLogEntry(LibraryUtil.getTypeName(e), b.toString());
+		}
+	}
+	
+	private StringBuffer getBreakdownElementLabel(BreakdownElement e) {
+		StringBuffer b = new StringBuffer();
+		b.append(LibraryUtil.getTypeName(e));
+
+		while ( (e=e.getSuperActivities()) != null ) {
+			b.insert(0, LibraryUtil.getTypeName(e) + "/");
+		}
+		
+		return b;
+	}
+		
 }
diff --git a/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingContentValidator.java b/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingContentValidator.java
index d722d5f..0a765a3 100755
--- a/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingContentValidator.java
+++ b/plugins/org.eclipse.epf.publishing/src/org/eclipse/epf/publishing/services/PublishingContentValidator.java
@@ -166,7 +166,7 @@
 
 	}
 
-	private PrintStream getStream(String fileName) {
+	protected PrintStream getStream(String fileName) {
 		try {
 			File f = new File(logPath, fileName);
 			File dir = f.getParentFile();
@@ -377,9 +377,14 @@
 		
 		if ( e != null &&  !referencedElements.contains(e) && !publishedElements.contains(e)) {
 			referencedElements.add(e);
-			if ( debug ) {
-				System.out.println("--- Referenece Element Added: " + LibraryUtil.getTypeName(e)); //$NON-NLS-1$
-			}
+			logReference(owner, e);
+		}
+	}
+	
+	public void logReference(MethodElement owner, MethodElement e)
+	{
+		if ( debug ) {
+			System.out.println("--- Referenece Element Added: " + LibraryUtil.getTypeName(e)); //$NON-NLS-1$
 		}
 	}
 	
diff --git a/plugins/org.eclipse.epf.rcp/beacon.product b/plugins/org.eclipse.epf.rcp/beacon.product
index 47bf46e..0ab411d 100755
--- a/plugins/org.eclipse.epf.rcp/beacon.product
+++ b/plugins/org.eclipse.epf.rcp/beacon.product
@@ -8,7 +8,7 @@
       <text>
          Eclipse Process Framework Composer 
 
-Version: 1.0-M4-N20060629
+Version: 1.0-M4-N20060707
 
 (c) Copyright Eclipse contributors and others 2004, 2006. All Rights Reserved.
       </text>
diff --git a/plugins/org.eclipse.epf.rcp/plugin.xml b/plugins/org.eclipse.epf.rcp/plugin.xml
index c9a7543..82254ea 100755
--- a/plugins/org.eclipse.epf.rcp/plugin.xml
+++ b/plugins/org.eclipse.epf.rcp/plugin.xml
@@ -52,7 +52,7 @@
                value="icons/about.gif"/>
          <property
                name="aboutText"
-               value="Eclipse Process Framework Composer &#x0A;&#x0A;Version: 1.0-M4-N20060629&#x0A;&#x0A;(c) Copyright Eclipse contributors and others 2004, 2006. All Rights Reserved."/>
+               value="Eclipse Process Framework Composer &#x0A;&#x0A;Version: 1.0-M4-N20060707&#x0A;&#x0A;(c) Copyright Eclipse contributors and others 2004, 2006. All Rights Reserved."/>
          <property
                name="windowImages"
                value="icons/full/obj16/product.gif,icons/full/obj32/product32.gif"/>
diff --git a/plugins/org.eclipse.epf.richtext/META-INF/MANIFEST.MF b/plugins/org.eclipse.epf.richtext/META-INF/MANIFEST.MF
index 9681169..b7b6675 100755
--- a/plugins/org.eclipse.epf.richtext/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epf.richtext/META-INF/MANIFEST.MF
@@ -3,6 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.epf.richtext
 Bundle-Version: 1.0.0
+Bundle-ClassPath: richtext.jar
 Bundle-Activator: org.eclipse.epf.richtext.RichTextPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.epf.richtext/build.properties b/plugins/org.eclipse.epf.richtext/build.properties
index f746ebf..cffbf8f 100755
--- a/plugins/org.eclipse.epf.richtext/build.properties
+++ b/plugins/org.eclipse.epf.richtext/build.properties
@@ -1,10 +1,10 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               .options,\
-               META-INF/,\
+source.richtext.jar = src/
+output.richtext.jar = bin/
+bin.includes = richtext.jar,\
                icons/,\
-               plugin.properties,\
+               META-INF/,\
+               rte/,\
                plugin.xml,\
-               rte/
+               plugin.properties,\
+               .options
 
diff --git a/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/MultiResourceEObject.java b/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/MultiResourceEObject.java
index 9ccf78e..10e6416 100755
--- a/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/MultiResourceEObject.java
+++ b/plugins/org.eclipse.epf.uma.ecore/src/org/eclipse/epf/uma/ecore/impl/MultiResourceEObject.java
@@ -608,6 +608,9 @@
 		if (oppositeFeatureMap == null && hasOppositeFeature) {
 			oppositeFeatureMap = createOppositeFeatureMap();
 		}
+		if(oppositeFeatureMap == null) {
+			return Collections.EMPTY_MAP;
+		}
 		return oppositeFeatureMap;
 	}
 
@@ -709,7 +712,7 @@
 	 * @see org.eclipse.epf.uma.ecore.IModelObject#getOppositeFeatures()
 	 */
 	public Collection getOppositeFeatures() {
-		return oppositeFeatureMap.keySet();
+		return getOppositeFeatureMap().keySet();
 	}
 
 }
diff --git a/plugins/org.eclipse.epf.uma.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.epf.uma.edit/META-INF/MANIFEST.MF
index bbf7213..8e88547 100755
--- a/plugins/org.eclipse.epf.uma.edit/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epf.uma.edit/META-INF/MANIFEST.MF
@@ -2,6 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.epf.uma.edit;singleton:=true
+Bundle-ClassPath: umaedit.jar
 Bundle-Version: 1.0.0
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.epf.uma.edit/build.properties b/plugins/org.eclipse.epf.uma.edit/build.properties
index b3b9011..8282e0a 100755
--- a/plugins/org.eclipse.epf.uma.edit/build.properties
+++ b/plugins/org.eclipse.epf.uma.edit/build.properties
@@ -1,7 +1,8 @@
-source.. = src/
-output.. = bin/
-bin.includes = .,\
+source.umaedit.jar = src/
+output.umaedit.jar = bin/
+bin.includes = umaedit.jar,\
                META-INF/,\
+               plugin.xml,\
                icons/,\
                plugin.properties
 
diff --git a/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementCreateCopyCommand.java b/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementCreateCopyCommand.java
index c7812c8..641df18 100755
--- a/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementCreateCopyCommand.java
+++ b/plugins/org.eclipse.epf.uma.edit/src/org/eclipse/epf/uma/edit/command/MethodElementCreateCopyCommand.java
@@ -28,8 +28,6 @@
 	public Collection doGetResult() {
 		Collection collection = super.doGetResult();
 		
-		// FIXME: this approach does not work with copying multile elements due to result merge
-		//
 		if (domain instanceof TraceableAdapterFactoryEditingDomain) {
 			((TraceableAdapterFactoryEditingDomain)domain).addCopyInfo(collection, copyHelper);
 		}