diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java
index 603ea60..d507c02 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/CheckMissingNaturesListener.java
@@ -10,7 +10,11 @@
  *******************************************************************************/
 package org.eclipse.core.internal.resources;
 
+import java.io.*;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.eclipse.core.internal.utils.FileUtil;
 import org.eclipse.core.internal.utils.Messages;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
@@ -145,7 +149,7 @@
 				}
 
 				final Set<IMarker> toRemove = new HashSet<>();
-				for (IMarker existingMarker : getRelatedMarkers(project)) {
+				for (IMarker existingMarker : getRelatedProjectMarkers(project)) {
 					String markerNature = existingMarker.getAttribute(NATURE_ID_ATTRIBUTE, ""); //$NON-NLS-1$
 					if (!missingNatures.contains(markerNature)) {
 						toRemove.add(existingMarker);
@@ -162,11 +166,18 @@
 							for (IMarker marker : toRemove) {
 								marker.delete();
 							}
+							IResource targetResource = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
+							if (!targetResource.isAccessible()) {
+								targetResource = project;
+							}
 							for (String natureId : missingNatures) {
-								IMarker marker = project.createMarker(MARKER_TYPE);
+								IMarker marker = targetResource.createMarker(MARKER_TYPE);
 								marker.setAttribute(IMarker.SEVERITY, getMissingNatureSeverity(project));
 								marker.setAttribute(IMarker.MESSAGE, NLS.bind(Messages.natures_missingNature, natureId));
 								marker.setAttribute(NATURE_ID_ATTRIBUTE, natureId);
+								if (targetResource.getType() == IResource.FILE) {
+									updateRange(marker, natureId, (IFile) targetResource);
+								}
 							}
 							return Status.OK_STATUS;
 						}
@@ -188,12 +199,54 @@
 		}
 	}
 
-	protected Collection<IMarker> getRelatedMarkers(IContainer workspaceRootOrProject) {
-		if (!workspaceRootOrProject.isAccessible()) {
+	protected void updateRange(IMarker marker, String natureId, IFile file) {
+		if (!file.isAccessible()) {
+			return;
+		}
+		Pattern pattern = Pattern.compile(".*<" + IModelObjectConstants.NATURE + ">\\s*(" + natureId.replace(".", "\\.") + ")\\s*</" + IModelObjectConstants.NATURE + ">.*", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+				Pattern.DOTALL);
+		try (InputStream input = file.getContents(); ByteArrayOutputStream output = new ByteArrayOutputStream();) {
+			FileUtil.transferStreams(input, output, file.getLocation().toString(), new NullProgressMonitor());
+			String content = output.toString();
+			Matcher matcher = pattern.matcher(content);
+			if (matcher.matches() && matcher.groupCount() > 0) {
+				marker.setAttribute(IMarker.CHAR_START, matcher.start(1));
+				marker.setAttribute(IMarker.CHAR_END, matcher.end(1) - 1);
+			}
+		} catch (IOException e) {
+			ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, e.getMessage(), e));
+		} catch (CoreException e) {
+			ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, e.getMessage(), e));
+		}
+	}
+
+	protected Collection<IMarker> getRelatedMarkers(IContainer rootOrProject) {
+		switch (rootOrProject.getType()) {
+			case IResource.ROOT :
+				return getRelatedRootMarkers((IWorkspaceRoot) rootOrProject);
+			case IResource.PROJECT :
+				return getRelatedProjectMarkers((IProject) rootOrProject);
+		}
+		return Collections.emptyList();
+	}
+
+	protected Collection<IMarker> getRelatedRootMarkers(IWorkspaceRoot root) {
+		if (!root.isAccessible()) {
+			return Collections.emptyList();
+		}
+		Set<IMarker> res = new HashSet<>();
+		for (IProject project : root.getProjects()) {
+			res.addAll(getRelatedProjectMarkers(project));
+		}
+		return res;
+	}
+
+	protected Collection<IMarker> getRelatedProjectMarkers(IProject project) {
+		if (!project.isAccessible()) {
 			return Collections.emptyList();
 		}
 		try {
-			return Arrays.asList(workspaceRootOrProject.findMarkers(MARKER_TYPE, true, workspaceRootOrProject.getType() == IResource.ROOT ? IResource.DEPTH_ONE : IResource.DEPTH_ZERO));
+			return Arrays.asList(project.findMarkers(MARKER_TYPE, true, IResource.DEPTH_ONE));
 		} catch (CoreException e) {
 			ResourcesPlugin.getPlugin().getLog().log(new Status(IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, e.getMessage(), e));
 			return Collections.emptyList();
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java
index 8cd0510..5521dea 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/PreferenceInitializer.java
@@ -11,6 +11,7 @@
  *******************************************************************************/
 package org.eclipse.core.internal.resources;
 
+import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.preferences.*;
 
@@ -41,11 +42,10 @@
 	public static final long PREF_DELTA_EXPIRATION_DEFAULT = 30 * 24 * 3600 * 1000l; // 30 days
 	/**
 	 * Default setting for {@value ResourcesPlugin#PREF_MISSING_NATURE_MARKER_SEVERITY}.
-	 * Currently -1/ignore, but very likely to change.
 	 *
 	 * @since 3.12
 	 */
-	public static final int PREF_MISSING_NATURE_MARKER_SEVERITY_DEFAULT = -1;
+	public static final int PREF_MISSING_NATURE_MARKER_SEVERITY_DEFAULT = IMarker.SEVERITY_WARNING;
 
 	public PreferenceInitializer() {
 		super();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java
index e7f99b2..8ea9f9d 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java
@@ -433,10 +433,39 @@
 		project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
 		project.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
 		Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor());
-		IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO);
+		IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE);
 		Assert.assertEquals(1, markers.length);
 		IMarker marker = markers[0];
 		Assert.assertEquals(NATURE_MISSING, marker.getAttribute("natureId"));
