diff --git a/plugins/org.eclipse.jst.jee.ui/plugin.xml b/plugins/org.eclipse.jst.jee.ui/plugin.xml
index b9329c5..b5a1e30 100644
--- a/plugins/org.eclipse.jst.jee.ui/plugin.xml
+++ b/plugins/org.eclipse.jst.jee.ui/plugin.xml
@@ -881,9 +881,6 @@
       <viewerActionBinding viewerId="org.eclipse.ui.navigator.ProjectExplorer">
          <includes>
             <actionExtension pattern="org.eclipse.jst.javaee.ui.JEEActionProvider"/>
-            <actionExtension
-                  pattern="org.eclipse.ui.navigator.resources.SAPNewActions">
-            </actionExtension>
          </includes>
       </viewerActionBinding>
    </extension>
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/AppClient5ContentProvider.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/AppClient5ContentProvider.java
index 5670bc6..140c87f 100644
--- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/AppClient5ContentProvider.java
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/AppClient5ContentProvider.java
@@ -14,22 +14,11 @@
 import java.util.List;
 
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
-import org.eclipse.jst.j2ee.navigator.internal.J2EEContentProvider;
 import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
 import org.eclipse.jst.jee.ui.internal.navigator.appclient.GroupAppClientProvider;
 import org.eclipse.jst.jee.ui.internal.navigator.ear.ModulesNode;
-import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
-import org.eclipse.swt.widgets.Display;
 
 /**
  * Ear 5.0 Content provider is Deployment Descriptor content provider, 
@@ -37,13 +26,9 @@
  * 
  * @author Dimitar Giormov
  */
