validateNatureSet now reports all problems with the set
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java
index 3ed22d8..9dcf925 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/NatureManager.java
@@ -491,6 +491,8 @@
 	int count = natureIds.length;
 	if (count == 0)
 		return ResourceStatus.OK_STATUS;
+	String msg = Policy.bind("natures.invalidSet");
+	MultiStatus result = new MultiStatus(ResourcesPlugin.PI_RESOURCES, IResourceStatus.INVALID_NATURE_SET, msg, null);
 		
 	//set of the nature ids being validated (String (id))
 	HashSet natures = new HashSet(count * 2);
@@ -499,27 +501,31 @@
 	for (int i = 0; i < count; i++) {
 		String id = natureIds[i];
 		ProjectNatureDescriptor desc = (ProjectNatureDescriptor)getNatureDescriptor(id);
-		if (desc == null)
-			return failure(Policy.bind("natures.missingNature", id));
+		if (desc == null) {
+			result.add(failure(Policy.bind("natures.missingNature", id)));
+			continue;
+		}
 		if (desc.hasCycle) 
-			return failure(Policy.bind("natures.hasCycle", id));
+			result.add(failure(Policy.bind("natures.hasCycle", id)));
 		if (!natures.add(id))
-			return failure(Policy.bind("natures.duplicateNature", id));
+			result.add(failure(Policy.bind("natures.duplicateNature", id)));
 		//validate nature set one-of constraint
 		String[] setIds = desc.getNatureSetIds();
 		for (int j = 0; j < setIds.length; j++) {
 			if (!sets.add(setIds[j]))
-				return failure(Policy.bind("natures.multipleSetMembers", setIds[j]));
+				result.add(failure(Policy.bind("natures.multipleSetMembers", setIds[j])));
 		}
 	}
 	//now walk over the set and ensure all pre-requisite natures are present
 	for (int i = 0; i < count; i++) {
 		IProjectNatureDescriptor desc = getNatureDescriptor(natureIds[i]);
+		if (desc == null)
+			continue;
 		String[] required = desc.getRequiredNatureIds();
 		for (int j = 0; j < required.length; j++)
 			if (!natures.contains(required[j]))
-				return failure(Policy.bind("natures.missingPrerequisite", natureIds[i], required[j]));
+				result.add(failure(Policy.bind("natures.missingPrerequisite", natureIds[i], required[j])));
 	}
-	return ResourceStatus.OK_STATUS;
+	return result;
 }
 }
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties
index 08dc8fc..6a99228 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/utils/messages.properties
Binary files differ