diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java
index 96bb2fd..1fbb799 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/taglib/TaglibIndex.java
@@ -71,36 +71,33 @@
 		public void elementChanged(ElementChangedEvent event) {
 			if (!isIndexAvailable())
 				return;
-			try {
-				LOCK.acquire();
-				if (_debugEvents) {
-					Logger.log(Logger.INFO, "TaglibIndex responding to:" + event); //$NON-NLS-1$
-				}
-				projectsIndexed.clear();
-				elementChanged(event.getDelta(), true);
-				fireCurrentDelta(event);
+			if (_debugEvents) {
+				Logger.log(Logger.INFO, "TaglibIndex responding to:" + event); //$NON-NLS-1$
 			}
-			finally {
-				LOCK.release();
-			}
+			DeltaRunner runner = new DeltaRunner(event);
+			elementChanged(runner, event.getDelta(), true);
 		}
 
-		private void elementChanged(IJavaElementDelta delta, boolean forceUpdate) {
+		private void elementChanged(DeltaRunner runner, final IJavaElementDelta delta, final boolean forceUpdate) {
 			if (frameworkIsShuttingDown())
 				return;
 
-			IJavaElement element = delta.getElement();
+			final IJavaElement element = delta.getElement();
 			if (element.getElementType() == IJavaElement.JAVA_MODEL) {
 				IJavaElementDelta[] changed = delta.getAffectedChildren();
 				for (int i = 0; i < changed.length; i++) {
-					elementChanged(changed[i], forceUpdate);
+					elementChanged(runner, changed[i], forceUpdate);
 				}
 			}
 			// Handle any changes at the project level
 			else if (element.getElementType() == IJavaElement.JAVA_PROJECT) {
 				if ((delta.getFlags() & IJavaElementDelta.F_CLASSPATH_CHANGED) != 0) {
-					IJavaElement proj = element;
-					handleClasspathChange((IJavaProject) proj, delta, forceUpdate);
+					runner.run(new Runnable() {
+						public void run() {
+							IJavaElement proj = element;
+							handleClasspathChange((IJavaProject) proj, delta, forceUpdate);
+						}
+					});
 				}
 				else {
 					IJavaElementDelta[] deltas = delta.getAffectedChildren();
@@ -110,17 +107,21 @@
 							 * If the project is being deleted or closed, just
 							 * remove the description
 							 */
-							IJavaProject proj = (IJavaProject) element;
-							ProjectDescription description = (ProjectDescription) fProjectDescriptions.remove(proj.getProject());
-							if (description != null) {
-								if (_debugIndexCreation) {
-									Logger.log(Logger.INFO, "removing index of " + description.fProject.getName()); //$NON-NLS-1$
+							runner.run(new Runnable() {
+								public void run() {
+									IJavaProject proj = (IJavaProject) element;
+									ProjectDescription description = (ProjectDescription) fProjectDescriptions.remove(proj.getProject());
+									if (description != null) {
+										if (_debugIndexCreation) {
+											Logger.log(Logger.INFO, "removing index of " + description.fProject.getName()); //$NON-NLS-1$
+										}
+										// removing the index file ensures that we
+										// don't get stale data if the project is
+										// reopened
+										removeIndexFile(proj.getProject());
+									}
 								}
-								// removing the index file ensures that we
-								// don't get stale data if the project is
-								// reopened
-								removeIndexFile(proj.getProject());
-							}
+							});
 						}
 					}
 					/*
@@ -129,7 +130,7 @@
 					 */
 					else {
 						for (int i = 0; i < deltas.length; i++) {
-							elementChanged(deltas[i], false);
+							elementChanged(runner, deltas[i], false);
 						}
 					}
 				}
@@ -140,24 +141,28 @@
 			 * itself
 			 */
 			else if ((delta.getFlags() & IJavaElementDelta.F_ADDED_TO_CLASSPATH) != 0 || (delta.getFlags() & IJavaElementDelta.F_REMOVED_FROM_CLASSPATH) != 0) {
-				IJavaProject affectedProject = element.getJavaProject();
-				if (affectedProject != null) {
-					/*
-					 * If the affected project has an index on-disk, it's
-					 * going to be invalid--we need to create/load the
-					 * description so it will be up to date [loading now and
-					 * updating is usually faster than regenerating the entire
-					 * index]. If there is no index on disk, do nothing more.
-					 */
-					File indexFile = new File(computeIndexLocation(affectedProject.getProject().getFullPath()));
-					if (indexFile.exists()) {
-						ProjectDescription affectedDescription = createDescription(affectedProject.getProject());
-						if (affectedDescription != null) {
-							affectedDescription.handleElementChanged(delta);
+				/*
+				 * If the affected project has an index on-disk, it's
+				 * going to be invalid--we need to create/load the
+				 * description so it will be up to date [loading now and
+				 * updating is usually faster than regenerating the entire
+				 * index]. If there is no index on disk, do nothing more.
+				 */
+				runner.run(new Runnable() {
+					public void run() {
+						IJavaProject affectedProject = element.getJavaProject();
+						if (affectedProject != null) {
+							File indexFile = new File(computeIndexLocation(affectedProject.getProject().getFullPath()));
+							if (indexFile.exists()) {
+								ProjectDescription affectedDescription = createDescription(affectedProject.getProject());
+								if (affectedDescription != null) {
+									affectedDescription.handleElementChanged(delta);
+								}
+							}
+							projectsIndexed.add(affectedProject.getProject());
 						}
 					}
-					projectsIndexed.add(affectedProject.getProject());
-				}
+				});
 			}
 		}
 
@@ -190,6 +195,26 @@
 				Logger.logException(e);
 			}
 		}
+
+		class DeltaRunner {
+			private ElementChangedEvent event;
+			public DeltaRunner(ElementChangedEvent event) {
+				this.event = event;
+			}
+
+			public void run(Runnable runnable) {
+				LOCK.acquire();
+				try {
+					projectsIndexed.clear();
+					runnable.run();
+					fireCurrentDelta(event);
+				}
+				finally {
+					LOCK.release();
+				}
+			}
+		}
+
 	}
 
 	class ResourceChangeListener implements IResourceChangeListener {
