*** empty log message ***
diff --git a/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties b/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
index 392c785..100f450 100644
--- a/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
+++ b/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
@@ -1,7 +1,7 @@
 ### JavaBatchCompiler messages.

 

 ### compiler version id

-compiler.version = 0.245

+compiler.version = 0.242b

 ### scanning

 scanning.start = Collecting source files inside {0}

 

diff --git a/model/org/eclipse/jdt/internal/core/Util.java b/model/org/eclipse/jdt/internal/core/Util.java
index 60115bb..f9dc4a6 100644
--- a/model/org/eclipse/jdt/internal/core/Util.java
+++ b/model/org/eclipse/jdt/internal/core/Util.java
@@ -166,7 +166,7 @@
 }

 	/**

 	 * Concatenate two strings with a char in between.

-	 * @see #concat(String, String)

+	 * @see concat(String, String)

 	 */

 	public static String concat(String s1, char c, String s2) {

 		if (s1 == null) s1 = "null"; //$NON-NLS-1$

@@ -202,7 +202,7 @@
 

 	/**

 	 * Concatenate three strings.

-	 * @see #concat(String, String)

+	 * @see concat(String, String)

 	 */

 	public static String concat(String s1, String s2, String s3) {

 		if (s1 == null) s1 = "null"; //$NON-NLS-1$

@@ -260,11 +260,7 @@
 		int len = a.length;

 		if (len != b.length) return false;

 		for (int i = 0; i < len; ++i) {

-			if (a[i] == null) {

-				if (b[i] != null) return false;

-			} else {

-				if (!a[i].equals(b[i])) return false;

-			}

+			if (!a[i].equals(b[i])) return false;

 		}

 		return true;

 	}

@@ -535,19 +531,33 @@
 		return JavaConventions.validateIdentifier(folderName).getSeverity() != IStatus.ERROR;

 	}	

 

-	/*

-	 * Add a log entry

-	 */

-	public static void log(Throwable e, String message) {

-		IStatus status= new Status(

-			IStatus.ERROR, 

-			JavaCore.getPlugin().getDescriptor().getUniqueIdentifier(), 

-			IStatus.ERROR, 

-			message, 

-			e); 

-		JavaCore.getPlugin().getLog().log(status);

-	}	

-	

+/**

+ * Add entry into the workspace log file

+ */

+public static void log(String message){

+	JavaCore.getPlugin().getLog().log(

+		new JavaModelStatus(IStatus.ERROR, message));

+}	

+

+/**

+ * Add entry into the workspace log file

+ */

+public static void log(Throwable e){

+	JavaCore.getPlugin().getLog().log(

+		new JavaModelStatus(IStatus.ERROR, e));

+}

+/*

+ * Add a log entry

+ */