-public class AppClient5ContentProvider  extends J2EEContentProvider implements IResourceChangeListener, IResourceDeltaVisitor{
+public class AppClient5ContentProvider extends JEE5ContentProvider {
 
 	
-	private static final String DD_NAME = "application-client.xml"; //$NON-NLS-1$
-	private static final Class IPROJECT_CLASS = IProject.class;
-	private Viewer viewer;
-
 	public Object[] getChildren(Object aParentElement) {
 		IProject project = null;
 		List children = new ArrayList();
@@ -60,49 +45,8 @@
 		return children.toArray();
 	}
 
-	public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
-		viewer = aViewer;
-	}
 
-	@Override
-	public void dispose() {
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-	}
 
-	public void resourceChanged(IResourceChangeEvent event) {
-		try {
-			event.getDelta().accept(this);
-		} catch (CoreException e) {
-			String msg = "Error in the JEEContentProvider.resourceChanged()"; //$NON-NLS-1$
-			JEEUIPlugin.getDefault().logError(msg, e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) {
-		if (delta.getResource().getType() == IResource.FILE) {
-			IResource resource = delta.getResource();
-			if (DD_NAME.equals(resource.getName())) {
-				Runnable refreshThread = new Runnable(){
-					public void run(){
-						if (viewer != null && ! viewer.getControl().isDisposed()){
-							viewer.refresh();
-						}
-					}
-				};
-				Display.getDefault().asyncExec(refreshThread);
-				return false;
-			}
-		}
-		return true;
-	}
-
-	@Override
 	public boolean hasChildren(Object element) {
 		if (element instanceof GroupAppClientProvider) {
 			return !((GroupAppClientProvider) element).getChildren().isEmpty();
@@ -116,4 +60,8 @@
 		}
 		return null;
 	}
+
+	public Object[] getElements(Object inputElement) {
+		return getChildren(inputElement);
+	}
 }
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ear5ContentProvider.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ear5ContentProvider.java
index 26b2271..d79cd50 100644
--- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ear5ContentProvider.java
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ear5ContentProvider.java
@@ -16,22 +16,13 @@
 import java.util.List;
 
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jst.j2ee.componentcore.util.EARVirtualComponent;
 import org.eclipse.jst.j2ee.internal.J2EEVersionConstants;
 import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
-import org.eclipse.jst.j2ee.internal.provider.J2EEUtilityJarItemProvider;
-import org.eclipse.jst.j2ee.navigator.internal.J2EEContentProvider;
 import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities;
 import org.eclipse.jst.jee.ui.internal.Messages;
 import org.eclipse.jst.jee.ui.internal.navigator.ear.AbstractEarNode;
@@ -39,7 +30,6 @@
 import org.eclipse.jst.jee.ui.internal.navigator.ear.GroupEARProvider;
 import org.eclipse.jst.jee.ui.internal.navigator.ear.ModulesNode;
 import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
@@ -53,13 +43,10 @@
  * 
  * @author Dimitar Giormov
  */
-public class Ear5ContentProvider  extends J2EEContentProvider implements IResourceChangeListener, IResourceDeltaVisitor{
+public class Ear5ContentProvider extends JEE5ContentProvider {
 
-	private static final Class IPROJECT_CLASS = IProject.class;
 	public final static String EAR_DEFAULT_LIB = "lib"; //$NON-NLS-1$
 
-	private Viewer viewer;
-
 	private List getComponentReferencesAsList(List componentTypes, IVirtualComponent virtualComponent, IPath runtimePath) {
 		List components = new ArrayList();
 		IVirtualComponent earComponent = virtualComponent;
@@ -72,10 +59,6 @@
 				if (componentTypes == null || componentTypes.size() == 0) {
 					components.add(refComponents[i]);
 				} else {
-					//                    IPath runPath = refComponents[i].getRuntimePath();
-					//                    if (runPath != null) {
-					//                        if (runPath.equals(runtimePath) && componentTypes.contains(JavaEEProjectUtilities.getJ2EEComponentType(module))) components.add(refComponents[i]);
-					//                    } else 
 					if (componentTypes.contains(JavaEEProjectUtilities.getJ2EEComponentType(module))) {
 						components.add(refComponents[i]);
 					}
@@ -189,49 +172,6 @@
 		return children.toArray();
 	}
 
-	public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
-		viewer = aViewer;
-	}
-
-	@Override
-	public void dispose() {
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
-	}
-
-	public void resourceChanged(IResourceChangeEvent event) {
-		try {
-			event.getDelta().accept(this);
-		} catch (CoreException e) {
-			String msg = "Error in the JEEContentProvider.resourceChanged()"; //$NON-NLS-1$
-			JEEUIPlugin.getDefault().logError(msg, e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse.core.resources.IResourceDelta)
-	 */
-	public boolean visit(IResourceDelta delta) {
-		if (delta.getResource().getType() == IResource.FILE) {
-			IResource resource = delta.getResource();
-			if (J2EEUtilityJarItemProvider.isComponentFile(resource)) {
-				Runnable refreshThread = new Runnable(){
-					public void run(){
-						if (viewer != null && ! viewer.getControl().isDisposed()){
-							viewer.refresh();
-						}
-					}
-				};
-				Display.getDefault().asyncExec(refreshThread);
-				return false;
-			}
-		}
-		return true;
-	}
-
-	@Override
 	public boolean hasChildren(Object element) {
 		if (element instanceof AbstractEarNode) {
 			return ((AbstractEarNode) element).getModules().size() > 0;
@@ -246,4 +186,8 @@
 		}
 		return null;
 	}
+
+	public Object[] getElements(Object inputElement) {
+		return getChildren(inputElement);
+	}
 }
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ejb3ContentProvider.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ejb3ContentProvider.java
index 07705ed..164ffe5 100644
--- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ejb3ContentProvider.java
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Ejb3ContentProvider.java
@@ -11,22 +11,12 @@
 package org.eclipse.jst.jee.ui.internal.navigator;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.IModelProviderEvent;
-import org.eclipse.jst.j2ee.model.IModelProviderListener;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.navigator.internal.J2EEContentProvider;
 import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants;
 import org.eclipse.jst.javaee.ejb.EJBJar;
 import org.eclipse.jst.javaee.ejb.EntityBean;
@@ -38,7 +28,6 @@
 import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanNode;
 import org.eclipse.jst.jee.ui.internal.navigator.ejb.GroupEJBProvider;
 import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
@@ -49,236 +38,189 @@
  * 
  * @author Dimitar Giormov
  */
-public class Ejb3ContentProvider extends J2EEContentProvider implements IModelProviderListener{
+public class Ejb3ContentProvider extends JEE5ContentProvider {
 
 
-  private static final Class IPROJECT_CLASS = IProject.class;
+	public Object[] getChildren(Object aParentElement) {
+		List<Object> children = new ArrayList<Object>();
+		IProject project = null;
 
-  private Viewer viewer;
+		if (aParentElement instanceof AbstractGroupProvider) {
+			List lst = ((AbstractGroupProvider) aParentElement).getChildren();
+			children.addAll(lst);
+		} else if (aParentElement instanceof AbstractDDNode) {
+			List lst = ((AbstractDDNode) aParentElement).getChildren();
+			children.addAll(lst);
+		} else if (aParentElement instanceof SessionBean) {
+			SessionBean sb = ((SessionBean)aParentElement);
+			addSessionBeanSubNodes(sb, children);
 
-  private static HashMap<IProject, IModelProvider> groupProvidersMap = new HashMap<IProject, IModelProvider>();
+		} else if (aParentElement instanceof EntityBean) {
+			EntityBean eb = ((EntityBean)aParentElement);
 
-  public Object[] getChildren(Object aParentElement) {
- 
-    List<Object> children = new ArrayList<Object>();
-    IProject project = null;
+			addEntityBeanSubNodes(eb, children);
 
-    if (aParentElement instanceof AbstractGroupProvider) {
-      List lst = ((AbstractGroupProvider) aParentElement).getChildren();
-      children.addAll(lst);
-    } else if (aParentElement instanceof AbstractDDNode) {
-      List lst = ((AbstractDDNode) aParentElement).getChildren();
-      children.addAll(lst);
-    } else if (aParentElement instanceof SessionBean) {
-      SessionBean sb = ((SessionBean)aParentElement);
-      addSessionBeanSubNodes(sb, children);
+		} else if (aParentElement instanceof MessageDrivenBean) {
+			Object msgBean = new BeanNode((MessageDrivenBean) aParentElement);
+			addActivationConfigProperties((MessageDrivenBean) aParentElement, children);
+			children.add(msgBean);
+		} else 
+			if (aParentElement instanceof IAdaptable) {
+				project = (IProject) ((IAdaptable) aParentElement)
+				.getAdapter(IPROJECT_CLASS);
+				if (project != null) {
+					if (isEjbModuleProject(project)) {
+						IModelProvider modelProvider = getCachedModelProvider(project);
+						GroupEJBProvider element = new GroupEJBProvider((EJBJar) modelProvider.getModelObject());
+						element.setProjectName(project.getName());
+						children.add(element);
+					}
+				}
+			}
+		return children.toArray();
+	}
 
-    } else if (aParentElement instanceof EntityBean) {
-      EntityBean eb = ((EntityBean)aParentElement);
-      
-      addEntityBeanSubNodes(eb, children);
+	private void addActivationConfigProperties(MessageDrivenBean parentElement,
+			List<Object> children) {
+		if (parentElement.getActivationConfig() != null && parentElement.getActivationConfig().getActivationConfigProperties() != null && !parentElement.getActivationConfig().getActivationConfigProperties().isEmpty()){
+			children.add(new ActivationConfigProperties(parentElement.getActivationConfig().getActivationConfigProperties()));
+		}
+	}
 
-    } else if (aParentElement instanceof MessageDrivenBean) {
-      Object msgBean = new BeanNode((MessageDrivenBean) aParentElement);
-      addActivationConfigProperties((MessageDrivenBean) aParentElement, children);
-      children.add(msgBean);
-    } else 
-      if (aParentElement instanceof IAdaptable) {
-        project = (IProject) ((IAdaptable) aParentElement)
-        .getAdapter(IPROJECT_CLASS);
-        if (project != null) {
-          if (isEjbModuleProject(project)) {
-            IModelProvider modelProvider = (IModelProvider) groupProvidersMap.get(project);
-            if (modelProvider != null) {
-              GroupEJBProvider element = new GroupEJBProvider((EJBJar) modelProvider.getModelObject());
-              element.setProjectName(project.getName());
-              children.add(element);
-            } else {
-              modelProvider = ModelProviderManager.getModelProvider(project);
-              modelProvider.addListener(this);
-              GroupEJBProvider element = new GroupEJBProvider((EJBJar) modelProvider.getModelObject());
-              element.setProjectName(project.getName());
-              children.add(element);
-              groupProvidersMap.put(project, modelProvider);
-            }
-          }
-        }
-      }
-    return children.toArray();
-  }
+	private void addEntityBeanSubNodes(EntityBean eb, List<Object> children) {
+		if (eb.getLocal() != null) {
+			children.add(new BeanInterfaceNode(eb, (String)eb.getLocal(), BeanInterfaceNode.KINDS.LOCAL));
+		}
+		if (eb.getLocalHome() != null) {
+			children.add(new BeanInterfaceNode(eb, (String)eb.getLocalHome(), BeanInterfaceNode.KINDS.LOCAL_HOME));
+		}
 
-  private void addActivationConfigProperties(MessageDrivenBean parentElement,
-      List<Object> children) {
-    if (parentElement.getActivationConfig() != null && parentElement.getActivationConfig().getActivationConfigProperties() != null && !parentElement.getActivationConfig().getActivationConfigProperties().isEmpty()){
-      children.add(new ActivationConfigProperties(parentElement.getActivationConfig().getActivationConfigProperties()));
-    }
-  }
-
-  private void addEntityBeanSubNodes(EntityBean eb, List<Object> children) {
-    if (eb.getLocal() != null) {
-      children.add(new BeanInterfaceNode(eb, (String)eb.getLocal(), BeanInterfaceNode.KINDS.LOCAL));
-    }
-    if (eb.getLocalHome() != null) {
-      children.add(new BeanInterfaceNode(eb, (String)eb.getLocalHome(), BeanInterfaceNode.KINDS.LOCAL_HOME));
-    }
-
-    if (eb.getRemote() != null) {
-      children.add(new BeanInterfaceNode(eb, (String)eb.getRemote(), BeanInterfaceNode.KINDS.REMOTE));
-    }
-    if (eb.getHome() != null) {
-      children.add(new BeanInterfaceNode(eb, (String)eb.getHome(), BeanInterfaceNode.KINDS.REMOTE_HOME));
-    }
+		if (eb.getRemote() != null) {
+			children.add(new BeanInterfaceNode(eb, (String)eb.getRemote(), BeanInterfaceNode.KINDS.REMOTE));
+		}
+		if (eb.getHome() != null) {
+			children.add(new BeanInterfaceNode(eb, (String)eb.getHome(), BeanInterfaceNode.KINDS.REMOTE_HOME));
+		}
 
 
-    children.add(new BeanNode((EntityBean) eb));
-    
-  }
+		children.add(new BeanNode((EntityBean) eb));
 
-  private void addSessionBeanSubNodes(SessionBean sb, List children) {
-    addClassRelatedInfo(sb, children);
-    addSessionJNDIRefInfo(sb, children);
-  }
+	}
 
-  private void addSessionJNDIRefInfo(SessionBean sb, List children) {
-    if (sb.getEjbLocalRefs() != null && !sb.getEjbLocalRefs().isEmpty()){
-      children.add(new JndiRefNode(sb.getEjbLocalRefs(), KINDS.EJBLOCALREF));
-    }
-    
-    if (sb.getEjbRefs() != null && !sb.getEjbRefs().isEmpty()){
-      children.add(new JndiRefNode(sb.getEjbRefs(), KINDS.EJBREF));
-    }
-    
-    if (sb.getResourceEnvRefs() != null && !sb.getResourceEnvRefs().isEmpty()){
-      children.add(new JndiRefNode(sb.getResourceEnvRefs(), KINDS.RESENVENTY));
-    }
-    if (sb.getEnvEntries() != null && !sb.getEnvEntries().isEmpty()){
-      children.add(new JndiRefNode(sb.getEnvEntries(), KINDS.ENVENTRY));
-    }
-    
-    if (sb.getResourceRefs() != null && !sb.getResourceRefs().isEmpty()){
-      children.add(new JndiRefNode(sb.getResourceRefs(), KINDS.RESREF));
-    }
-    
-    if (sb.getServiceRefs() != null && !sb.getServiceRefs().isEmpty()){
-      children.add(new JndiRefNode(sb.getServiceRefs(), KINDS.SERVICEREF));
-    }
-  }
-  
-  private void addSessionJNDIRefInfo(EntityBean eb, List children) {
-    if (eb.getEjbLocalRefs() != null && !eb.getEjbLocalRefs().isEmpty()){
-      children.add(new JndiRefNode(eb.getEjbLocalRefs(), KINDS.EJBLOCALREF));
-    }
-    
-    if (eb.getEjbRefs() != null && !eb.getEjbRefs().isEmpty()){
-      children.add(new JndiRefNode(eb.getEjbRefs(), KINDS.EJBREF));
-    }
-    
-    if (eb.getResourceEnvRefs() != null && !eb.getResourceEnvRefs().isEmpty()){
-      children.add(new JndiRefNode(eb.getResourceEnvRefs(), KINDS.RESENVENTY));
-    }
-    if (eb.getEnvEntries() != null && !eb.getEnvEntries().isEmpty()){
-      children.add(new JndiRefNode(eb.getEnvEntries(), KINDS.ENVENTRY));
-    }
-    
-    if (eb.getResourceRefs() != null && !eb.getResourceRefs().isEmpty()){
-      children.add(new JndiRefNode(eb.getResourceRefs(), KINDS.RESREF));
-    }
-    
-    if (eb.getServiceRefs() != null && !eb.getServiceRefs().isEmpty()){
-      children.add(new JndiRefNode(eb.getServiceRefs(), KINDS.SERVICEREF));
-    }
-  }
+	private void addSessionBeanSubNodes(SessionBean sb, List children) {
+		addClassRelatedInfo(sb, children);
+		addSessionJNDIRefInfo(sb, children);
+	}
 
-  private void addClassRelatedInfo(SessionBean sb, List children) {
-    if (sb.getLocal() != null) {
-      children.add(new BeanInterfaceNode(sb, (String)sb.getLocal(), BeanInterfaceNode.KINDS.LOCAL));
-    }
-    if (sb.getLocalHome() != null) {
-      children.add(new BeanInterfaceNode(sb, (String)sb.getLocalHome(), BeanInterfaceNode.KINDS.LOCAL_HOME));
-    }
+	private void addSessionJNDIRefInfo(SessionBean sb, List children) {
+		if (sb.getEjbLocalRefs() != null && !sb.getEjbLocalRefs().isEmpty()){
+			children.add(new JndiRefNode(sb.getEjbLocalRefs(), KINDS.EJBLOCALREF));
+		}
 
-    if (sb.getRemote() != null) {
-      children.add(new BeanInterfaceNode(sb, (String)sb.getRemote(), BeanInterfaceNode.KINDS.REMOTE));
-    }
-    if (sb.getHome() != null) {
-      children.add(new BeanInterfaceNode(sb, (String)sb.getHome(), BeanInterfaceNode.KINDS.REMOTE_HOME));
-    }
+		if (sb.getEjbRefs() != null && !sb.getEjbRefs().isEmpty()){
+			children.add(new JndiRefNode(sb.getEjbRefs(), KINDS.EJBREF));
+		}
+
+		if (sb.getResourceEnvRefs() != null && !sb.getResourceEnvRefs().isEmpty()){
+			children.add(new JndiRefNode(sb.getResourceEnvRefs(), KINDS.RESENVENTY));
+		}
+		if (sb.getEnvEntries() != null && !sb.getEnvEntries().isEmpty()){
+			children.add(new JndiRefNode(sb.getEnvEntries(), KINDS.ENVENTRY));
+		}
+
+		if (sb.getResourceRefs() != null && !sb.getResourceRefs().isEmpty()){
+			children.add(new JndiRefNode(sb.getResourceRefs(), KINDS.RESREF));
+		}
+
+		if (sb.getServiceRefs() != null && !sb.getServiceRefs().isEmpty()){
+			children.add(new JndiRefNode(sb.getServiceRefs(), KINDS.SERVICEREF));
+		}
+	}
+
+	private void addSessionJNDIRefInfo(EntityBean eb, List children) {
+		if (eb.getEjbLocalRefs() != null && !eb.getEjbLocalRefs().isEmpty()){
+			children.add(new JndiRefNode(eb.getEjbLocalRefs(), KINDS.EJBLOCALREF));
+		}
+
+		if (eb.getEjbRefs() != null && !eb.getEjbRefs().isEmpty()){
+			children.add(new JndiRefNode(eb.getEjbRefs(), KINDS.EJBREF));
+		}
+
+		if (eb.getResourceEnvRefs() != null && !eb.getResourceEnvRefs().isEmpty()){
+			children.add(new JndiRefNode(eb.getResourceEnvRefs(), KINDS.RESENVENTY));
+		}
+		if (eb.getEnvEntries() != null && !eb.getEnvEntries().isEmpty()){
+			children.add(new JndiRefNode(eb.getEnvEntries(), KINDS.ENVENTRY));
+		}
+
+		if (eb.getResourceRefs() != null && !eb.getResourceRefs().isEmpty()){
+			children.add(new JndiRefNode(eb.getResourceRefs(), KINDS.RESREF));
+		}
+
+		if (eb.getServiceRefs() != null && !eb.getServiceRefs().isEmpty()){
+			children.add(new JndiRefNode(eb.getServiceRefs(), KINDS.SERVICEREF));
+		}
+	}
+
+	private void addClassRelatedInfo(SessionBean sb, List children) {
+		if (sb.getLocal() != null) {
+			children.add(new BeanInterfaceNode(sb, (String)sb.getLocal(), BeanInterfaceNode.KINDS.LOCAL));
+		}
+		if (sb.getLocalHome() != null) {
+			children.add(new BeanInterfaceNode(sb, (String)sb.getLocalHome(), BeanInterfaceNode.KINDS.LOCAL_HOME));
+		}
+
+		if (sb.getRemote() != null) {
+			children.add(new BeanInterfaceNode(sb, (String)sb.getRemote(), BeanInterfaceNode.KINDS.REMOTE));
+		}
+		if (sb.getHome() != null) {
+			children.add(new BeanInterfaceNode(sb, (String)sb.getHome(), BeanInterfaceNode.KINDS.REMOTE_HOME));
+		}
 
 
-    children.add(new BeanNode((SessionBean) sb));
-    List r = sb.getBusinessLocals();
-    for (Object locals : r) {
-      children.add(new BeanInterfaceNode(sb, (String)locals, BeanInterfaceNode.KINDS.BUSSINESS_LOCAL));
-    }
-    r = sb.getBusinessRemotes();
-    for (Object locals : r) {
-      children.add(new BeanInterfaceNode(sb, (String)locals, BeanInterfaceNode.KINDS.BUSSINESS_REMOTE));
-    }
-  }
+		children.add(new BeanNode((SessionBean) sb));
+		List r = sb.getBusinessLocals();
+		for (Object locals : r) {
+			children.add(new BeanInterfaceNode(sb, (String)locals, BeanInterfaceNode.KINDS.BUSSINESS_LOCAL));
+		}
+		r = sb.getBusinessRemotes();
+		for (Object locals : r) {
+			children.add(new BeanInterfaceNode(sb, (String)locals, BeanInterfaceNode.KINDS.BUSSINESS_REMOTE));
+		}
+	}
 
-  private boolean isEjbModuleProject(IProject project) {
-    try {
-      IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-      IProjectFacetVersion installedVersion = facetedProject.getInstalledVersion(ProjectFacetsManager.getProjectFacet(IJ2EEFacetConstants.EJB).getVersion(IJ2EEFacetConstants.EJB_30.getVersionString()).getProjectFacet());
-      return installedVersion != null;
-    } catch (CoreException e) {
-      JEEUIPlugin.logError("Can not acces project", e); //$NON-NLS-1$
-    }
-    return false;
-  }
+	private boolean isEjbModuleProject(IProject project) {
+		try {
+			IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+			IProjectFacetVersion installedVersion = facetedProject.getInstalledVersion(ProjectFacetsManager.getProjectFacet(IJ2EEFacetConstants.EJB).getVersion(IJ2EEFacetConstants.EJB_30.getVersionString()).getProjectFacet());
+			return installedVersion != null;
+		} catch (CoreException e) {
+			JEEUIPlugin.logError("Can not acces project", e); //$NON-NLS-1$
+		}
+		return false;
+	}
 
-  public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
-    viewer = aViewer;
-  }
+	public boolean hasChildren(Object element) {
+		if (element instanceof AbstractGroupProvider) {
+			return ((AbstractGroupProvider) element).hasChildren();
+		} else if (element instanceof AbstractDDNode) {
+			return ((AbstractDDNode) element).hasChildren();
+		} else if (element instanceof SessionBean) {
+			return true;
+		} else if (element instanceof EntityBean) {
+			return true;
+		}else if (element instanceof MessageDrivenBean) {
+			return true;
+		} else
+			return false;
+	}
 
-  @Override
-  public boolean hasChildren(Object element) {
-    if (element instanceof AbstractGroupProvider) {
-      return ((AbstractGroupProvider) element).hasChildren();
-    } else if (element instanceof AbstractDDNode) {
-      return ((AbstractDDNode) element).hasChildren();
-    } else if (element instanceof SessionBean) {
-      return true;
-    } else if (element instanceof EntityBean) {
-      return true;
-    }else if (element instanceof MessageDrivenBean) {
-      return true;
-    } else
-      return false;
-  }
+	public Object getParent(Object element) {
+		return null;
+	}
 
-  public void projectChanged(final IProject project) {
-    // TODO refresh only the Deployment Description tree of the affected
-    // project instead of the DD tree of all projects.
-    //		j2eeRefreshContent();
+	public Object[] getElements(Object inputElement) {
+		return getChildren(inputElement);
+	}
 
-    try {
-      Runnable refreshThread = new Runnable() {
-        public void run() {
-          if (viewer != null) {
-            ISelection sel = ((TreeViewer) viewer).getSelection();
-            ITreeContentProvider contentProvider = ((ITreeContentProvider) ((TreeViewer) viewer)
-                .getContentProvider());
-            contentProvider.getChildren(project);
-            ((StructuredViewer) viewer).refresh(project);
-            ((TreeViewer) viewer).setSelection(sel);
-          }
-        }
-      };
-      Display.getDefault().asyncExec(refreshThread);
-    } catch (Exception e) {
-      JEEUIPlugin.logError("Error during refresh", e); //$NON-NLS-1$
-    }
-  }
-
-  public void modelsChanged(IModelProviderEvent event) {
-    projectChanged(event.getProject());
-
-  }
-
-@Override
-public void dispose() {
-	groupProvidersMap.clear();
-}
-
-}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/JEE5ContentProvider.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/JEE5ContentProvider.java
new file mode 100644
index 0000000..1d78e4c
--- /dev/null
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/JEE5ContentProvider.java
@@ -0,0 +1,117 @@
+/***********************************************************************
+ * Copyright (c) 2008 by SAP AG, Walldorf. 
+ * 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:
+ *     SAP AG - initial API and implementation
+ ***********************************************************************/
+package org.eclipse.jst.jee.ui.internal.navigator;
+
+import java.util.HashMap;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.ISchedulingRule;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.j2ee.model.IModelProvider;
+import org.eclipse.jst.j2ee.model.IModelProviderEvent;
+import org.eclipse.jst.j2ee.model.IModelProviderListener;
+import org.eclipse.jst.j2ee.model.ModelProviderManager;
+import org.eclipse.jst.j2ee.navigator.internal.EMFRootObjectProvider.IRefreshHandlerListener;
+import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.progress.UIJob;
+
+public abstract class JEE5ContentProvider implements ITreeContentProvider, IRefreshHandlerListener, IModelProviderListener {
+
+	protected Viewer viewer;
+	protected static final Class IPROJECT_CLASS = IProject.class;
+	
+	protected static HashMap<IProject, IModelProvider> groupProvidersMap = new HashMap<IProject, IModelProvider>();
+
+
+	public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
+		viewer = aViewer;
+	}
+	
+	
+	protected IModelProvider getCachedModelProvider(IProject project) {
+		IModelProvider provider = groupProvidersMap.get(project);
+		if (provider != null){
+			Object mObj = provider.getModelObject();
+		} else{
+			provider = ModelProviderManager.getModelProvider(project);
+			provider.addListener(this);
+			groupProvidersMap.put(project,provider);
+		}
+		return provider;
+	}
+
+	public void projectChanged(final IProject project) {
+		try {
+			Runnable refreshThread = new Runnable() {
+				public void run() {
+					if (viewer != null) {
+						ISelection sel = ((TreeViewer) viewer).getSelection();
+						ITreeContentProvider contentProvider = ((ITreeContentProvider) ((TreeViewer) viewer)
+								.getContentProvider());
+						contentProvider.getChildren(project);
+						((StructuredViewer) viewer).refresh(project);
+						((TreeViewer) viewer).setSelection(sel);
+					}
+				}
+			};
+			Display.getDefault().asyncExec(refreshThread);
+		} catch (Exception e)
+		{
+			JEEUIPlugin.logError("Error during refresh", e); //$NON-NLS-1$
+		}
+	}
+
+	public void modelsChanged(IModelProviderEvent event) {
+		projectChanged(event.getProject());
+	}
+
+	public void onRefresh(final Object element) {
+		if (viewer instanceof AbstractTreeViewer) {
+			if (Display.getCurrent() != null) {
+				((AbstractTreeViewer) viewer).refresh(element, true);
+			} else {
+				/* Create and schedule a UI Job to update the Navigator Content Viewer */
+				Job job = new UIJob("Update the Navigator Content Viewer Job") { //$NON-NLS-1$
+					public IStatus runInUIThread(IProgressMonitor monitor) {
+						((AbstractTreeViewer) viewer).refresh(element, true);
+						return Status.OK_STATUS;
+					}
+				};
+				ISchedulingRule rule = new ISchedulingRule() {
+					public boolean contains(ISchedulingRule rule) {
+						return rule == this;	
+					}
+					public boolean isConflicting(ISchedulingRule rule) {
+						return rule == this;
+					}
+				};
+				if (rule != null) {
+					job.setRule(rule);
+				}
+				job.schedule();
+			}
+		}
+	}
+	
+	public void dispose() {
+		groupProvidersMap.clear();
+	}
+}
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java
index a2faab6..3f2b84b 100644
--- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/OpenJEEResourceAction.java
@@ -46,6 +46,7 @@
 import org.eclipse.jst.jee.ui.internal.navigator.ear.GroupEARProvider;
 import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanInterfaceNode;
 import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanNode;
+import org.eclipse.jst.jee.ui.internal.navigator.ejb.GroupEJBProvider;
 import org.eclipse.jst.jee.ui.internal.navigator.web.WebAppProvider;
 import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
 import org.eclipse.ui.IEditorDescriptor;
@@ -106,6 +107,9 @@
 			IType findType;
 			try {
 				findType = JavaCore.create(project).findType(c);
+				if(findType == null){
+					return;
+				}
 				openAppropriateEditor(findType.getResource());
 			} catch (JavaModelException e) {
 				JEEUIPlugin.logError("Error during open editor", e); //$NON-NLS-1$
@@ -211,30 +215,7 @@
         	return;
 		}
 		if (srcObject instanceof EObject) {
-			EObject ro = (EObject) srcObject;
-			IResource resource = WorkbenchResourceHelper
-			.getFile((EObject) srcObject);
-			if (resource != null) {
-				openAppropriateEditor(resource);
-			} else {
-				ModuleFile moduleFile = ArchiveUtil.getModuleFile(ro);
-				if (moduleFile != null) {
-					ArchiveOptions options = moduleFile.getOptions();
-					if (options instanceof ComponentArchiveOptions) {
-						IVirtualComponent component = ((ComponentArchiveOptions) options)
-						.getComponent();
-						openAppropriateEditor(component);
-					}
-				} else {
-					IArchive archive = JavaEEArchiveUtilities.findArchive(ro);
-					if(archive != null){
-						IVirtualComponent component = JavaEEArchiveUtilities.findComponent(archive);
-						if(component != null){
-							openAppropriateEditor(component);
-						}
-					}
-				}
-			}
+			openEObject((EObject) srcObject);
 		} else if (srcObject instanceof BeanInterfaceNode) {
 			openAppropriateEditor(((BeanInterfaceNode) srcObject).get_fqn());
 			return;
@@ -248,6 +229,8 @@
 				openAppropriateEditor(file);
 				return;
 			}
+		} else if (srcObject instanceof GroupEJBProvider) {
+			openEObject((EObject) ((GroupEJBProvider)srcObject).getEjbJar());
 		} else if (srcObject instanceof GroupEARProvider) {
 			IFile file = ((GroupEARProvider) srcObject).getDDFile();
 			if (file.isAccessible()){
@@ -266,6 +249,34 @@
 					.getFile((Resource) srcObject));
 	}
 
+	private void openEObject(EObject _srcObject) {
+		EObject ro = (EObject) _srcObject;
+		IResource resource = WorkbenchResourceHelper
+		.getFile((EObject) _srcObject);
+		if (resource != null) {
+			openAppropriateEditor(resource);
+		} else {
+			ModuleFile moduleFile = ArchiveUtil.getModuleFile(ro);
+			if (moduleFile != null) {
+				ArchiveOptions options = moduleFile.getOptions();
+				if (options instanceof ComponentArchiveOptions) {
+					IVirtualComponent component = ((ComponentArchiveOptions) options)
+					.getComponent();
+					openAppropriateEditor(component);
+				}
+			} else {
+				IArchive archive = JavaEEArchiveUtilities.findArchive(ro);
+				if(archive != null){
+					IVirtualComponent component = JavaEEArchiveUtilities.findComponent(archive);
+					if(component != null){
+						openAppropriateEditor(component);
+					}
+				}
+			}
+		}
+		
+	}
+
 	/**
 	 * The structured selection has changed in the workbench. Subclasses should
 	 * override this method to react to the change. Returns true if the action
@@ -374,12 +385,17 @@
 						contentType);
 			} else {
 				if(((EObject) beanInterface).eResource() != null){
-					String name = (new Path(((EObject) beanInterface).eResource().getURI()
-							.toString())).lastSegment();
+					String name = (new Path(((EObject) beanInterface).eResource().getURI().toString())).lastSegment();
 					currentDescriptor = registry.getDefaultEditor(name, null);
 				} else {
-					currentDescriptor = null;
-					return false;
+					String fqn = ((BeanInterfaceNode) obj).get_fqn();
+					if (fqn != null){
+						currentDescriptor = registry.getDefaultEditor(((BeanInterfaceNode) obj).getText(), null);
+//						return true;
+					} else {
+						return false;
+					}
+					
 				}
 			}
 		}
diff --git a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Web25ContentProvider.java b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Web25ContentProvider.java
index 01d0f91..ea9e7b9 100644
--- a/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Web25ContentProvider.java
+++ b/plugins/org.eclipse.jst.jee.ui/src/org/eclipse/jst/jee/ui/internal/navigator/Web25ContentProvider.java
@@ -12,25 +12,13 @@
 
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jst.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.IModelProviderEvent;
-import org.eclipse.jst.j2ee.model.IModelProviderListener;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.navigator.internal.J2EEContentProvider;
 import org.eclipse.jst.javaee.web.WebApp;
 import org.eclipse.jst.jee.ui.internal.navigator.web.WebAppProvider;
-import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
-import org.eclipse.swt.widgets.Display;
 
 /**
  * Web 2.5 Content provider is Deployment Descriptor content provider, 
@@ -38,15 +26,8 @@
  * 
  * @author Dimitar Giormov
  */
-public class Web25ContentProvider extends J2EEContentProvider implements IModelProviderListener {
+public class Web25ContentProvider extends JEE5ContentProvider {
 
-	private static final Class IPROJECT_CLASS = IProject.class;
-
-	private Viewer viewer;
-
-	private static HashMap<IProject, IModelProvider> groupProvidersMap = new HashMap<IProject, IModelProvider>();
-
-	@Override
 	public Object[] getChildren(Object aParentElement) {
 
 		List<Object> children = new ArrayList<Object>();
@@ -54,18 +35,9 @@
 		if (aParentElement instanceof IAdaptable) {
 			project = (IProject) ((IAdaptable) aParentElement).getAdapter(IPROJECT_CLASS);
 			if (project != null) {
-			         IModelProvider provider = groupProvidersMap.get(project);
-					if (provider != null){
-					    Object mObj = provider.getModelObject();
-						children.add(new WebAppProvider((WebApp) mObj,project));
-					} else{
-						provider = ModelProviderManager.getModelProvider(project);
-						provider.addListener(this);
-						Object mObj = provider.getModelObject();
-						WebAppProvider webProvider = new WebAppProvider((WebApp) mObj,project);
-						children.add(webProvider);
-						groupProvidersMap.put(project,provider);
-					}
+				IModelProvider provider = getCachedModelProvider(project);
+			    Object mObj = provider.getModelObject();
+				children.add(new WebAppProvider((WebApp) mObj,project));
 			}
 		} else if (aParentElement instanceof WebAppProvider){
 			children.addAll(((WebAppProvider) aParentElement).getChildren());
@@ -75,17 +47,7 @@
 		return children.toArray();
 	}
 
-	public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) {
-		viewer = aViewer;
-	}
 
-	@Override
-	public void dispose() {
-		groupProvidersMap.clear();
-		
-	}
-
-	@Override
 	public boolean hasChildren(Object element) {
 		if (element instanceof WebAppProvider) {
 			return true;
@@ -95,49 +57,11 @@
 			return false;
 	}
 
-	private void j2eeRefreshContent() {
-		try {
-			Runnable refreshThread = new Runnable() {
-				public void run() {
-					viewer.refresh();
-				}
-			};
-			Display.getDefault().asyncExec(refreshThread);
-		} catch (Exception e) {
-			 JEEUIPlugin.logError("Error during refresh", e); //$NON-NLS-1$
-		}
+	public Object getParent(Object element) {
+		return null;
 	}
 
-	public void projectChanged(final IProject project) {
-		// TODO refresh only the Deployment Description tree of the affected 
-		// project instead of the DD tree of all projects. 
-//		j2eeRefreshContent();
-
-		try
-		{
-			Runnable refreshThread = new Runnable()
-			{
-				public void run()
-				{
-				  if (viewer != null) {
-		            ISelection sel = ((TreeViewer) viewer).getSelection();
-		            ITreeContentProvider contentProvider = ((ITreeContentProvider) ((TreeViewer) viewer)
-		                .getContentProvider());
-		            contentProvider.getChildren(project);
-		            ((StructuredViewer) viewer).refresh(project);
-		            ((TreeViewer) viewer).setSelection(sel);
-		          }
-		        }
-			};
-			Display.getDefault().asyncExec(refreshThread);
-		} catch (Exception e)
-		{
-			JEEUIPlugin.logError("Error during refresh", e); //$NON-NLS-1$
-		}
+	public Object[] getElements(Object inputElement) {
+		return getChildren(inputElement);
 	}
-
-  public void modelsChanged(IModelProviderEvent event) {
-    projectChanged(event.getProject());
-    
-  }
 }
diff --git a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java
index 40a369c..212bd70 100644
--- a/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java
+++ b/plugins/org.eclipse.jst.jee.web/web/org/eclipse/jst/jee/model/internal/Web25MergedModelProvider.java
@@ -14,8 +14,6 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
 import org.eclipse.jst.j2ee.model.IModelProvider;
 import org.eclipse.jst.j2ee.model.IModelProviderEvent;
 import org.eclipse.jst.javaee.web.WebApp;
@@ -174,12 +172,7 @@
 			WebAppMerger merger;
 			if (mergedModel == null) {
 				mergedModel = (WebApp) WebFactory.eINSTANCE.createWebApp();
-				Resource resourceDD = ((EObject)ddModel).eResource();
-				Resource resourceMM = ((EObject)mergedModel).eResource();
-				if (resourceDD != null && resourceMM == null){
-				  ResourceImpl resRes = new ResourceImpl(resourceDD.getURI());
-				  resRes.getContents().add((EObject)mergedModel);
-			    }
+				initMergedModelResource((EObject) ddModel);
 			} else {
 				clearModel(mergedModel);
 
@@ -194,5 +187,4 @@
 		}
 		return mergedModel;
 	}
-
 }
diff --git a/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java b/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java
index 0995b28..beed63d 100644
--- a/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java
+++ b/plugins/org.eclipse.jst.jee/common/org/eclipse/jst/jee/model/internal/common/AbstractMergedModelProvider.java
@@ -17,6 +17,9 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
 import org.eclipse.jst.j2ee.model.IModelProvider;
 import org.eclipse.jst.j2ee.model.IModelProviderEvent;
 import org.eclipse.jst.j2ee.model.IModelProviderListener;
@@ -210,6 +213,16 @@
 		isOnceDisposed = false;
 		return merge(ddModel, annotationModel);
 	}
+	
+	protected void initMergedModelResource(EObject ddModel) {
+		Resource resourceDD = ddModel.eResource();
+		Resource resourceMM = ((EObject)mergedModel).eResource();
+		if (resourceDD != null && resourceMM == null){
+		  ResourceImpl resRes = new ResourceImpl(resourceDD.getURI());
+		  resRes.getContents().add((EObject)mergedModel);
+	    }
+		
+	}
 
 	/**
 	 * The method is used for enabling notifications from the internalProviders.
