[317728] NPE in J2EEComponentClasspathContainer.getBaseEARLibRefs
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
index d6fdcf0..aa2d80d 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
@@ -61,6 +61,28 @@
 		if (targetProject == null) {
 			throw new NullPointerException("Target project must not be null.");
 		}
+		//update removed references accordingly
+		if(removedReferences != null){
+			Set references = removedReferences.get(targetProject);
+			if(references != null){
+				if(references.remove(sourceProject)) {
+					if(references.isEmpty()){
+						removedReferences.remove(targetProject);
+						if(removedReferences.isEmpty()){
+							removedReferences = null;
+							if((type & ADDED) == ADDED){
+								type = ADDED;
+							} else {
+								type = 0;
+							}
+						}
+					}
+					//there is no net change, so return.
+					return;
+				}
+			}
+		}
+		
 		if (addedReferences == null) {
 			type = type | ADDED;
 			addedReferences = new HashMap<IProject, Set<IProject>>();
@@ -71,6 +93,8 @@
 			addedReferences.put(targetProject, references);
 		}
 		references.add(sourceProject);
+		
+		
 	}
 
 	void removeReference(IProject sourceProject, IProject targetProject) {
@@ -80,6 +104,29 @@
 		if (targetProject == null) {
 			throw new NullPointerException("Target project must not be null.");
 		}
+		
+		//updated added references accordingly
+		if(addedReferences != null){
+			Set references = addedReferences.get(targetProject);
+			if(references != null){
+				if(references.remove(sourceProject)){
+					if(references.isEmpty()){
+						addedReferences.remove(targetProject);
+						if(addedReferences.isEmpty()){
+							addedReferences = null;
+							if((type & REMOVED) == REMOVED){
+								type = REMOVED;
+							} else {
+								type = 0;
+							}
+						}
+					}
+					//there is no net change, so return.
+					return;
+				}
+			}
+		}
+		
 		if (removedReferences == null) {
 			type = type | REMOVED;
 			removedReferences = new HashMap<IProject, Set<IProject>>();
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
index 595ba16..187bb48 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
@@ -196,6 +196,16 @@
 			
 		}
 	}
+	
+	private void removeAllReferences(DependencyGraphEvent event){
+		synchronized (graphLock) {
+			IProject [] allReferenceKeys = new IProject [graph.keySet().size()];
+			graph.keySet().toArray(allReferenceKeys);
+			for(IProject project : allReferenceKeys){
+				removeAllReferences(project, event);
+			}
+		}
+	}
 
 	private void removeAllReferences(IProject targetProject, DependencyGraphEvent event) {
 		synchronized (graphLock) {
@@ -352,17 +362,21 @@
 					}
 	
 					public void run() throws Exception {
-						// this is the simple case; just remove them all
-						synchronized (graphLock) {
-							for (Object o : removed) {
-								IProject project = (IProject) o;
-								removeAllReferences(project, event);
+						//all references will be rebuilt during an add
+						if(added.length == 0){
+							// this is the simple case; just remove them all
+							synchronized (graphLock) {
+								for (Object o : removed) {
+									IProject project = (IProject) o;
+									removeAllReferences(project, event);
+								}
 							}
 						}
 						// get the updated queue in case there are any adds
 						// if there are any added projects, then unfortunately the
 						// entire workspace needs to be processed
 						if (added.length > 0) {
+							removeAllReferences(event);
 							IProject[] allProjects = null;
 							int state = ResourcesPlugin.getPlugin().getBundle().getState();
 							if (state == Bundle.ACTIVE) {