+public static void log(Throwable e, String message) {

+	IStatus status= new Status(

+		IStatus.ERROR, 

+		JavaCore.getPlugin().getDescriptor().getUniqueIdentifier(), 

+		IStatus.ERROR, 

+		message, 

+		e); 

+	JavaCore.getPlugin().getLog().log(status);

+}

 /**

  * Normalizes the cariage returns in the given text.

  * They are all changed  to use the given buffer's line sepatator.

@@ -1048,9 +1058,10 @@
 		int suffixLength = SUFFIX_CLASS.length;

 		if (nameLength < suffixLength) return false;

 

-		for (int i = 0, offset = nameLength - suffixLength; i < suffixLength; i++) {

-			char c = name.charAt(offset + i);

-			if (c != SUFFIX_class[i] && c != SUFFIX_CLASS[i]) return false;

+		for (int i = 0; i < suffixLength; i++) {

+			char c = name.charAt(nameLength - i - 1);

+			int suffixIndex = suffixLength - i - 1;

+			if (c != SUFFIX_class[suffixIndex] && c != SUFFIX_CLASS[suffixIndex]) return false;

 		}

 		return true;		

 	}

@@ -1100,9 +1111,10 @@
 		int suffixLength = SUFFIX_JAVA.length;

 		if (nameLength < suffixLength) return false;

 

-		for (int i = 0, offset = nameLength - suffixLength; i < suffixLength; i++) {

-			char c = name.charAt(offset + i);

-			if (c != SUFFIX_java[i] && c != SUFFIX_JAVA[i]) return false;

+		for (int i = 0; i < suffixLength; i++) {

+			char c = name.charAt(nameLength - i - 1);

+			int suffixIndex = suffixLength - i - 1;

+			if (c != SUFFIX_java[suffixIndex] && c != SUFFIX_JAVA[suffixIndex]) return false;

 		}

 		return true;		

 	}

diff --git a/model/org/eclipse/jdt/internal/core/builder/JavaBuilder.java b/model/org/eclipse/jdt/internal/core/builder/JavaBuilder.java
index 4bd0223..128d540 100644
--- a/model/org/eclipse/jdt/internal/core/builder/JavaBuilder.java
+++ b/model/org/eclipse/jdt/internal/core/builder/JavaBuilder.java
@@ -11,7 +11,6 @@
 import org.eclipse.jdt.core.*;

 import org.eclipse.jdt.internal.core.*;

 

-import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

 import org.eclipse.jdt.internal.compiler.util.CharOperation;

 import org.eclipse.jdt.internal.core.Util;

 

@@ -35,7 +34,6 @@
 public static final String CLASS_EXTENSION = "class"; //$NON-NLS-1$

 public static final String JAR_EXTENSION = "jar"; //$NON-NLS-1$

 public static final String ZIP_EXTENSION = "zip"; //$NON-NLS-1$

-public static final String OPTION_InvalidClasspathSwitch = "org.eclipse.jdt.core.builder.invalidClasspath"; //$NON-NLS-1$

 public static final String OPTION_ResourceCopyFilter = "org.eclipse.jdt.core.builder.resourceCopyExclusionFilter"; //$NON-NLS-1$

 

 public static boolean DEBUG = false;

@@ -76,7 +74,7 @@
 

 protected IProject[] build(int kind, Map ignored, IProgressMonitor monitor) throws CoreException {

 	this.currentProject = getProject();

-	if (currentProject == null || !currentProject.isAccessible()) return new IProject[0];

+	if (currentProject == null || !currentProject.exists()) return new IProject[0];

 

 	if (DEBUG)

 		System.out.println("\nStarting build of " + currentProject.getName() //$NON-NLS-1$

@@ -88,29 +86,27 @@
 		notifier.checkCancel();

 		initializeBuilder();

 

-		if (isWorthBuilding()) {

-			if (kind == FULL_BUILD) {

+		if (kind == FULL_BUILD) {

+			buildAll();

+		} else {

+			if ((this.lastState = getLastState(currentProject)) == null) {

+				if (DEBUG)

+					System.out.println("Performing full build since last saved state was not found"); //$NON-NLS-1$

 				buildAll();

-			} else {

-				if ((this.lastState = getLastState(currentProject)) == null) {

-					if (DEBUG)

-						System.out.println("Performing full build since last saved state was not found"); //$NON-NLS-1$

+			} else if (hasClasspathChanged() || hasOutputLocationChanged()) {

+				// if the output location changes, do not delete the binary files from old location

+				// the user may be trying something

+				buildAll();

+			} else if (sourceFolders.length > 0) { // if there is no source to compile & no classpath changes then we are done

+				clearLastState(); // clear the previously built state so if the build fails, a full build will occur next time

+				SimpleLookupTable deltas = findDeltas();

+				if (deltas == null)

 					buildAll();

-				} else if (hasClasspathChanged() || hasOutputLocationChanged()) {

-					// if the output location changes, do not delete the binary files from old location

-					// the user may be trying something

-					buildAll();

-				} else if (sourceFolders.length > 0) { // if there is no source to compile & no classpath changes then we are done

-					clearLastState(); // clear the previously built state so if the build fails, a full build will occur next time

-					SimpleLookupTable deltas = findDeltas();

-					if (deltas == null)

-						buildAll();

-					else

-						buildDeltas(deltas);

-				}

+				else

+					buildDeltas(deltas);

 			}

-			ok = true;

 		}

+		ok = true;

 	} catch (CoreException e) {

 		Util.log(e, "JavaBuilder handling CoreException"); //$NON-NLS-1$

 		try {

@@ -121,7 +117,7 @@
 			throw e;

 		}

 	} catch (ImageBuilderInternalException e) {

-		Util.log(e.getThrowable(), "JavaBuilder handling ImageBuilderInternalException"); //$NON-NLS-1$

+		Util.log(e, "JavaBuilder handling ImageBuilderInternalException"); //$NON-NLS-1$

 		try {

 			IMarker marker = currentProject.createMarker(ProblemMarkerTag);

 			marker.setAttribute(IMarker.MESSAGE, Util.bind("build.inconsistentProject")); //$NON-NLS-1$

@@ -129,17 +125,11 @@
 		} catch (CoreException ignore) {

 			throw e.getThrowable();

 		}

-	} catch (MissingClassFileException e) {

-		// do not log this exception since its thrown to handle aborted compiles because of missing class files

-		if (DEBUG)

-			System.out.println(Util.bind("build.incompleteClassPath", e.missingClassFile)); //$NON-NLS-1$

+	} catch (IncompleteClassPathException e) {

 		IMarker marker = currentProject.createMarker(ProblemMarkerTag);

 		marker.setAttribute(IMarker.MESSAGE, Util.bind("build.incompleteClassPath", e.missingClassFile)); //$NON-NLS-1$

 		marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);

 	} catch (MissingSourceFileException e) {

-		// do not log this exception since its thrown to handle aborted compiles because of missing source files

-		if (DEBUG)

-			System.out.println(Util.bind("build.missingSourceFile", e.missingSourceFile)); //$NON-NLS-1$

 		removeProblemsFor(currentProject); // make this the only problem for this project

 		IMarker marker = currentProject.createMarker(ProblemMarkerTag);

 		marker.setAttribute(IMarker.MESSAGE, Util.bind("build.missingSourceFile", e.missingSourceFile)); //$NON-NLS-1$

@@ -278,9 +268,10 @@
 			Object[] keyTable = binaryResources.keyTable;

 			for (int i = 0, l = keyTable.length; i < l; i++) {

 				IProject p = (IProject) keyTable[i];

-				if (p != null && p != currentProject && !projects.contains(p))

+				if (p != null && !projects.contains(p))

 					projects.add(p);

 			}

+			this.binaryResources = null;

 		}

 	} catch(JavaModelException e) {

 		return new IProject[0];

@@ -364,12 +355,12 @@
 		binaryResources);

 	this.sourceFolders = new IContainer[sourceList.size()];

 	sourceList.toArray(this.sourceFolders);

-

+	

 	String filterSequence = (String) JavaCore.getOptions().get(OPTION_ResourceCopyFilter);

 	this.resourceFilters = filterSequence != null && filterSequence.length() > 0

 		? CharOperation.splitOn(',', filterSequence.toCharArray())

 		: null;

-

+		

 	// Flush the existing external files cache if this is the beginning of a build cycle

 	String projectName = this.currentProject.getName();

 	if (builtProjects == null || builtProjects.contains(projectName)) {

@@ -379,46 +370,6 @@
 	builtProjects.add(projectName);

 }

 

-private boolean isWorthBuilding() throws CoreException {

-//	boolean abortBuilds = JavaCore.ABORT.equals(JavaCore.getOptions().get(OPTION_InvalidClasspathSwitch));

-//	if (abortBuilds) {

-//		IMarker[] markers =

-//			currentProject.findMarkers(IJavaModelMarker.BUILDPATH_PROBLEM_MARKER, false, IResource.DEPTH_ONE);

-//		if (markers.length > 0) {

-//			if (DEBUG)

-//				System.out.println("Aborted build because project is involved in a cycle or has classpath problems"); //$NON-NLS-1$

-//

-//			// remove all existing class files... causes all dependent projects to do the same

-//			new BatchImageBuilder(this).scrubOutputFolder();

-//

-//			removeProblemsFor(currentProject); // make this the only problem for this project

-//			return false;

-//		}

-//	}

-//

-//	// make sure all prereq projects have valid build states

-//	IProject[] requiredProjects = getRequiredProjects();

-//	next : for (int i = 0, length = requiredProjects.length; i < length; i++) {

-//		IProject p = requiredProjects[i];

-//		if (getLastState(p) == null)  {

-//			if (!abortBuilds && !p.isOpen()) continue next; // skip closed projects if we're not aborting builds because of classpath problems

-//			if (DEBUG)

-//				System.out.println("Aborted build because prereq project " + p.getName() //$NON-NLS-1$

-//					+ " was not built"); //$NON-NLS-1$

-//

-//			// remove all existing class files... causes all dependent projects to do the same

-//			new BatchImageBuilder(this).scrubOutputFolder();

-//

-//			removeProblemsFor(currentProject); // make this the only problem for this project

-//			IMarker marker = currentProject.createMarker(ProblemMarkerTag);

-//			marker.setAttribute(IMarker.MESSAGE, Util.bind("build.prereqProjectWasNotBuilt", p.getName())); //$NON-NLS-1$

-//			marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);

-//			return false;

-//		}

-//	}

-	return true;

-}

-

 private void recordNewState(State state) {

 	Object[] keyTable = binaryResources.keyTable;

 	for (int i = 0, l = keyTable.length; i < l; i++) {