diff --git a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/tasks/TaskScanner.java b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/tasks/TaskScanner.java
index 6bf6d48..d539254 100644
--- a/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/tasks/TaskScanner.java
+++ b/bundles/org.eclipse.wst.sse.core/src/org/eclipse/wst/sse/core/internal/tasks/TaskScanner.java
@@ -21,8 +21,6 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Platform;
@@ -31,6 +29,9 @@
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.wst.sse.core.internal.Logger;
 
+/**
+ * Dispatcher for scanning based on deltas and requested projects
+ */
 class TaskScanner {
 	private static final boolean _debug = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks")); //$NON-NLS-1$ //$NON-NLS-2$
 	private static final boolean _debugContentTypeDetection = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.core/tasks/detection")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -97,31 +98,25 @@
 		if (scanMonitor.isCanceled())
 			return;
 		try {
-			IResourceVisitor innerScanner = new IResourceVisitor() {
-				public boolean visit(IResource visitee) throws CoreException {
-					if ((visitee.getType() & IResource.FOLDER) > 0 || (visitee.getType() & IResource.PROJECT) > 0) {
-						SubProgressMonitor childMonitor = new SubProgressMonitor(scanMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
-						IResource[] children = ((IContainer) visitee).members();
-						childMonitor.beginTask("", children.length);
-						for (int i = children.length - 1; i >= 0; i--) {
-							internalScan(project, children[i], new SubProgressMonitor(childMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-						}
-						childMonitor.done();
+			String name = resource.getName();
+			if (name.length() != 0 && name.charAt(0) != '.') {
+				if ((resource.getType() & IResource.FOLDER) > 0 || (resource.getType() & IResource.PROJECT) > 0) {
+					SubProgressMonitor childMonitor = new SubProgressMonitor(scanMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
+					IResource[] children = ((IContainer) resource).members();
+					childMonitor.beginTask("", children.length);
+					for (int i = children.length - 1; i >= 0; i--) {
+						internalScan(project, children[i], new SubProgressMonitor(childMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
 					}
-					else if ((visitee.getType() & IResource.FILE) > 0) {
-						scanFile(project, (IFile) visitee, scanMonitor);
-						scanMonitor.worked(1);
-					}
-					else {
-						scanMonitor.worked(1);
-					}
-					String name = visitee.getName();
-					return name.length() != 0 && name.charAt(0) != '.';
+					childMonitor.done();
 				}
-			};
-
-			scanMonitor.beginTask("", 1);
-			resource.accept(innerScanner);
+				else if ((resource.getType() & IResource.FILE) > 0) {
+					scanFile(project, (IFile) resource, scanMonitor);
+					scanMonitor.worked(1);
+				}
+				else {
+					scanMonitor.worked(1);
+				}
+			}
 			scanMonitor.done();
 		}
 		catch (CoreException e) {
@@ -132,40 +127,35 @@
 	void internalScan(IResourceDelta delta, final IProgressMonitor monitor) {
 		if (monitor.isCanceled())
 			return;
-		IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
-			public boolean visit(IResourceDelta fileDelta) throws CoreException {
-				if (monitor.isCanceled())
-					return false;
-				IResource resource = fileDelta.getResource();
-				if ((resource.getType() & IResource.FOLDER) > 0 || (resource.getType() & IResource.PROJECT) > 0) {
-					IResourceDelta[] children = fileDelta.getAffectedChildren();
-					String name = fileDelta.getFullPath().lastSegment();
-					if (name.length() != 0 && name.charAt(0) != '.' && children.length > 0) {
-						SubProgressMonitor childMonitor = new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
-						childMonitor.beginTask("", children.length);
-						for (int i = 0; i < children.length; i++) {
-							internalScan(children[i], new SubProgressMonitor(childMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
-						}
-						childMonitor.done();
+		try {
+			String name = delta.getFullPath().lastSegment();
+			IResource resource = delta.getResource();
+			if ((resource.getType() & IResource.FOLDER) > 0 || (resource.getType() & IResource.PROJECT) > 0) {
+				IResourceDelta[] children = delta.getAffectedChildren();
+				if (name.length() != 0 && name.charAt(0) != '.' && children.length > 0) {
+					SubProgressMonitor childMonitor = new SubProgressMonitor(monitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
+					childMonitor.beginTask("", children.length);
+					for (int i = children.length - 1; i >= 0; i--) {
+						internalScan(children[i], new SubProgressMonitor(childMonitor, 1, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
 					}
-					else {
-						monitor.worked(1);
-					}
+					childMonitor.done();
 				}
-				else if ((resource.getType() & IResource.FILE) > 0) {
-					if ((fileDelta.getKind() & IResourceDelta.ADDED) > 0 || ((fileDelta.getKind() & IResourceDelta.CHANGED) > 0 && (fileDelta.getFlags() & IResourceDelta.CONTENT) > 0)) {
-						IFile file = (IFile) resource;
-						scanFile(file.getProject(), file, monitor);
-					}
+				else {
 					monitor.worked(1);
 				}
-				return false;
 			}
-		};
-		try {
-			delta.accept(visitor);
+			else if (name.length() != 0 && name.charAt(0) != '.' && (resource.getType() & IResource.FILE) > 0) {
+				if ((delta.getKind() & IResourceDelta.ADDED) > 0 || ((delta.getKind() & IResourceDelta.CHANGED) > 0 && (delta.getFlags() & IResourceDelta.CONTENT) > 0)) {
+					IFile file = (IFile) resource;
+					scanFile(file.getProject(), file, monitor);
+				}
+				monitor.worked(1);
+			}
+			else {
+				monitor.worked(1);
+			}
 		}
-		catch (CoreException e) {
+		catch (Exception e) {
 			monitor.done();
 			Logger.logException(e);
 		}
