diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/indexer/StandaloneIndexerInputAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/indexer/StandaloneIndexerInputAdapter.java
index a2d3c69ec45..c6371e4083a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/indexer/StandaloneIndexerInputAdapter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/indexer/StandaloneIndexerInputAdapter.java
@@ -66,6 +66,11 @@ public class StandaloneIndexerInputAdapter extends IndexerInputAdapter {
 		return isValidSourceUnitName((String) tu);
 	}
 	
+	@Override
+	public boolean isIndexedOnlyIfIncluded(Object tu) {
+		return false;
+	}
+
 	@Override
 	public boolean isSource(String filename) {
 		return isValidSourceUnitName(filename);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java
index 0fa422443ee..bd94edf2cc4 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java
@@ -172,6 +172,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
     private int fContentAssistLimit= -1;
 	private boolean fHandledCompletion= false;
 	private boolean fSplitShiftRightOperator= false;
+	private int fTokenCount= 0;
 
     // state information
     private final CharArrayMap<PreprocessorMacro> fMacroDictionary = new CharArrayMap<PreprocessorMacro>(512);
@@ -462,6 +463,9 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable {
     	if (t != null) {
     		fPrefetchedTokens= (Token) t.getNext();
     		t.setNext(null);
+    		if (++fTokenCount > 1000) {
+    			throw new OffsetLimitReachedException(0, t);
+    		}
     		return t;
     	}
     	
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java
index 44caaddfd82..65c3068efce 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/AbstractIndexerTask.java
@@ -53,7 +53,6 @@ import org.eclipse.cdt.internal.core.index.IndexBasedFileContentProvider;
 import org.eclipse.cdt.internal.core.parser.scanner.InternalFileContentProvider;
 import org.eclipse.cdt.internal.core.parser.scanner.StreamHasher;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
-import org.eclipse.cdt.internal.core.pdom.indexer.PotentialTranslationUnit;
 import org.eclipse.cdt.utils.EFSExtensionManager;
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
@@ -385,7 +384,7 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
 				continue;
 			
 			final IIndexFragmentFile[] indexFiles= fIndex.getWritableFiles(ifl);
-			if (!(tu instanceof PotentialTranslationUnit)) {
+			if (!fResolver.isIndexedOnlyIfIncluded(tu)) {
 				final boolean isSourceUnit= fResolver.isSourceUnit(tu);
 				final boolean isExcludedSource= isSourceUnit && !fIndexFilesWithoutConfiguration && !fResolver.isFileBuildConfigured(tu);
 
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexerInputAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexerInputAdapter.java
index e83b16a52db..4e20c6b6b50 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexerInputAdapter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/IndexerInputAdapter.java
@@ -49,6 +49,12 @@ public abstract class IndexerInputAdapter extends ASTFilePathResolver {
 	 */
 	public abstract boolean isFileBuildConfigured(Object tu);
 
+	/**
+	 * Returns whether the given translation-unit is not indexed unless it gets included.
+	 * This applies to files that are outside of a source root.
+	 */
+	public abstract boolean isIndexedOnlyIfIncluded(Object tu);
+
 	/**
 	 * Tests whether the file in the index is allowed to be part of an SDK. If not
 	 * it will be indexed.
@@ -69,7 +75,6 @@ public abstract class IndexerInputAdapter extends ASTFilePathResolver {
 	 * Returns a code reader for the given input file.
 	 */
 	public abstract FileContent getCodeReader(Object tu);
-
 	/**
 	 * Returns the encoding for the file.
 	 */
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java
index 142bb47444e..21860d2a47a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/ProjectIndexerInputAdapter.java
@@ -234,6 +234,11 @@ public class ProjectIndexerInputAdapter extends IndexerInputAdapter {
 		return !CoreModel.isScannerInformationEmpty(tu.getResource());
 	}
 
+	@Override
+	public boolean isIndexedOnlyIfIncluded(Object tu) {
+		return tu instanceof PotentialTranslationUnit;
+	}
+
 	@Override
 	public boolean isSourceUnit(Object tuo) {
 		ITranslationUnit tu= (ITranslationUnit) tuo;