+		Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_START, -42));
+		Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_END, -42));
+		try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); InputStream input = ((IFile) marker.getResource()).getContents()) {
+			FileUtil.transferStreams(input, bos, "whatever", getMonitor());
+			String marked = bos.toString().substring(marker.getAttribute(IMarker.CHAR_START, -42), marker.getAttribute(IMarker.CHAR_END, -42) + 1);
+			Assert.assertEquals(NATURE_MISSING, marked);
+		}
+	}
+
+	public void testMissingNatureWithWhitespacesSetChars() throws Exception {
+		ensureExistsInWorkspace(project, true);
+		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, IMarker.SEVERITY_WARNING);
+		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush();
+		IFile dotProjectFile = project.getFile(IProjectDescription.DESCRIPTION_FILE_NAME);
+		dotProjectFile.setContents(new ByteArrayInputStream(("<projectDescription><name>" + project.getName() + "</name><natures><nature> " + NATURE_MISSING + "  </nature></natures></projectDescription>").getBytes()), false, false, getMonitor());
+		project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
+		project.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
+		Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor());
+		IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE);
+		Assert.assertEquals(1, markers.length);
+		IMarker marker = markers[0];
+		Assert.assertEquals(NATURE_MISSING, marker.getAttribute("natureId"));
+		Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_START, -42));
+		Assert.assertNotEquals(-42, marker.getAttribute(IMarker.CHAR_END, -42));
+		try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); InputStream input = ((IFile) marker.getResource()).getContents()) {
+			FileUtil.transferStreams(input, bos, "whatever", getMonitor());
+			String marked = bos.toString().substring(marker.getAttribute(IMarker.CHAR_START, -42), marker.getAttribute(IMarker.CHAR_END, -42) + 1);
+			Assert.assertEquals(NATURE_MISSING, marked);
+		}
 	}
 
 	public void testKnownNatureDoesntAddMarker() throws Exception {
@@ -449,7 +478,7 @@
 		project.refreshLocal(IResource.DEPTH_INFINITE, getMonitor());
 		project.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
 		Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor());
-		Assert.assertEquals(0, project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO).length);
+		Assert.assertEquals(0, project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE).length);
 	}
 
 	public void testListenToPreferenceChange() throws Exception {
@@ -458,20 +487,20 @@
 		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, IMarker.SEVERITY_INFO);
 		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush();
 		Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor());
-		IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO);
+		IMarker[] markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE);
 		Assert.assertEquals(1, markers.length);
 		Assert.assertEquals(IMarker.SEVERITY_INFO, markers[0].getAttribute(IMarker.SEVERITY, -42));
 		// to IGNORE
 		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, -1);
 		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush();
 		Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor());
-		markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO);
+		markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE);
 		Assert.assertEquals(0, markers.length);
 		// to ERROR
 		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).putInt(ResourcesPlugin.PREF_MISSING_NATURE_MARKER_SEVERITY, IMarker.SEVERITY_ERROR);
 		InstanceScope.INSTANCE.getNode(ResourcesPlugin.PI_RESOURCES).flush();
 		Job.getJobManager().join(CheckMissingNaturesListener.MARKER_TYPE, getMonitor());
-		markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ZERO);
+		markers = project.findMarkers(CheckMissingNaturesListener.MARKER_TYPE, false, IResource.DEPTH_ONE);
 		Assert.assertEquals(1, markers.length);
 		Assert.assertEquals(IMarker.SEVERITY_ERROR, markers[0].getAttribute(IMarker.SEVERITY, -42));
 	}
