checking if sdRegion is null or isDeleted in case translation is called from another thread, this is safer.
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
index 7d434fc..8a7537e 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/JSPTranslator.java
@@ -1210,12 +1210,16 @@
 			while (it.hasNext()) {
 				tracker = (CMDocumentTracker) it.next();
 				sdRegion = tracker.getStructuredDocumentRegion();
-				taglibRegions = sdRegion.getRegions().iterator();
-				while (taglibRegions.hasNext()) {
-					r = (ITextRegion) taglibRegions.next();
-					if (r.getType().equals(DOMJSPRegionContexts.JSP_DIRECTIVE_NAME)) {
-						if (sdRegion.getText(r).equals(JSP12TLDNames.TAGLIB)) {
-							addBlockMarkers(tracker.getDocument());
+				// since may be call from another thread (like a background job)
+				// this check is to be safer
+				if(sdRegion != null && !sdRegion.isDeleted()) {
+					taglibRegions = sdRegion.getRegions().iterator();
+					while (sdRegion != null && !sdRegion.isDeleted() && taglibRegions.hasNext()) {
+						r = (ITextRegion) taglibRegions.next();
+						if (r.getType().equals(DOMJSPRegionContexts.JSP_DIRECTIVE_NAME)) {
+							if (sdRegion.getText(r).equals(JSP12TLDNames.TAGLIB)) {
+								addBlockMarkers(tracker.getDocument());
+							}
 						}
 					}
 				}