diff --git a/plugins/org.eclipse.jst.common.frameworks/src/org/eclipse/jst/common/jdt/internal/integration/JavaArtifactEditModel.java b/plugins/org.eclipse.jst.common.frameworks/src/org/eclipse/jst/common/jdt/internal/integration/JavaArtifactEditModel.java
index b3135da..b72bb74 100644
--- a/plugins/org.eclipse.jst.common.frameworks/src/org/eclipse/jst/common/jdt/internal/integration/JavaArtifactEditModel.java
+++ b/plugins/org.eclipse.jst.common.frameworks/src/org/eclipse/jst/common/jdt/internal/integration/JavaArtifactEditModel.java
@@ -2,12 +2,16 @@
 
 import java.util.Set;
 
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.wst.common.componentcore.internal.ArtifactEditModel;
+import org.eclipse.wst.common.frameworks.internal.SaveFailedException;
 import org.eclipse.wst.common.internal.emf.resource.CompatibilityXMIResource;
 import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
 import org.eclipse.wst.common.internal.emf.resource.TranslatorResource;
@@ -117,6 +121,13 @@
 		if (monitor == null || !monitor.isCanceled())
 			super.primSave(monitor);
 	}
+	protected void runSaveOperation(IWorkspaceRunnable runnable, IProgressMonitor monitor) throws SaveFailedException {
+		try {
+			ResourcesPlugin.getWorkspace().run(runnable, null,IWorkspace.AVOID_UPDATE,monitor);
+		} catch (CoreException e) {
+			throw new SaveFailedException(e);
+		}
+	}
 
 	/**
 	 * Insert the method's description here. Creation date: (4/11/2001 4:14:26 PM)
diff --git a/plugins/org.eclipse.jst.j2ee/build.properties b/plugins/org.eclipse.jst.j2ee/build.properties
index 29f13da..9290f8d 100644
--- a/plugins/org.eclipse.jst.j2ee/build.properties
+++ b/plugins/org.eclipse.jst.j2ee/build.properties
@@ -14,7 +14,7 @@
                plugin.properties,\
                prepareAllPII.xml,\
                plugin.xml,\
-               runtime/j2eeplugin.jar,\
+               .,\
                META-INF/,\
                about.html
 source.. = j2eeplugin/,\
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/AddComponentToEnterpriseApplicationOp.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/AddComponentToEnterpriseApplicationOp.java
index df706e6..1498d91 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/AddComponentToEnterpriseApplicationOp.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/application/internal/operations/AddComponentToEnterpriseApplicationOp.java
@@ -17,6 +17,9 @@
 import org.eclipse.jst.j2ee.internal.J2EEConstants;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
 import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsOp;
 import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
 import org.eclipse.wst.common.componentcore.resources.ComponentHandle;
@@ -40,26 +43,42 @@
 	protected void updateEARDD(IProgressMonitor monitor) {
 
 		EARArtifactEdit earEdit = null;
+		StructureEdit se = null;
 		try {
 			ComponentHandle handle = (ComponentHandle) model.getProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT_HANDLE);
 			earEdit = EARArtifactEdit.getEARArtifactEditForWrite(handle);
+			se = StructureEdit.getStructureEditForWrite(handle.getProject());
 			if (earEdit != null) {
 				Application application = earEdit.getApplication();
 				List list = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_HANDLE_LIST);
 				if (list != null && list.size() > 0) {
 					for (int i = 0; i < list.size(); i++) {
+						StructureEdit compse = null;
 						ComponentHandle comphandle = (ComponentHandle) list.get(i);
 						IVirtualComponent wc = ComponentCore.createComponent(comphandle.getProject(), comphandle.getName());
-						addModule(application, wc);
+						WorkbenchComponent earwc = se.findComponentByName(handle.getName());
+						try {
+							compse = StructureEdit.getStructureEditForRead(comphandle.getProject());
+							WorkbenchComponent refwc = compse.findComponentByName(comphandle.getName());
+							ReferencedComponent ref = se.findReferencedComponent(earwc,refwc);
+							Module mod = addModule(application, wc);
+							ref.setDependentObject(mod);
+						} finally {
+							if (compse != null)
+								compse.dispose();
+						}
 					}
 				}
 			}
+			se.saveIfNecessary(monitor);
 			earEdit.saveIfNecessary(monitor);
 		} catch (Exception e) {
 			Logger.getLogger().logError(e);
 		} finally {
 			if (earEdit != null)
 				earEdit.dispose();
+			if (se != null)
+				se.dispose();
 		}
 	}
 
@@ -78,7 +97,7 @@
 		return null;
 	}
 
-	protected void addModule(Application application, IVirtualComponent wc) {
+	protected Module addModule(Application application, IVirtualComponent wc) {
 		Application dd = application;
 
 		String name = wc.getName();
@@ -96,22 +115,23 @@
 		Module existingModule = dd.getFirstModule(name);
 
 		if (existingModule == null) {
-			Module m = createNewModule(wc);
-			if (m != null) {
+			existingModule = createNewModule(wc);
+			if (existingModule != null) {
 
-				m.setUri(name);
-				if (m instanceof WebModule) {
+				existingModule.setUri(name);
+				if (existingModule instanceof WebModule) {
 
 
 					Properties props = wc.getMetaProperties();
 					String contextroot = ""; //$NON-NLS-1$
 					if ((props != null) && (props.containsKey(J2EEConstants.CONTEXTROOT)))
 						contextroot = props.getProperty(J2EEConstants.CONTEXTROOT);
-					((WebModule) m).setContextRoot(contextroot);
+					((WebModule) existingModule).setContextRoot(contextroot);
 				}
-				dd.getModules().add(m);
+				dd.getModules().add(existingModule);
 			}
 		}
+		return existingModule;
 	}
 
 	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
diff --git a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARArtifactEdit.java b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARArtifactEdit.java
index f4111b0..80aa7e5 100644
--- a/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARArtifactEdit.java
+++ b/plugins/org.eclipse.jst.j2ee/earproject/org/eclipse/jst/j2ee/componentcore/util/EARArtifactEdit.java
@@ -468,6 +468,21 @@
 	public IVirtualReference[] getComponentReferences() {
 		return getComponentReferences(Collections.EMPTY_LIST);
 	}
+	/**
+	 * This method will return the IVirtualReference to the component of the given name
+	 * 
+	 * @return - IVirtualReference or null if not found
+	 */
+	public IVirtualReference getComponentReference(String componentName) {
+		IVirtualReference[] refs = getComponentReferences(Collections.EMPTY_LIST);
+		for (int i = 0; i < refs.length; i++) {
+			IVirtualReference reference = refs[i];
+			if (reference.getReferencedComponent().getName().equals(componentName))
+				return reference;
+			
+		}
+		return null;
+	}
 	
 	private IVirtualReference[] getComponentReferences(List componentTypes) {
 		List components = new ArrayList();
