From f5a4ba1d7638b16bde80c2f1086c78aa03af1f90 Mon Sep 17 00:00:00 2001
From: Markus Schorn <markus.schorn@windriver.com>
Date: Thu, 12 Oct 2006 13:23:56 +0000
Subject: [PATCH] Introduces an API to access the PDOM, bug 149565.

---
 .../pdomdepgen/PDOMDependencyCalculator.java  |  36 +-
 .../core/model/tests/CModelElementsTests.java |   2 +-
 .../cdt/core/model/tests/IIncludeTests.java   |   4 +-
 .../cdt/core/model/tests/IStructureTests.java |   6 +-
 .../model/tests/IntegratedCModelTest.java     |   6 +-
 .../tests/StructuralCModelElementsTests.java  |   5 +-
 .../model/tests/StructuralStructureTests.java |   6 +-
 .../core/parser/tests/ast2/DOMSearchUtil.java |   4 +-
 .../tests/ast2/DOMSelectionParseBaseTest.java |   3 +-
 .../cdt/internal/pdom/tests/ClassTests.java   |  16 +-
 .../internal/pdom/tests/EnumerationTests.java |  18 +-
 .../internal/pdom/tests/IncludesTests.java    |  13 +-
 .../cdt/internal/pdom/tests/TypesTests.java   |  14 +-
 .../org.eclipse.core.resources.prefs          |   4 +-
 .../.settings/org.eclipse.jdt.core.prefs      |   2 +-
 .../.settings/org.eclipse.jdt.ui.prefs        |   3 +
 .../cdt/core/browser/AllTypesCache.java       |  21 +-
 .../cdt/core/browser/PDOMTypeInfo.java        |   8 +-
 .../cdt/core/model/AbstractLanguage.java      |  33 ++
 .../org/eclipse/cdt/core/model/CoreModel.java |  10 +-
 .../org/eclipse/cdt/core/model/ILanguage.java |  43 +-
 .../cdt/core/model/ITranslationUnit.java      |  70 +++
 .../cdt/core/model/LanguageManager.java       | 158 +++++--
 .../core/model/ContentTypeProcessor.java      |  12 +-
 .../internal/core/model/TranslationUnit.java  | 220 ++++++---
 .../org/eclipse/cdt/core/dom/ILinkage.java    |  31 ++
 .../org/eclipse/cdt/core/dom/IName.java       |  20 +-
 .../org/eclipse/cdt/core/dom/IPDOM.java       |  78 +---
 .../eclipse/cdt/core/dom/IPDOMResolver.java   |  35 --
 .../eclipse/cdt/core/dom/ast/IASTName.java    |  13 +
 .../cdt/core/dom/ast/IASTTranslationUnit.java |   6 +-
 .../eclipse/cdt/core/dom/ast/IBinding.java    |   9 +
 .../org/eclipse/cdt/core/dom/ast/IScope.java  |  29 +-
 .../cdt/core/dom/ast/gnu/c/GCCLanguage.java   |  65 +--
 .../cdt/core/dom/ast/gnu/cpp/GPPLanguage.java |  66 +--
 .../org/eclipse/cdt/core/index/IIndex.java    | 278 ++++++++++++
 .../eclipse/cdt/core/index/IIndexBinding.java |  39 ++
 .../eclipse/cdt/core/index/IIndexFile.java    |  53 +++
 .../eclipse/cdt/core/index/IIndexInclude.java |  53 +++
 .../eclipse/cdt/core/index/IIndexLinkage.java |  31 ++
 .../eclipse/cdt/core/index/IIndexMacro.java   |  32 ++
 .../eclipse/cdt/core/index/IIndexManager.java |  70 +++
 .../eclipse/cdt/core/index/IIndexName.java    |  18 +-
 .../eclipse/cdt/core/index/IndexFilter.java   |  37 ++
 .../cdt/internal/core/dom/Linkage.java        |  29 ++
 .../internal/core/dom/parser/ASTInternal.java |  60 +++
 .../dom/parser/GCCBuiltinSymbolProvider.java  |  15 +-
 .../core/dom/parser/IASTInternalScope.java    |  47 ++
 .../core/dom/parser/ProblemBinding.java       |   8 +-
 .../core/dom/parser/c/CASTAmbiguity.java      |   6 +-
 .../internal/core/dom/parser/c/CASTName.java  |   6 +
 .../dom/parser/c/CASTTranslationUnit.java     |  26 +-
 .../core/dom/parser/c/CEnumeration.java       |   9 +-
 .../core/dom/parser/c/CEnumerator.java        |   8 +-
 .../core/dom/parser/c/CExternalVariable.java  |  10 +-
 .../internal/core/dom/parser/c/CFunction.java |  12 +-
 .../core/dom/parser/c/CKnRParameter.java      |   9 +-
 .../internal/core/dom/parser/c/CLabel.java    |   8 +-
 .../core/dom/parser/c/CParameter.java         |   9 +-
 .../internal/core/dom/parser/c/CScope.java    |   3 +-
 .../core/dom/parser/c/CStructure.java         |  20 +-
 .../internal/core/dom/parser/c/CTypedef.java  |   9 +-
 .../internal/core/dom/parser/c/CVariable.java |  11 +-
 .../internal/core/dom/parser/c/CVisitor.java  |  24 +-
 .../core/dom/parser/cpp/CPPASTAmbiguity.java  |   3 +-
 .../core/dom/parser/cpp/CPPASTName.java       |   3 +-
 .../core/dom/parser/cpp/CPPASTNode.java       |   7 +-
 .../dom/parser/cpp/CPPASTQualifiedName.java   |   4 +-
 .../dom/parser/cpp/CPPASTTranslationUnit.java |  26 +-
 .../core/dom/parser/cpp/CPPClassInstance.java |   4 +-
 .../dom/parser/cpp/CPPClassInstanceScope.java |  19 +-
 .../parser/cpp/CPPClassSpecialization.java    |   1 -
 .../core/dom/parser/cpp/CPPClassTemplate.java |   3 +-
 .../core/dom/parser/cpp/CPPClassType.java     |  15 +-
 .../dom/parser/cpp/CPPCompositeBinding.java   |   7 +
 .../core/dom/parser/cpp/CPPDelegate.java      |   7 +-
 .../core/dom/parser/cpp/CPPEnumeration.java   |   6 +
 .../core/dom/parser/cpp/CPPEnumerator.java    |   5 +
 .../core/dom/parser/cpp/CPPField.java         |   6 +-
 .../core/dom/parser/cpp/CPPFunction.java      |  12 +-
 .../dom/parser/cpp/CPPImplicitMethod.java     |   6 +-
 .../core/dom/parser/cpp/CPPLabel.java         |   8 +-
 .../core/dom/parser/cpp/CPPMethod.java        |   6 +-
 .../dom/parser/cpp/CPPMethodTemplate.java     |   6 +-
 .../core/dom/parser/cpp/CPPNamespace.java     |   8 +-
 .../dom/parser/cpp/CPPNamespaceAlias.java     |   9 +-
 .../core/dom/parser/cpp/CPPParameter.java     |   9 +-
 .../core/dom/parser/cpp/CPPScope.java         |  20 +-
 .../core/dom/parser/cpp/CPPSemantics.java     |  33 +-
 .../dom/parser/cpp/CPPSpecialization.java     |   9 +-
 .../dom/parser/cpp/CPPTemplateDefinition.java |   7 +
 .../dom/parser/cpp/CPPTemplateParameter.java  |   9 +-
 .../core/dom/parser/cpp/CPPTypedef.java       |   9 +-
 .../dom/parser/cpp/CPPUnknownBinding.java     |  10 +-
 .../core/dom/parser/cpp/CPPUnknownScope.java  |   3 +-
 .../dom/parser/cpp/CPPUsingDeclaration.java   |   8 +-
 .../core/dom/parser/cpp/CPPVariable.java      |   9 +-
 .../core/dom/parser/cpp/CPPVisitor.java       |   5 +-
 .../cdt/internal/core/index/CIndex.java       | 311 +++++++++++++
 .../cdt/internal/core/index/EmptyCIndex.java  | 100 +++++
 .../internal/core/index/IIndexFragment.java   | 137 ++++++
 .../core/index/IIndexFragmentBinding.java     |  18 +
 .../core/index/IIndexFragmentFile.java}       |  23 +-
 .../core/index/IIndexFragmentInclude.java     |  29 ++
 .../core/index/IIndexFragmentName.java        |  30 ++
 .../core/index/IIndexProxyBinding.java        |  28 ++
 .../internal/core/index/IWritableIndex.java   |  65 +++
 .../core/index/IWritableIndexFragment.java    |  62 +++
 .../core/index/IWritableIndexManager.java     |  22 +
 .../IndexBasedCodeReaderFactory.java}         | 112 +++--
 .../cdt/internal/core/index/Messages.java     |  26 ++
 .../internal/core/index/WritableCIndex.java   | 135 ++++++
 .../internal/core/index/messages.properties   |   1 +
 .../core/parser/scanner2/LocationMap.java     |   7 +
 .../core/parser/scanner2/MacroBinding.java    |   9 +-
 .../cdt/internal/core/pdom/Messages.java      |  26 ++
 .../eclipse/cdt/internal/core/pdom/PDOM.java  | 418 ++++++++++++------
 .../cdt/internal/core/pdom/PDOMManager.java   | 157 ++++++-
 .../cdt/internal/core/pdom/WritablePDOM.java  |  65 +++
 .../internal/core/pdom/dom/PDOMBinding.java   |  18 +-
 .../pdom/dom/PDOMBindingAdapterFactory.java   |  67 ---
 .../cdt/internal/core/pdom/dom/PDOMFile.java  |  97 ++--
 .../internal/core/pdom/dom/PDOMInclude.java   |  25 +-
 .../internal/core/pdom/dom/PDOMLinkage.java   |  61 ++-
 .../cdt/internal/core/pdom/dom/PDOMMacro.java |  56 ++-
 .../cdt/internal/core/pdom/dom/PDOMName.java  |  16 +-
 .../cdt/internal/core/pdom/dom/PDOMNode.java  |  13 +-
 .../core/pdom/dom/PDOMPointerType.java        |   5 +-
 .../core/pdom/dom/PDOMQualifierType.java      |   5 +-
 .../core/pdom/dom/c/PDOMCLinkage.java         |  39 +-
 .../core/pdom/dom/c/PDOMCStructure.java       |   6 +-
 .../core/pdom/dom/c/PDOMCTypedef.java         |   5 +-
 .../core/pdom/dom/cpp/PDOMCPPClassType.java   |  21 +-
 .../core/pdom/dom/cpp/PDOMCPPLinkage.java     | 100 ++---
 .../core/pdom/dom/cpp/PDOMCPPNamespace.java   |  19 +-
 .../core/pdom/dom/cpp/PDOMCPPParameter.java   |   5 +-
 .../core/pdom/dom/cpp/PDOMCPPTypedef.java     |   5 +-
 .../core/pdom/dom/cpp/PDOMCPPVariable.java    |   5 +-
 .../indexer/fast/PDOMFastHandleDelta.java     |  47 +-
 .../pdom/indexer/fast/PDOMFastIndexerJob.java |  85 ++--
 .../pdom/indexer/fast/PDOMFastReindex.java    |  12 +-
 .../indexer/full/PDOMFullHandleDelta.java     |  50 +--
 .../pdom/indexer/full/PDOMFullIndexerJob.java |  92 ++--
 .../pdom/indexer/full/PDOMFullReindex.java    |  10 +-
 .../pdom/indexer/nulli/PDOMNullIndexer.java   |  47 +-
 .../internal/core/pdom/messages.properties    |   1 +
 core/org.eclipse.cdt.core/plugin.xml          |   6 +
 .../org.eclipse.cdt.core/schema/language.exsd |  33 +-
 .../src/org/eclipse/cdt/core/CCorePlugin.java |  20 +
 .../eclipse/cdt/ui/tests/BaseTestCase.java    |  18 +-
 .../callhierarchy/BasicCallHierarchyTest.java |  14 +-
 .../BasicCppCallHierarchyTest.java            |  16 +-
 .../callhierarchy/CallHierarchyBaseTest.java  |  16 +-
 .../callhierarchy/CppCallHierarchyTest.java   | 106 +++++
 .../InitializersInCallHierarchyTest.java      |   2 +-
 .../selection/BaseSelectionTestsIndexer.java  |   4 +-
 .../selection/CPPSelectionTestsNoIndexer.java |   4 +-
 .../selection/CSelectionTestsNoIndexer.java   |   4 +-
 .../text/selection/ResolveBindingTests.java   |  92 ++--
 159 files changed, 3946 insertions(+), 1393 deletions(-)
 create mode 100644 core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.ui.prefs
 create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/AbstractLanguage.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ILinkage.java
 delete mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMResolver.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexLinkage.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexMacro.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexFilter.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/Linkage.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IASTInternalScope.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentBinding.java
 rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/{core/dom/IPDOMWriter.java => internal/core/index/IIndexFragmentFile.java} (52%)
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentInclude.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentName.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexProxyBinding.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexManager.java
 rename core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/{pdom/PDOMCodeReaderFactory.java => index/IndexBasedCodeReaderFactory.java} (58%)
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/Messages.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/messages.properties
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/Messages.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java
 delete mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBindingAdapterFactory.java
 create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties
 create mode 100644 core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java

diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java
index 3ea4c2a8c7b..f8772e7baab 100644
--- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java
+++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/pdomdepgen/PDOMDependencyCalculator.java
@@ -15,6 +15,10 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.core.index.IIndexInclude;
+import org.eclipse.cdt.core.index.IIndexManager;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
@@ -56,21 +60,29 @@ public class PDOMDependencyCalculator implements IManagedDependencyCalculator {
 			if (resource != null) {
 				ICProject project = CoreModel.getDefault().create(resource.getProject());
 				try {
-					PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
-					PDOMFile file = pdom.getFile(resource.getLocation());
-					if (file != null) {
-						PDOMFile[] includes = file.getAllIncludes();
-						
-						List/*<IPath>*/ list = new ArrayList/*<IPath>*/();
-						for (int i = 0; i < includes.length; ++i)
-							list.add(new Path(includes[i].getFileName().getString()));
-						
-						dependencies = (IPath[])list.toArray(new IPath[list.size()]);
-					} else
-						dependencies = new IPath[0];
+					IIndex index= CCorePlugin.getIndexManager().getIndex(project, IIndexManager.ADD_DEPENDENCIES);
+					index.acquireReadLock();
+					try {
+						IIndexFile file = index.getFile(resource.getLocation());
+						if (file != null) {
+							IIndexInclude[] includes = index.findIncludes(file, IIndex.DEPTH_INFINITE);
+
+							List/*<IPath>*/ list = new ArrayList/*<IPath>*/();
+							for (int i = 0; i < includes.length; ++i)
+								list.add(new Path(includes[i].getIncludesLocation()));
+
+							dependencies = (IPath[])list.toArray(new IPath[list.size()]);
+						} else
+							dependencies = new IPath[0];
+					}
+					finally {
+						index.releaseReadLock();
+					}
 				} catch (CoreException e) {
 //					Activator.getDefault().getLog().log(e.getStatus());
 					dependencies = new IPath[0];
+				} catch (InterruptedException e) {
+					dependencies = new IPath[0];
 				}
 			} else
 				dependencies = new IPath[0];
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
index cdc8a5510dc..06aea0f77ce 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
@@ -98,7 +98,7 @@ public class CModelElementsTests extends TestCase {
 		//ITranslationUnit included = (ITranslationUnit)CoreModel.getDefault().create(includedFile);
 
 		// parse the translation unit to get the elements tree		
-		tu.parse(); 
+//		tu.parse(); 
 		
 		// tu ---> include
 		checkInclude(tu);
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IIncludeTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IIncludeTests.java
index 517b7589559..ed979e83c7a 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IIncludeTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IIncludeTests.java
@@ -57,7 +57,7 @@ public class IIncludeTests extends IntegratedCModelTest {
 		return suite;
 	}		
 
-	public void testGetIncludeName()
+	public void testGetIncludeName() throws CModelException
 	{
 		ITranslationUnit tu = getTU();
 		IInclude[] theIncludes = null;
@@ -100,7 +100,7 @@ public class IIncludeTests extends IntegratedCModelTest {
 		
 	}
 	
-	public void testIsStandard()
+	public void testIsStandard() throws CModelException
 	{
 		ITranslationUnit tu = getTU();
 		IInclude[] theIncludes = null;
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IStructureTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IStructureTests.java
index 8478243f494..244c8596fef 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IStructureTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IStructureTests.java
@@ -318,7 +318,7 @@ public class IStructureTests extends IntegratedCModelTest {
 	}
 
 	// IInheritance
-	public void testGetBaseTypes() {
+	public void testGetBaseTypes() throws CModelException {
 		ITranslationUnit tu = getTU();
 		ICElement myElementDerived = null;
 		String[] myBaseTypes = null;
@@ -345,7 +345,7 @@ public class IStructureTests extends IntegratedCModelTest {
 	}
 
 	// IInheritance
-	public void testGetAccessControl() {
+	public void testGetAccessControl() throws CModelException {
 		ITranslationUnit tu = getTU();
 		ICElement myElementDerived = null;
 		String[] myBaseTypes = null;
@@ -390,7 +390,7 @@ public class IStructureTests extends IntegratedCModelTest {
 	// Language Specification Tests
 	//
 	
-	public void testAnonymousStructObject() {
+	public void testAnonymousStructObject() throws CModelException {
 		ITranslationUnit tu = getTU();
 		ICElement myElement = null;
 		try {
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java
index 362678c8aa5..c58672f6f37 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/IntegratedCModelTest.java
@@ -20,6 +20,7 @@ import java.io.FileNotFoundException;
 import junit.framework.TestCase;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.ITranslationUnit;
@@ -87,7 +88,7 @@ public abstract class IntegratedCModelTest extends TestCase {
 		CProjectHelper.delete(fCProject);
 	}	
 
-	protected ITranslationUnit getTU() {
+	protected ITranslationUnit getTU() throws CModelException {
 		ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(sourceFile);
 		if(isStructuralParse()) {
 			CCorePlugin.getDefault().setStructuralParseMode(true);
@@ -96,7 +97,8 @@ public abstract class IntegratedCModelTest extends TestCase {
 		}
 		// parse the translation unit to get the elements tree		
 		// Force the parsing now to do this in the right ParseMode.
-		tu.parse();
+		tu.close();
+		tu.open(new NullProgressMonitor());
 		CCorePlugin.getDefault().setStructuralParseMode(false);
 		return tu;
 	}
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralCModelElementsTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralCModelElementsTests.java
index 80fd8e20091..c89eef71179 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralCModelElementsTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralCModelElementsTests.java
@@ -96,13 +96,10 @@ public class StructuralCModelElementsTests extends TestCase {
 			
 	public void testCModelElements() throws CModelException{
 		ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(headerFile);
-		//ITranslationUnit included = (ITranslationUnit)CoreModel.getDefault().create(includedFile);
 		// turn on the structural parse mode
+		tu.close();
 		CCorePlugin.getDefault().setStructuralParseMode(true);
 		
-		// parse the translation unit to get the elements tree		
-		tu.parse(); 
-		
 		// tu ---> include
 		checkInclude(tu);
 		
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralStructureTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralStructureTests.java
index e05617808ba..205bf85bab6 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralStructureTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/StructuralStructureTests.java
@@ -54,21 +54,21 @@ public class StructuralStructureTests extends IStructureTests {
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.tests.IStructureTests#testAnonymousStructObject()
 	 */
-	public void testAnonymousStructObject() {
+	public void testAnonymousStructObject() throws CModelException {
 		setStructuralParse(true);
 		super.testAnonymousStructObject();
 	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.tests.IStructureTests#testGetAccessControl()
 	 */
-	public void testGetAccessControl() {
+	public void testGetAccessControl() throws CModelException {
 		setStructuralParse(true);
 		super.testGetAccessControl();
 	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.tests.IStructureTests#testGetBaseTypes()
 	 */
-	public void testGetBaseTypes() {
+	public void testGetBaseTypes() throws CModelException {
 		setStructuralParse(true);
 		super.testGetBaseTypes();
 	}
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSearchUtil.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSearchUtil.java
index 7eda50efc02..4f1f64bbb56 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSearchUtil.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSearchUtil.java
@@ -27,9 +27,9 @@ import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
+import org.eclipse.cdt.core.index.IIndexBinding;
 import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IPath;
@@ -162,7 +162,7 @@ public class DOMSearchUtil {
 		}
 		
 		IBinding binding = searchName.resolveBinding();
-		if (binding instanceof PDOMBinding) {
+		if (binding instanceof IIndexBinding) {
 			Assert.fail("Not implemented");
 //			try { 
 //				ArrayList pdomNames = new ArrayList();
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseBaseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseBaseTest.java
index 155017cba32..d39ce83ff50 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseBaseTest.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMSelectionParseBaseTest.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * IBM Rational Software - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.core.parser.tests.ast2;
 
@@ -39,7 +40,7 @@ public class DOMSelectionParseBaseTest extends DOMFileBasePluginTest {
 	
 	protected IASTNode parse(IFile file, int offset1, int offset2, boolean expectedToPass) throws Exception {
 		ITranslationUnit tu = (ITranslationUnit)CCorePlugin.getDefault().getCoreModel().create(file);
-		IASTTranslationUnit ast = tu.getLanguage().getASTTranslationUnit(tu, 0);
+		IASTTranslationUnit ast = tu.getAST();
 		IASTName[] names = tu.getLanguage().getSelectedNames(ast, offset1, offset2 - offset1);
 		
 		if (!expectedToPass) return null;
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/ClassTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/ClassTests.java
index c87e55a0ee9..483745e404d 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/ClassTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/ClassTests.java
@@ -22,6 +22,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IndexFilter;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.core.runtime.NullProgressMonitor;
@@ -47,21 +49,21 @@ public class ClassTests extends PDOMTestBase {
 	}
 	
 	public void test1() throws Exception {
-		IBinding[] Bs = pdom.findBindings(Pattern.compile("B"), new NullProgressMonitor());
+		IBinding[] Bs = pdom.findBindings(Pattern.compile("B"), false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, Bs.length);
 		ICPPClassType B = (ICPPClassType)Bs[0];
 		ICPPMethod[] Bmethods = B.getAllDeclaredMethods();
 		assertEquals(1, Bmethods.length);
 		ICPPMethod Bf = Bmethods[0];
 		assertEquals("f", Bf.getName());
-		IName [] Bf_refs = pdom.getReferences(Bf);
+		IName [] Bf_refs = pdom.findNames(Bf, IIndex.FIND_REFERENCES);
 		assertEquals(1, Bf_refs.length);
 		IASTFileLocation loc = Bf_refs[0].getFileLocation();
 		assertEquals(offset("class.cpp", "b.f()") + 2, loc.getNodeOffset());
 	}
 	
 	public void testNested() throws Exception {
-		IBinding[] bindings = pdom.findBindings(Pattern.compile("NestedA"), new NullProgressMonitor());
+		IBinding[] bindings = pdom.findBindings(Pattern.compile("NestedA"), false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, bindings.length);
 		ICPPClassType NestedA = (ICPPClassType)bindings[0];
 		ICPPClassType[] nested = NestedA.getNestedClasses();
@@ -72,24 +74,24 @@ public class ClassTests extends PDOMTestBase {
 		assertEquals(1, fields.length);
 		IField NestedB_x = fields[0];
 		
-		IName[] refs = pdom.getReferences(NestedB);
+		IName[] refs = pdom.findNames(NestedB, IIndex.FIND_REFERENCES);
 		assertEquals(1, refs.length);
 		IASTFileLocation loc = refs[0].getFileLocation();
 		assertEquals(offset("nested.cpp", "::NestedB") + 2, loc.getNodeOffset());
 		
-		refs = pdom.getReferences(NestedB_x);
+		refs = pdom.findNames(NestedB_x, IIndex.FIND_REFERENCES);
 		assertEquals(1, refs.length);
 		loc = refs[0].getFileLocation();
 		assertEquals(offset("nested.cpp", "x.x") + 2, loc.getNodeOffset());
 	}
 	
 	public void failedTest147903() throws Exception {
-		IBinding[] bindings = pdom.findBindings(Pattern.compile("pr147903"), new NullProgressMonitor());
+		IBinding[] bindings = pdom.findBindings(Pattern.compile("pr147903"), false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, bindings.length);
 		ICPPNamespaceScope ns = ((ICPPNamespace)bindings[0]).getNamespaceScope();
 		bindings = ns.find("testRef");
 		assertEquals(1, bindings.length);
-		IName[] refs = pdom.getReferences(bindings[0]);
+		IName[] refs = pdom.findNames(bindings[0], IIndex.FIND_REFERENCES);
 		for (int i = 0; i < refs.length; ++i)
 			System.out.println(refs[i].getFileLocation().getNodeOffset());
 		assertEquals(5, refs.length);
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/EnumerationTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/EnumerationTests.java
index a9bb4f2f979..35744e3b886 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/EnumerationTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/EnumerationTests.java
@@ -19,6 +19,8 @@ import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
 import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IEnumeration;
 import org.eclipse.cdt.core.dom.ast.IEnumerator;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IndexFilter;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.core.runtime.NullProgressMonitor;
@@ -46,7 +48,7 @@ public class EnumerationTests extends PDOMTestBase {
 	public void testC() throws Exception {
 		// Check bindings
 		Pattern pattern = Pattern.compile("TestCEnum");
-		IBinding[] bindings = pdom.findBindings(pattern, new NullProgressMonitor());
+		IBinding[] bindings = pdom.findBindings(pattern, false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, bindings.length);
 		IEnumeration enumeration = (IEnumeration)bindings[0];
 		assertEquals("TestCEnum", enumeration.getName());
@@ -57,19 +59,19 @@ public class EnumerationTests extends PDOMTestBase {
 		assertEquals("cc", enumerators[2].getName());
 		
 		// Declaration of TestEnum 
-		IName[] enumDecls = pdom.getDeclarations(enumeration);
+		IName[] enumDecls = pdom.findNames(enumeration, IIndex.FIND_DECLARATIONS_DEFINITIONS);
 		assertEquals(1, enumDecls.length);
 		IASTFileLocation loc = enumDecls[0].getFileLocation();
 		assertEquals(5, loc.getNodeOffset());
 		
 		// Reference to TestEnum
-		IName[] enumRefs = pdom.getReferences(enumeration);
+		IName[] enumRefs = pdom.findNames(enumeration, IIndex.FIND_REFERENCES);
 		assertEquals(1, enumRefs.length);
 		loc = enumRefs[0].getFileLocation();
 		assertEquals(offset("enumTest.c", "TestCEnum test"), loc.getNodeOffset());
 		
 		// Reference to a
-		IName[] aRefs = pdom.getReferences(enumerators[0]);
+		IName[] aRefs = pdom.findNames(enumerators[0], IIndex.FIND_REFERENCES);
 		assertEquals(1, aRefs.length);
 		loc = aRefs[0].getFileLocation();
 		assertEquals(offset("enumTest.c", "ca;"), loc.getNodeOffset());
@@ -78,7 +80,7 @@ public class EnumerationTests extends PDOMTestBase {
 	public void testCPP() throws Exception {
 		// Check bindings
 		Pattern pattern = Pattern.compile("TestCPPEnum");
-		IBinding[] bindings = pdom.findBindings(pattern, new NullProgressMonitor());
+		IBinding[] bindings = pdom.findBindings(pattern, false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, bindings.length);
 		IEnumeration enumeration = (IEnumeration)bindings[0];
 		assertEquals("TestCPPEnum", enumeration.getName());
@@ -89,19 +91,19 @@ public class EnumerationTests extends PDOMTestBase {
 		assertEquals("cppc", enumerators[2].getName());
 		
 		// Declaration of TestEnum 
-		IName[] enumDecls = pdom.getDeclarations(enumeration);
+		IName[] enumDecls = pdom.findNames(enumeration, IIndex.FIND_DECLARATIONS_DEFINITIONS);
 		assertEquals(1, enumDecls.length);
 		IASTFileLocation loc = enumDecls[0].getFileLocation();
 		assertEquals(5, loc.getNodeOffset());
 		
 		// Reference to TestEnum
-		IName[] enumRefs = pdom.getReferences(enumeration);
+		IName[] enumRefs = pdom.findNames(enumeration, IIndex.FIND_REFERENCES);
 		assertEquals(1, enumRefs.length);
 		loc = enumRefs[0].getFileLocation();
 		assertEquals(offset("enumTest.cpp", "TestCPPEnum test"), loc.getNodeOffset());
 		
 		// Reference to a
-		IName[] aRefs = pdom.getReferences(enumerators[0]);
+		IName[] aRefs = pdom.findNames(enumerators[0], IIndex.FIND_REFERENCES);
 		assertEquals(1, aRefs.length);
 		loc = aRefs[0].getFileLocation();
 		assertEquals(offset("enumTest.cpp", "cppa;"), loc.getNodeOffset());
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java
index 129cdccdbfa..6c46037a8a6 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/IncludesTests.java
@@ -11,9 +11,10 @@
 package org.eclipse.cdt.internal.pdom.tests;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.core.index.IIndexInclude;
 import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
 import org.eclipse.core.runtime.IPath;
 
 /**
@@ -23,12 +24,12 @@ import org.eclipse.core.runtime.IPath;
 public class IncludesTests extends PDOMTestBase {
 
 	protected ICProject project;
-	protected PDOM pdom;
+	protected IIndex pdom;
 
 	protected void setUp() throws Exception {
 		if (pdom == null) {
 			project = createProject("includesTests");
-			pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
+			pdom = CCorePlugin.getIndexManager().getIndex(project);
 		}
 		pdom.acquireReadLock();
 	}
@@ -39,9 +40,9 @@ public class IncludesTests extends PDOMTestBase {
 	
 	public void test1() throws Exception {
 		IPath loc = project.getProject().getLocation().append("I2.h");
-		PDOMFile file = pdom.getFile(loc.toOSString());
+		IIndexFile file = pdom.getFile(loc);
 		assertNotNull(file);
-		PDOMFile[] allIncludedBy = file.getAllIncludedBy();
+		IIndexInclude[] allIncludedBy = pdom.findIncludedBy(file, -1);
 		assertEquals(9, allIncludedBy.length); // i.e. all of them
 	}
 
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/TypesTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/TypesTests.java
index 73bdb6ea212..c902d4af982 100644
--- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/TypesTests.java
+++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/TypesTests.java
@@ -22,6 +22,8 @@ import org.eclipse.cdt.core.dom.ast.IField;
 import org.eclipse.cdt.core.dom.ast.ITypedef;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IndexFilter;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.core.runtime.NullProgressMonitor;
@@ -48,7 +50,7 @@ public class TypesTests extends PDOMTestBase {
 	
 	public void testC() throws Exception {
 		// Get the binding for A::f
-		IBinding [] CAs = pdom.findBindings(Pattern.compile("CA"), new NullProgressMonitor());
+		IBinding [] CAs = pdom.findBindings(Pattern.compile("CA"), false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, CAs.length);
 		ICompositeType CA = (ICompositeType)CAs[0];
 		IField [] CAfields = CA.getFields();
@@ -57,7 +59,7 @@ public class TypesTests extends PDOMTestBase {
 		assertEquals("x", x.getName());
 		
 		// Make sure that there is a reference in g();
-		IName[] xRefs = pdom.getReferences(x);
+		IName[] xRefs = pdom.findNames(x, IIndex.FIND_REFERENCES);
 		assertEquals(1, xRefs.length);
 		IASTFileLocation loc = xRefs[0].getFileLocation();
 		assertEquals(offset("typedef.c", "x->x") + 3, loc.getNodeOffset());
@@ -65,7 +67,7 @@ public class TypesTests extends PDOMTestBase {
 
 	public void testCPP() throws Exception {
 		// Get the binding for A::f
-		IBinding [] As = pdom.findBindings(Pattern.compile("A"), new NullProgressMonitor());
+		IBinding [] As = pdom.findBindings(Pattern.compile("A"), false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, As.length);
 		ICPPClassType A = (ICPPClassType)As[0];
 		ICPPMethod[] Amethods = A.getMethods();
@@ -74,17 +76,17 @@ public class TypesTests extends PDOMTestBase {
 		assertEquals("f", f.getName());
 		
 		// Make sure that there is a reference in g();
-		IName[] fRefs = pdom.getReferences(f);
+		IName[] fRefs = pdom.findNames(f, IIndex.FIND_REFERENCES);
 		assertEquals(1, fRefs.length);
 		IASTFileLocation loc = fRefs[0].getFileLocation();
 		assertEquals(offset("typedef.cpp", "x->f") + 3, loc.getNodeOffset());
 	}
 	
 	public void test145351() throws Exception {
-		IBinding [] bindings = pdom.findBindings(Pattern.compile("spinlock_t"), new NullProgressMonitor());
+		IBinding [] bindings = pdom.findBindings(Pattern.compile("spinlock_t"), false, new IndexFilter(), new NullProgressMonitor());
 		assertEquals(1, bindings.length);
 		ITypedef spinlock_t = (ITypedef)bindings[0];
-		IName [] refs = pdom.getReferences(spinlock_t);
+		IName [] refs = pdom.findNames(spinlock_t, IIndex.FIND_REFERENCES);
 		assertEquals(1, refs.length);
 		IASTFileLocation loc = refs[0].getFileLocation();
 		assertEquals(offset("bug145351.c", "spinlock_t global_bh_lock"), loc.getNodeOffset());
diff --git a/core/org.eclipse.cdt.core/.settings/org.eclipse.core.resources.prefs b/core/org.eclipse.cdt.core/.settings/org.eclipse.core.resources.prefs
index 280c26f4231..6661dc065ec 100644
--- a/core/org.eclipse.cdt.core/.settings/org.eclipse.core.resources.prefs
+++ b/core/org.eclipse.cdt.core/.settings/org.eclipse.core.resources.prefs
@@ -1,3 +1,5 @@
-#Mon Oct 09 11:18:42 BST 2006
+#Tue Oct 10 16:32:29 CEST 2006
 eclipse.preferences.version=1
+encoding//parser/org/eclipse/cdt/internal/core/index/messages.properties=8859_1
 encoding//parser/org/eclipse/cdt/internal/core/pdom/db/messages.properties=8859_1
+encoding//parser/org/eclipse/cdt/internal/core/pdom/messages.properties=8859_1
diff --git a/core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.core.prefs b/core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.core.prefs
index 3d903cccc77..c67af907127 100644
--- a/core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.core.prefs
+++ b/core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Mon Jul 03 19:51:10 CEST 2006
+#Thu Oct 05 16:52:57 CEST 2006
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4
diff --git a/core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.ui.prefs b/core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..90e5beb6a4b
--- /dev/null
+++ b/core/org.eclipse.cdt.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Thu Oct 05 16:52:57 CEST 2006
+eclipse.preferences.version=1
+internal.default.compliance=user
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java
index 7c8d9d8eb72..fb219474e54 100644
--- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java
+++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java
@@ -14,17 +14,17 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.IPDOMManager;
 import org.eclipse.cdt.core.dom.IPDOMNode;
 import org.eclipse.cdt.core.dom.IPDOMVisitor;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.dom.ast.ICompositeType;
 import org.eclipse.cdt.core.dom.ast.IEnumeration;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias;
-import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
-import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICProject;
@@ -120,12 +120,12 @@ public class AllTypesCache {
 					return;
 				case ICElement.C_STRUCT:
 					if (node instanceof ICPPClassType
-							&& ((ICPPClassType)node).getKey() == ICPPClassType.k_struct)
+							&& ((ICPPClassType)node).getKey() == ICompositeType.k_struct)
 						types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project));
 					return;
 				case ICElement.C_UNION:
 					if (node instanceof ICPPClassType
-							&& ((ICPPClassType)node).getKey() == ICPPClassType.k_union)
+							&& ((ICPPClassType)node).getKey() == ICompositeType.k_union)
 						types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project));
 					return;
 				case ICElement.C_ENUMERATION:
@@ -152,10 +152,15 @@ public class AllTypesCache {
 			CPPTypesCollector cppCollector = new CPPTypesCollector(kinds, types, project);
 				
 			PDOM pdom = (PDOM)pdomManager.getPDOM(project);
-			PDOMLinkage cLinkage = pdom.getLinkage(GCCLanguage.getDefault());
-			cLinkage.accept(cCollector);
-			PDOMLinkage cppLinkage = pdom.getLinkage(GPPLanguage.getDefault());
-			cppLinkage.accept(cppCollector);
+			PDOMLinkage linkage= pdom.getLinkage(ILinkage.C_LINKAGE_ID);
+			if (linkage != null) {
+				linkage.accept(cCollector);
+			}
+			
+			linkage= pdom.getLinkage(ILinkage.CPP_LINKAGE_ID);
+			if (linkage != null) {
+				linkage.accept(cppCollector);
+			}
 		}
 			
 		return (ITypeInfo[])types.toArray(new ITypeInfo[types.size()]);
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java
index 43bb79df5bb..4f92ab2aefd 100644
--- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java
+++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java
@@ -15,13 +15,14 @@ package org.eclipse.cdt.core.browser;
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.IName;
 import org.eclipse.cdt.core.dom.IPDOM;
-import org.eclipse.cdt.core.dom.IPDOMResolver;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
+import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
 import org.eclipse.core.runtime.CoreException;
 
@@ -120,9 +121,8 @@ public class PDOMTypeInfo implements ITypeInfo {
 
 	public ITypeReference getResolvedReference() {
 		try {
-			IPDOM pdom = CCorePlugin.getPDOMManager().getPDOM(project);
-			IPDOMResolver resolver = (IPDOMResolver) pdom.getAdapter(IPDOMResolver.class);
-			IName[] names= resolver.getDefinitions(binding);
+			PDOM pdom = (PDOM) CCorePlugin.getPDOMManager().getPDOM(project);
+			IName[] names= pdom.findNames(binding, IIndex.FIND_DEFINITIONS);
 			return names != null && names.length > 0 ? new PDOMTypeReference(names[0], project) : null;
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/AbstractLanguage.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/AbstractLanguage.java
new file mode 100644
index 00000000000..c6bba004cb2
--- /dev/null
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/AbstractLanguage.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.model;
+
+import org.eclipse.cdt.core.dom.ICodeReaderFactory;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.PlatformObject;
+
+/**
+ * Models the differences between various languages.
+ * @since 4.0
+ */
+public abstract class AbstractLanguage extends PlatformObject implements ILanguage {
+	
+	final public IASTTranslationUnit getASTTranslationUnit(ITranslationUnit file, int style) throws CoreException {
+		throw new UnsupportedOperationException();
+	}
+
+	final public IASTTranslationUnit getASTTranslationUnit(ITranslationUnit file, ICodeReaderFactory codeReaderFactory,
+			int style) throws CoreException {
+		throw new UnsupportedOperationException();
+	}
+}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java
index 7c3713ec083..17fae237536 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java
@@ -326,14 +326,8 @@ public class CoreModel {
 	 */
 	public static String getRegistedContentTypeId(IProject project, String name) {
 		IContentType contentType = CCorePlugin.getContentType(project, name);
-		if (contentType != null) {
-			String id = contentType.getId();
-			String[] ids = getRegistedContentTypeIds();
-			for (int i = 0; i < ids.length; i++) {
-				if (ids[i].equals(id)) {
-					return id;
-				}
-			}
+		if (contentType != null && LanguageManager.getInstance().getLanguage(contentType) != null) {
+			return contentType.getId();
 		}
 		return null;
 	}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILanguage.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILanguage.java
index 2a6f2ebac03..2d3a1042c6f 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILanguage.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILanguage.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.core.model;
@@ -15,12 +16,16 @@ import org.eclipse.cdt.core.dom.ICodeReaderFactory;
 import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.parser.CodeReader;
+import org.eclipse.cdt.core.parser.IScannerInfo;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
 
 /**
+ * Models differences between languages. The interace is not supposed to be implemented directly.
+ * Rather than that clients may subclass {@link AbstractLanguage}.
  * @author Doug Schaefer
- *
  */
 public interface ILanguage extends IAdaptable {
 
@@ -28,31 +33,27 @@ public interface ILanguage extends IAdaptable {
 	public static final String KEY = "language"; //$NON-NLS-1$
 
 	/**
-	 * Style for getTranslationUnit. Use the index for resolving bindings that aren't
-	 * found in the AST.
+	 * @deprecated has no effect.
 	 */
 	public static final int AST_USE_INDEX = 1;
 
 	/**
-	 * Style for getTranslationUnit. Don't parse header files. It's a good idea to
-	 * turn on AST_USE_INDEX when you do this.
+	 * @deprecated use {@link ITranslationUnit#AST_SKIP_ALL_HEADERS}
 	 */
-	public static final int AST_SKIP_ALL_HEADERS = 2;
+	public static final int AST_SKIP_ALL_HEADERS = ITranslationUnit.AST_SKIP_ALL_HEADERS;
 
 	/**
-	 * Style for getTranslationUnit. Used by the indexer to skip over headers it
-	 * already has indexed.
+	 * @deprecated use {@link ITranslationUnit#AST_SKIP_INDEXED_HEADERS}
 	 */
-	public static final int AST_SKIP_INDEXED_HEADERS = 4;
+	public static final int AST_SKIP_INDEXED_HEADERS = ITranslationUnit.AST_SKIP_INDEXED_HEADERS;
 
 	/**
-	 * Style for getTranslationUnit. Don't parse the file if there is no build
-	 * information for it.
+	 * @deprecated use {@link ITranslationUnit#AST_SKIP_IF_NO_BUILD_INFO}
 	 */
-	public static final int AST_SKIP_IF_NO_BUILD_INFO = 8;
+	public static final int AST_SKIP_IF_NO_BUILD_INFO = ITranslationUnit.AST_SKIP_IF_NO_BUILD_INFO;
 	
 	/**
-	 * Return the language id for this language in the given PDOM.
+	 * Return the language id for this language.
 	 * This is to differentiate languages from eachother.
 	 * 
 	 * @return language id
@@ -60,23 +61,14 @@ public interface ILanguage extends IAdaptable {
 	public String getId();
 
 	/**
-	 * Create the AST for the given file with the given style.
-	 * 
-	 * @param file
-	 * @param style
-	 * @return
+	 * @deprecated use {@link ITranslationUnit#getAST()}.
 	 */
 	public IASTTranslationUnit getASTTranslationUnit(
 			ITranslationUnit file,
 			int style) throws CoreException;
 
 	/**
-	 * Create the AST for the given file with the given style with a given
-	 * code reader factory.
-	 * 
-	 * @param file
-	 * @param style
-	 * @return
+	 * @deprecated use {@link ITranslationUnit#getAST(...)}.
 	 */
 	public IASTTranslationUnit getASTTranslationUnit(
 			ITranslationUnit file,
@@ -114,4 +106,7 @@ public interface ILanguage extends IAdaptable {
 	 *         to parse using the default CDT model builder
 	 */
 	public IContributedModelBuilder createModelBuilder(ITranslationUnit tu);
+
+	// mstodo javadoc
+	public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo, ICodeReaderFactory fileCreator, IIndex index) throws CoreException;
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITranslationUnit.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITranslationUnit.java
index 78e914b1b01..95d06778e53 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITranslationUnit.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITranslationUnit.java
@@ -7,13 +7,19 @@
  *
  * Contributors:
  *     QNX Software Systems - Initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.core.model;
 
 import java.util.Map;
 
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.parser.CodeReader;
+import org.eclipse.cdt.core.parser.IScannerInfo;
 import org.eclipse.cdt.internal.core.model.IBufferFactory;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 /**
  * Represents an entire C translation unit (<code>.c</code> source file).
@@ -25,6 +31,23 @@ import org.eclipse.core.runtime.IProgressMonitor;
  * the case.
  */
 public interface ITranslationUnit extends ICElement, IParent, IOpenable, ISourceReference, ISourceManipulation {
+	
+	/**
+	 * Style for {@link #getAST(IIndex, int)}. Don't parse header files. 
+	 */
+	public static final int AST_SKIP_ALL_HEADERS = 2;
+
+	/**
+	 * Style for {@link #getAST(IIndex, int)}. Skips over headers that are found in the index.
+	 */
+	public static final int AST_SKIP_INDEXED_HEADERS = 4;
+
+	/**
+	 * Style for {@link #getAST(IIndex, int)}. Don't parse the file if there is no build
+	 * information for it.
+	 */
+	public static final int AST_SKIP_IF_NO_BUILD_INFO = 8;
+
 	/**
 	 * Creates and returns an include declaration in this translation unit
 	 * with the given name.
@@ -386,4 +409,51 @@ public interface ITranslationUnit extends ICElement, IParent, IOpenable, ISource
 	 * 
 	 */
 	public void setIsStructureKnown(boolean wasSuccessful);
+	
+	/**
+	 * Returns the absolute path of the location of the translation unit. May be <code>null</code>, in 
+	 * case the location does not exist.
+	 * @return an absolute path to the location, or <code>null</code>
+	 * @since 4.0
+	 */
+	public IPath getLocation();
+
+	/**
+	 * Returns the code reader that can be used to parse the translation unit. If the translation unit is a 
+	 * working copy the reader will read from the buffer.
+	 * @return a code reader for parsing the translation unit
+	 * @since 4.0
+	 */
+	public CodeReader getCodeReader();
+
+	/**
+	 * Returns the scanner info associated with this translation unit. May return <code>null</code> if no 
+	 * configuration is available.
+	 * @param force if <code>true</code> a default info is returned, even if nothing is configured for this
+	 * translation unit
+	 * @return a scanner info for parsing the translation unit or <code>null</code> if none is configured
+	 * @since 4.0
+	 */
+	public IScannerInfo getScannerInfo(boolean force);
+
+	/**
+	 * Creates the full AST for this translation unit. May return <code>null</code> if the language of this
+	 * translation unit does not support ASTs.
+	 * @return the AST for the translation unit or <code>null</code>
+	 * @throws CoreException
+	 * @since 4.0
+	 */
+	public IASTTranslationUnit getAST() throws CoreException;
+
+	/**
+	 * Creates an AST based on the requested style. May return <code>null</code> if the language of this
+	 * translation unit does not support ASTs.
+	 * @param index	index to back up the parsing of the AST, may be <code>null</code>
+	 * @param style <code>0</code> or a combination of {@link #AST_SKIP_ALL_HEADERS}, 
+	 * {@link #AST_SKIP_IF_NO_BUILD_INFO} and {@link #AST_SKIP_INDEXED_HEADERS}
+	 * @return the AST requested or <code>null</code>
+	 * @throws CoreException
+	 * @since 4.0
+	 */
+	public IASTTranslationUnit getAST(IIndex index, int style) throws CoreException;
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java
index 92581df6216..182ede2c1ca 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java
@@ -19,12 +19,16 @@ import java.util.Map;
 import java.util.Set;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.internal.core.model.TranslationUnit;
+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.ISafeRunnable;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.SafeRunner;
 import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.core.runtime.content.IContentTypeManager;
 
@@ -33,9 +37,18 @@ import org.eclipse.core.runtime.content.IContentTypeManager;
  *
  */
 public class LanguageManager {
-
+	private static final String NAMESPACE_SEPARATOR = "."; //$NON-NLS-1$
+	private static final String LANGUAGE_EXTENSION_POINT_ID = "org.eclipse.cdt.core.language"; //$NON-NLS-1$
+	private static final String ELEMENT_LANGUAGE = "language"; //$NON-NLS-1$
+	private static final String ELEMENT_CONTENT_TYPE = "contentType"; //$NON-NLS-1$
+	private static final String ELEMENT_PDOM_LINKAGE_FACTORY = "pdomLinkageFactory"; //$NON-NLS-1$
+	private static final String ATTRIBUTE_CLASS = "class"; //$NON-NLS-1$
+	private static final String ATTRIBUTE_ID = "id"; //$NON-NLS-1$
+	
 	private static LanguageManager instance;
-	private Map cache = new HashMap();
+	private Map fLanguageCache = new HashMap();
+	private Map fPDOMLinkageFactoryCache= new HashMap();
+	private Map fContentTypeToLanguageCache= new HashMap();
 	
 	public static LanguageManager getInstance() {
 		if (instance == null)
@@ -43,48 +56,69 @@ public class LanguageManager {
 		return instance;
 	}
 	
-	public ILanguage getLanguage(String id) throws CoreException {
-		ILanguage language = (ILanguage)cache.get(id);
+	public ILanguage getLanguage(String id) {
+		ILanguage language = (ILanguage)fLanguageCache.get(id);
 		if (language != null)
 			return language;
 
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, ILanguage.KEY);
-		IExtension[] extensions = point.getExtensions();
-		for (int i = 0; i < extensions.length; ++i) {
-			IExtension extension = extensions[i];
-			IConfigurationElement[] languages = extension.getConfigurationElements();
-			for (int j = 0; j < languages.length; ++j) {
-				IConfigurationElement languageElem = languages[j];
-				String langId = extension.getNamespaceIdentifier() + "." + languageElem.getAttribute("id"); //$NON-NLS-1$ //$NON-NLS-2$ $NON-NLS-2$
+		IConfigurationElement[] configs= Platform.getExtensionRegistry().getConfigurationElementsFor(LANGUAGE_EXTENSION_POINT_ID);
+		for (int j = 0; j < configs.length; ++j) {
+			final IConfigurationElement languageElem = configs[j];
+			if (ELEMENT_LANGUAGE.equals(languageElem.getName())) {
+				String langId = getLanguageID(languageElem);  
 				if (langId.equals(id)) {
-					language = (ILanguage)languageElem.createExecutableExtension("class"); //$NON-NLS-1$
-					cache.put(id, language);
-					return language;
-				}
-			}
-		}
-		
-		return null;
-	}
-	
-	public ILanguage getLanguage(IContentType contentType) throws CoreException {
-		String contentTypeId= contentType.getId();
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, ILanguage.KEY);
-		IExtension[] extensions = point.getExtensions();
-		for (int i = 0; i < extensions.length; ++i) {
-			IConfigurationElement[] languages = extensions[i].getConfigurationElements();
-			for (int j = 0; j < languages.length; ++j) {
-				IConfigurationElement language = languages[j];
-				IConfigurationElement[] assocContentTypes = language.getChildren("contentType"); //$NON-NLS-1$
-				for (int k = 0; k < assocContentTypes.length; ++k) {
-					if (contentTypeId.equals(assocContentTypes[k].getAttribute("id"))) { //$NON-NLS-1$
-						return (ILanguage)language.createExecutableExtension("class"); //$NON-NLS-1$
+					final ILanguage[] result= new ILanguage[]{null};
+					SafeRunner.run(new ISafeRunnable(){
+						public void handleException(Throwable exception) {
+							CCorePlugin.log(exception);
+						}
+
+						public void run() throws Exception {
+							result[0]= (ILanguage)languageElem.createExecutableExtension(ATTRIBUTE_CLASS);
+						}
+					});
+					if (result[0] != null) {
+						fLanguageCache.put(id, result[0]);
+						return result[0];
 					}
 				}
 			}
 		}
 		return null;
 	}
+
+	private String getLanguageID(final IConfigurationElement languageElem) {
+		return languageElem.getNamespaceIdentifier() + NAMESPACE_SEPARATOR + languageElem.getAttribute(ATTRIBUTE_ID);
+	}
+	
+	public ILanguage getLanguage(IContentType contentType) {
+		String contentTypeID= contentType.getId();
+		return getLanguageForContentTypeID(contentTypeID);
+	}
+	
+	private ILanguage getLanguageForContentTypeID(String contentTypeID) {
+		ILanguage language = (ILanguage)fContentTypeToLanguageCache.get(contentTypeID);
+		if (language != null || fContentTypeToLanguageCache.containsKey(contentTypeID))
+			return language;
+
+		IConfigurationElement[] configs= Platform.getExtensionRegistry().getConfigurationElementsFor(LANGUAGE_EXTENSION_POINT_ID);
+		for (int j = 0; j < configs.length; ++j) {
+			final IConfigurationElement languageElem = configs[j];
+			if (ELEMENT_LANGUAGE.equals(languageElem.getName())) {
+				IConfigurationElement[] assocContentTypes = languageElem.getChildren(ELEMENT_CONTENT_TYPE); 
+				for (int k = 0; k < assocContentTypes.length; ++k) {
+					if (contentTypeID.equals(assocContentTypes[k].getAttribute(ATTRIBUTE_ID))) {
+						String id= getLanguageID(languageElem);
+						ILanguage lang= getLanguage(id);
+						fContentTypeToLanguageCache.put(contentTypeID, lang);
+						return lang;
+					}
+				}
+			}
+		}
+		fContentTypeToLanguageCache.put(contentTypeID, null);
+		return null;
+	}
 	
 	/** 
 	 * @deprecated use getRegisteredContentTypes() instead.
@@ -98,15 +132,13 @@ public class LanguageManager {
 		allTypes.add(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
 
 		IContentTypeManager manager = Platform.getContentTypeManager(); 
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, ILanguage.KEY);
-		IExtension[] extensions = point.getExtensions();
-		for (int i = 0; i < extensions.length; ++i) {
-			IConfigurationElement[] languages = extensions[i].getConfigurationElements();
-			for (int j = 0; j < languages.length; ++j) {
-				IConfigurationElement language = languages[j];
-				IConfigurationElement[] contentTypes = language.getChildren("contentType"); //$NON-NLS-1$
+		IConfigurationElement[] configs= Platform.getExtensionRegistry().getConfigurationElementsFor(LANGUAGE_EXTENSION_POINT_ID);
+		for (int j = 0; j < configs.length; ++j) {
+			final IConfigurationElement languageElem = configs[j];
+			if (ELEMENT_LANGUAGE.equals(languageElem.getName())) {
+				IConfigurationElement[] contentTypes = languageElem.getChildren(ELEMENT_CONTENT_TYPE); 
 				for (int k = 0; k < contentTypes.length; ++k) {
-					IContentType langContType = manager.getContentType(contentTypes[k].getAttribute("id")); //$NON-NLS-1$
+					IContentType langContType = manager.getContentType(contentTypes[k].getAttribute(ATTRIBUTE_ID)); 
 					allTypes.add(langContType.getId());
 				}
 			}
@@ -133,15 +165,15 @@ public class LanguageManager {
 		allTypes.add(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
 
 		IContentTypeManager manager = Platform.getContentTypeManager(); 
-		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, ILanguage.KEY);
+		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, LANGUAGE_EXTENSION_POINT_ID);
 		IExtension[] extensions = point.getExtensions();
 		for (int i = 0; i < extensions.length; ++i) {
 			IConfigurationElement[] languages = extensions[i].getConfigurationElements();
 			for (int j = 0; j < languages.length; ++j) {
 				IConfigurationElement language = languages[j];
-				IConfigurationElement[] contentTypes = language.getChildren("contentType"); //$NON-NLS-1$
+				IConfigurationElement[] contentTypes = language.getChildren(ELEMENT_CONTENT_TYPE); 
 				for (int k = 0; k < contentTypes.length; ++k) {
-					IContentType langContType = manager.getContentType(contentTypes[k].getAttribute("id")); //$NON-NLS-1$
+					IContentType langContType = manager.getContentType(contentTypes[k].getAttribute(ATTRIBUTE_ID)); 
 					allTypes.add(langContType.getId());
 				}
 			}
@@ -151,7 +183,7 @@ public class LanguageManager {
 	}
 
 	public boolean isContributedContentType(String contentTypeId) {
-		return collectContentTypeIds().contains(contentTypeId);
+		return contentTypeId != null && getLanguageForContentTypeID(contentTypeId) != null;
 	}
 	
 	public IContributedModelBuilder getContributedModelBuilderFor(TranslationUnit tu) {
@@ -162,4 +194,38 @@ public class LanguageManager {
 			return null;
 		}
 	}
+	
+	/**
+	 * Returns a factory for the given linkage ID. The IDs are defined in {@link ILinkage}. 
+	 * @param linkageID an ID for a linkage.
+	 * @return a factory or <code>null</code>.
+	 * @since 4.0
+	 */
+	public IPDOMLinkageFactory getPDOMLinkageFactory(String linkageID) {
+		final IPDOMLinkageFactory[] result= new IPDOMLinkageFactory[] {null}; 
+		result[0]= (IPDOMLinkageFactory) fPDOMLinkageFactoryCache.get(linkageID);
+
+		if (result[0] == null) {
+			// read configuration
+			IConfigurationElement[] configs= Platform.getExtensionRegistry().getConfigurationElementsFor(LANGUAGE_EXTENSION_POINT_ID);
+			for (int i = 0; result[0] == null && i < configs.length; i++) {
+				final IConfigurationElement element = configs[i];
+				if (ELEMENT_PDOM_LINKAGE_FACTORY.equals(element.getName())) {
+					if (linkageID.equals(element.getAttribute(ATTRIBUTE_ID))) {
+						SafeRunner.run(new ISafeRunnable(){
+							public void handleException(Throwable exception) {
+								CCorePlugin.log(exception);
+							}
+
+							public void run() throws Exception {
+								result[0]= (IPDOMLinkageFactory) element.createExecutableExtension(ATTRIBUTE_CLASS);
+							}}
+						);
+					}
+				}			
+			}
+			fPDOMLinkageFactoryCache.put(linkageID, result[0]);
+		}
+		return result[0];
+	}
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java
index 380502066cb..bb0ed29c80a 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ContentTypeProcessor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2005 QNX Software Systems and others.
+ * Copyright (c) 2002, 2006 QNX Software Systems and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX Software Systems - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.model;
@@ -24,6 +25,7 @@ import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IOpenable;
 import org.eclipse.cdt.core.model.ISourceRoot;
 import org.eclipse.cdt.core.model.ITranslationUnit;
+import org.eclipse.cdt.core.model.LanguageManager;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
@@ -89,13 +91,7 @@ public class ContentTypeProcessor extends CModelOperation {
 		if (id == null || id.length() == 0) {
 			return false;
 		}
-		String[] ids = CoreModel.getRegistedContentTypeIds();
-		for (int i = 0; i < ids.length; i++) {
-			if (ids[i].equals(id)) {
-				return true;
-			}
-		}
-		return false;
+		return LanguageManager.getInstance().isContributedContentType(id);
 	}
 
 	protected void processContentType(ICElement celement, IContentType contentType, IScopeContext context) {
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
index bf95096134a..7984d3fb930 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
@@ -17,9 +17,13 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ICodeReaderFactory;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.IBuffer;
 import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IContributedModelBuilder;
 import org.eclipse.cdt.core.model.IInclude;
 import org.eclipse.cdt.core.model.ILanguage;
@@ -32,7 +36,15 @@ import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.model.IUsing;
 import org.eclipse.cdt.core.model.IWorkingCopy;
 import org.eclipse.cdt.core.model.LanguageManager;
+import org.eclipse.cdt.core.parser.CodeReader;
+import org.eclipse.cdt.core.parser.IScannerInfo;
+import org.eclipse.cdt.core.parser.IScannerInfoProvider;
+import org.eclipse.cdt.core.parser.ParserUtil;
+import org.eclipse.cdt.core.parser.ScannerInfo;
+import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory;
+import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -56,7 +68,6 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	 */
 	protected IProblemRequestor problemRequestor;
 
-
 	SourceManipulationInfo sourceManipulationInfo = null;
 
 	public TranslationUnit(ICElement parent, IFile file, String idType) {
@@ -74,7 +85,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		setContentTypeID(idType);
 	}
 
-	public ITranslationUnit getTranslationUnit () {
+	public ITranslationUnit getTranslationUnit() {
 		return this;
 	}
 
@@ -120,7 +131,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	}
 
 	public ICElement getElementAtOffset(int pos) throws CModelException {
-		ICElement e= getSourceElementAtOffset(pos);
+		ICElement e = getSourceElementAtOffset(pos);
 		if (e == this) {
 			return null;
 		}
@@ -128,14 +139,14 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	}
 
 	public ICElement[] getElementsAtOffset(int pos) throws CModelException {
-		ICElement[] e= getSourceElementsAtOffset(pos);
+		ICElement[] e = getSourceElementsAtOffset(pos);
 		if (e.length == 1 && e[0] == this) {
 			return CElement.NO_ELEMENTS;
 		}
-		return e;		
+		return e;
 	}
 
-	public ICElement getElement(String name ) {
+	public ICElement getElement(String name) {
 		if (name == null || name.length() == 0) {
 			return null;
 		}
@@ -155,7 +166,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		for (int j = 0; j < names.length; ++j) {
 			if (current instanceof IParent) {
 				try {
-					ICElement[] celements = ((IParent)current).getChildren();
+					ICElement[] celements = ((IParent) current).getChildren();
 					current = null;
 					for (int i = 0; i < celements.length; i++) {
 						if (names[j].equals(celements[i].getElementName())) {
@@ -163,7 +174,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 							break;
 						}
 					}
-				} catch (CModelException e) {		
+				} catch (CModelException e) {
 					current = null;
 				}
 			} else {
@@ -179,11 +190,11 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 			for (int i = 0; i < celements.length; i++) {
 				if (celements[i].getElementType() == ICElement.C_INCLUDE) {
 					if (name.equals(celements[i].getElementName())) {
-						return (IInclude)celements[i];
+						return (IInclude) celements[i];
 					}
 				}
 			}
-		} catch (CModelException e) {		
+		} catch (CModelException e) {
 		}
 		return null;
 	}
@@ -196,7 +207,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 				aList.add(celements[i]);
 			}
 		}
-		return (IInclude[])aList.toArray(new IInclude[0]);
+		return (IInclude[]) aList.toArray(new IInclude[0]);
 	}
 
 	public IUsing getUsing(String name) {
@@ -205,12 +216,12 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 			for (int i = 0; i < celements.length; i++) {
 				if (celements[i].getElementType() == ICElement.C_USING) {
 					if (name.equals(celements[i].getElementName())) {
-						return (IUsing)celements[i];
+						return (IUsing) celements[i];
 					}
 				}
 			}
-		} catch (CModelException e) {		
-		}		
+		} catch (CModelException e) {
+		}
 		return null;
 	}
 
@@ -222,7 +233,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 				aList.add(celements[i]);
 			}
 		}
-		return (IUsing[])aList.toArray(new IUsing[0]);
+		return (IUsing[]) aList.toArray(new IUsing[0]);
 	}
 
 	public INamespace getNamespace(String name) {
@@ -231,7 +242,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 			ICElement current = this;
 			for (int j = 0; j < names.length; ++j) {
 				if (current instanceof IParent) {
-					ICElement[] celements = ((IParent)current).getChildren();
+					ICElement[] celements = ((IParent) current).getChildren();
 					current = null;
 					for (int i = 0; i < celements.length; i++) {
 						if (celements[i].getElementType() == ICElement.C_NAMESPACE) {
@@ -246,10 +257,10 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 				}
 			}
 			if (current instanceof INamespace) {
-				return (INamespace)current;
+				return (INamespace) current;
 			}
-		} catch (CModelException e) {		
-		}		
+		} catch (CModelException e) {
+		}
 		return null;
 	}
 
@@ -261,7 +272,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 				aList.add(celements[i]);
 			}
 		}
-		return (INamespace[])aList.toArray(new INamespace[0]);
+		return (INamespace[]) aList.toArray(new INamespace[0]);
 	}
 
 	public void setLocation(IPath loc) {
@@ -283,7 +294,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	public IFile getFile() {
 		IResource res = getResource();
 		if (res instanceof IFile) {
-			return (IFile)res;
+			return (IFile) res;
 		}
 		return null;
 	}
@@ -315,7 +326,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	 * @see org.eclipse.cdt.core.model.ISourceManipulation#rename(java.lang.String, boolean, org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	public void rename(String name, boolean force, IProgressMonitor monitor)
-		throws CModelException {
+			throws CModelException {
 		getSourceManipulationInfo().rename(name, force, monitor);
 	}
 
@@ -334,7 +345,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	}
 
 	protected TranslationUnitInfo getTranslationUnitInfo() throws CModelException {
-		return (TranslationUnitInfo)getElementInfo();
+		return (TranslationUnitInfo) getElementInfo();
 	}
 
 	protected SourceManipulationInfo getSourceManipulationInfo() {
@@ -344,21 +355,21 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		return sourceManipulationInfo;
 	}
 
-	protected CElementInfo createElementInfo () {
+	protected CElementInfo createElementInfo() {
 		return new TranslationUnitInfo(this);
 	}
 
 	/**
 	 * Returns true if this handle represents the same Java element
 	 * as the given handle.
-	 *
+	 * 
 	 * <p>Compilation units must also check working copy state;
-	 *
+	 * 
 	 * @see Object#equals(java.lang.Object)
 	 */
 	public boolean equals(Object o) {
 		if (!(o instanceof ITranslationUnit)) return false;
-		return super.equals(o) && !((ITranslationUnit)o).isWorkingCopy();
+		return super.equals(o) && !((ITranslationUnit) o).isWorkingCopy();
 	}
 
 	/* (non-Javadoc)
@@ -373,10 +384,10 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		// AND use the same buffer factory.
 		// Assuming there is a little set of buffer factories, then use a 2 level Map cache.
 		Map sharedWorkingCopies = CModelManager.getDefault().sharedWorkingCopies;
-	
+
 		Map perFactoryWorkingCopies = (Map) sharedWorkingCopies.get(factory);
 		if (perFactoryWorkingCopies == null) return null;
-		return (WorkingCopy)perFactoryWorkingCopies.get(this);
+		return (WorkingCopy) perFactoryWorkingCopies.get(this);
 	}
 
 	/**
@@ -384,25 +395,25 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	 * @param newElements
 	 * @param element
 	 */
-	private void getNewElements(Map mapping, CElement element){
+	private void getNewElements(Map mapping, CElement element) {
 		Object info = null;
 		try {
 			info = element.getElementInfo();
 		} catch (CModelException e) {
 		}
-		if(info != null){
-			if(element instanceof IParent){
-				ICElement[] children = ((CElementInfo)info).getChildren();
+		if (info != null) {
+			if (element instanceof IParent) {
+				ICElement[] children = ((CElementInfo) info).getChildren();
 				int size = children.length;
 				for (int i = 0; i < size; ++i) {
 					CElement child = (CElement) children[i];
-					getNewElements(mapping, child);		
-				}		
+					getNewElements(mapping, child);
+				}
 			}
 		}
-		mapping.put(element, info);		
+		mapping.put(element, info);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.internal.core.model.Openable#buildStructure(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
 	 */
@@ -415,19 +426,19 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		CModelManager.getDefault().removeChildrenInfo(this);
 
 		// generate structure
-		this.parse(newElements); 
-		
-		///////////////////////////////////////////////////////////////
-		
+		this.parse(newElements);
+
+		// /////////////////////////////////////////////////////////////
+
 		if (isWorkingCopy()) {
 			ITranslationUnit original =  ((IWorkingCopy)this).getOriginalElement();
 			// might be IResource.NULL_STAMP if original does not exist
 			IResource r = original.getResource();
-			if (r != null && r instanceof  IFile) {
+			if (r != null && r instanceof IFile) {
 				unitInfo.fTimestamp = ((IFile) r).getModificationStamp();
 			}
 		}
-		
+
 		return unitInfo.isStructureKnown();
 	}
 
@@ -450,25 +461,25 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		throws CModelException {
 		return getSharedWorkingCopy(monitor, factory, null);
 	}
-	
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.ITranslationUnit#getSharedWorkingCopy(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.cdt.internal.core.model.IBufferFactory, org.eclipse.cdt.core.model.IProblemRequestor)
 	 */
 	public IWorkingCopy getSharedWorkingCopy(IProgressMonitor monitor,IBufferFactory factory, IProblemRequestor requestor)
-		throws CModelException {
-	
+			throws CModelException {
+
 		// if factory is null, default factory must be used
 		if (factory == null) factory = BufferManager.getDefaultBufferManager();
 
 		CModelManager manager = CModelManager.getDefault();
-	
+
 		// In order to be shared, working copies have to denote the same translation unit 
 		// AND use the same buffer factory.
 		// Assuming there is a little set of buffer factories, then use a 2 level Map cache.
 		Map sharedWorkingCopies = manager.sharedWorkingCopies;
-	
+
 		Map perFactoryWorkingCopies = (Map) sharedWorkingCopies.get(factory);
-		if (perFactoryWorkingCopies == null){
+		if (perFactoryWorkingCopies == null) {
 			perFactoryWorkingCopies = new HashMap();
 			sharedWorkingCopies.put(factory, perFactoryWorkingCopies);
 		}
@@ -479,13 +490,13 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		}
 		CreateWorkingCopyOperation op = new CreateWorkingCopyOperation(this, perFactoryWorkingCopies, factory, requestor);
 		op.runOperation(monitor);
-		return (IWorkingCopy)op.getResultElements()[0];
+		return (IWorkingCopy) op.getResultElements()[0];
 	}
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.ITranslationUnit#getWorkingCopy()
 	 */
-	public IWorkingCopy getWorkingCopy()throws CModelException{
+	public IWorkingCopy getWorkingCopy() throws CModelException {
 		return this.getWorkingCopy(null, null);
 	}
 
@@ -512,9 +523,9 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	protected void openParent(Object childInfo, Map newElements, IProgressMonitor pm) throws CModelException {
 		try {
 			super.openParent(childInfo, newElements, pm);
-		} catch(CModelException e){
+		} catch (CModelException e) {
 			// allow parent to not exist for working copies defined outside
-			if (!isWorkingCopy()){ 
+			if (!isWorkingCopy()) {
 				throw e;
 			}
 		}
@@ -546,14 +557,14 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	 */
 	protected IBuffer openBuffer(IProgressMonitor pm) throws CModelException {
 
-		// create buffer -  translation units only use default buffer factory
-		BufferManager bufManager = getBufferManager();		
+		// create buffer - translation units only use default buffer factory
+		BufferManager bufManager = getBufferManager();
 		IBuffer buffer = getBufferFactory().createBuffer(this);
-		if (buffer == null) 
+		if (buffer == null)
 			return null;
-	
+
 		// set the buffer source
-		if (buffer.getCharacters() == null){
+		if (buffer.getCharacters() == null) {
 			IResource file = this.getResource();
 			if (file != null && file.getType() == IResource.FILE) {
 				buffer.setContents(Util.getResourceContentsAsCharArray((IFile)file));
@@ -562,10 +573,10 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 
 		// add buffer to buffer cache
 		bufManager.addBuffer(buffer);
-			
+
 		// listen to buffer changes
 		buffer.addBufferChangedListener(this);
-	
+
 		return buffer;
 	}
 
@@ -601,9 +612,9 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		} catch (Exception e) {
 			// use the debug log for this exception.
 			Util.debugLog( "Exception in CModelBuilder", IDebugLogConstants.MODEL);  //$NON-NLS-1$
-		}							
+		}
 	}
-	
+
 	private void parseUsingContributedModelBuilder(IContributedModelBuilder mb, boolean quickParseMode) {
 		try {
 			mb.parse(quickParseMode);
@@ -612,7 +623,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 			Util.debugLog( "Exception in contributed model builder", IDebugLogConstants.MODEL);  //$NON-NLS-1$
 		}
 	}
-	
+
 	public IProblemRequestor getProblemRequestor() {
 		return problemRequestor;
 	}
@@ -633,7 +644,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	public boolean isSourceUnit() {
 		if (isHeaderUnit())
 			return false;
-			
+
 		return (
 				CCorePlugin.CONTENT_TYPE_CSOURCE.equals(contentTypeId)
 				|| CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(contentTypeId)
@@ -668,7 +679,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	public boolean isASMLanguage() {
 		return CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(contentTypeId);
 	}
-	
+
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.ICElement#exists()
@@ -682,26 +693,26 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 
 	public ILanguage getLanguage() throws CoreException {
 		if (language == null) {
-			language= computeLanguage(contentTypeId);
-			
+			language = computeLanguage(contentTypeId);
+
 			// Special magic for C/C++ header files
 			if (language == null && isHeaderUnit()) {
 				if (CCorePlugin.CONTENT_TYPE_CHEADER.equals(contentTypeId)) {
-					language= computeLanguage(CCorePlugin.CONTENT_TYPE_CSOURCE);
+					language = computeLanguage(CCorePlugin.CONTENT_TYPE_CSOURCE);
 				}
 				else if (CCorePlugin.CONTENT_TYPE_CXXHEADER.equals(contentTypeId)) {
-					language= computeLanguage(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
+					language = computeLanguage(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
 				}
 			}
 		}
-		
+
 		return language;
 	}
-	
+
 	private ILanguage computeLanguage(String contentTypeId) throws CoreException {
 		// Look for the language extension registered against the
 		// content type string
-		IContentTypeManager manager = Platform.getContentTypeManager(); 
+		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentType contentType = manager.getContentType(contentTypeId);
 		if (contentType != null) {
 			return LanguageManager.getInstance().getLanguage(contentType);
@@ -744,4 +755,69 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		} catch (CModelException e) {
 		}
 	}
+
+	public IASTTranslationUnit getAST() throws CoreException {
+		return getAST(null, 0);
+	}
+
+	public IASTTranslationUnit getAST(IIndex index, int style) throws CoreException {
+		ICodeReaderFactory codeReaderFactory;
+		if (index != null && (style & (ITranslationUnit.AST_SKIP_INDEXED_HEADERS | ITranslationUnit.AST_SKIP_ALL_HEADERS)) != 0) {
+			codeReaderFactory= new IndexBasedCodeReaderFactory(index);
+		}
+		else {
+			codeReaderFactory = SavedCodeReaderFactory.getInstance();
+		}
+		
+		IScannerInfo scanInfo = getScannerInfo( (style & ITranslationUnit.AST_SKIP_IF_NO_BUILD_INFO) == 0);
+		if (scanInfo == null) {
+			return null;
+		}
+		
+		CodeReader reader;
+		reader = getCodeReader();
+		
+		ILanguage language= getLanguage();
+		if (language != null) {
+			return language.getASTTranslationUnit(reader, scanInfo, codeReaderFactory, index);
+		}
+		return null;
+	}
+
+	public CodeReader getCodeReader() {
+		CodeReader reader;
+		IPath location= getLocation();
+		if (isWorkingCopy() || location == null) {
+			if (location == null) {
+				reader= new CodeReader(getContents());
+			}
+			else {
+				reader= new CodeReader(location.toOSString(), getContents());
+			}
+		}
+		else {
+			reader= ParserUtil.createReader(location.toOSString(), null);
+		}
+		return reader;
+	}
+
+	public IScannerInfo getScannerInfo(boolean force) {
+		IResource resource = getResource();
+		ICProject project = getCProject();
+		IProject rproject = project.getProject();
+
+		IScannerInfoProvider provider = CCorePlugin.getDefault()
+				.getScannerInfoProvider(rproject);
+		if (provider != null) {
+			IResource infoResource = resource != null ? resource : rproject;
+			IScannerInfo scanInfo = provider
+					.getScannerInformation(infoResource);
+			if (scanInfo != null)
+				return scanInfo;
+		}
+		if (force) {
+			return new ScannerInfo();
+		}
+		return null;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ILinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ILinkage.java
new file mode 100644
index 00000000000..5312756e578
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ILinkage.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.dom;
+
+/**
+ * Represents a linkage in the AST or the index.
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will
+ * work or that it will remain the same. Please do not use this API without
+ * consulting with the CDT team.
+ * </p>
+ * @since 4.0
+ */
+public interface ILinkage {
+	final static String NO_LINKAGE_ID= "none"; //$NON-NLS-1$
+	final static String C_LINKAGE_ID= "C"; //$NON-NLS-1$
+	final static String CPP_LINKAGE_ID= "C++"; //$NON-NLS-1$
+	final static String FORTRAN_LINKAGE_ID= "Fortran"; //$NON-NLS-1$
+
+	String getID();
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IName.java
index 3b340233244..60de3bccb78 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IName.java
@@ -13,16 +13,19 @@ package org.eclipse.cdt.core.dom;
 
 import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
-import org.eclipse.cdt.core.dom.ast.IBinding;
 
 /**
- * Common interface for names in the index and the AST
+ * Common interface for names in the index and the AST.
+ * <p> This interface is not intended to be implemented by clients. </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will
+ * work or that it will remain the same. Please do not use this API without
+ * consulting with the CDT team.
+ * </p>
  * @since 4.0
  */
 public interface IName {
-
-	public static final IName[] EMPTY_NAME_ARRAY = new IName[0];
-
 	/**
 	 * Return a char array representation of the name.
 	 * 
@@ -30,13 +33,6 @@ public interface IName {
 	 */
 	public char[] toCharArray();
 	
-	/**
-	 * Resolve the semantic object this name is referring to.
-	 * 
-	 * @return <code>IBinding</code> binding
-	 */
-	public IBinding resolveBinding();
-
 	/**
 	 * Is this name being used in the AST as the introduction of a declaration?
 	 * @return boolean
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOM.java
index 50b3e4af308..6adfc229efb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOM.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOM.java
@@ -11,13 +11,7 @@
  *******************************************************************************/
 package org.eclipse.cdt.core.dom;
 
-import java.util.regex.Pattern;
-
-import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.model.IWorkingCopy;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
 
 /**
  * This is the reader interface to the PDOM. It is used by general
@@ -25,74 +19,4 @@ import org.eclipse.core.runtime.IProgressMonitor;
  * 
  * @author Doug Schaefer
  */
-public interface IPDOM extends IAdaptable {
-
-	/**
-	 * Find all the bindings whose names that match the pattern.
-	 * 
-	 * @param pattern
-	 * @return
-	 * @throws CoreException
-	 */
-	public IBinding[] findBindings(Pattern pattern, IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Find all bindings whose qualified names match the array of patterns. 
-	 * 
-	 * @param pattern
-	 * @return
-	 * @throws CoreException
-	 */
-	public IBinding[] findBindings(Pattern[] pattern, IProgressMonitor monitor) throws CoreException;
-	
-	/**
-	 * Recursively visit the nodes in this PDOM using the given visitor.
-	 * 
-	 * @param visitor
-	 * @throws CoreException
-	 */
-	public void accept(IPDOMVisitor visitor) throws CoreException;
-	
-	/** 
-	 * Clear all the contents of this PDOM.
-	 * 
-	 * @throws CoreException
-	 */
-	public void clear() throws CoreException;
-	
-	/**
-	 * Looks to see if anything has been stored in this PDOM.
-	 * 
-	 * @return is the PDOM empty
-	 * @throws CoreException
-	 */
-	public boolean isEmpty() throws CoreException;
-	
-	public ICodeReaderFactory getCodeReaderFactory();
-	
-	public ICodeReaderFactory getCodeReaderFactory(IWorkingCopy root);
-	
-	/**
-	 * When accessing a PDOM and working with its objects it's neccessary to hold
-	 * a read-lock on the PDOM. Make sure to release it: <pre> 
-	 * pdom.acquireReadLock(); 
-	 * try {
-	 *     // do what you have to do.
-	 * }
-	 * finally {
-	 *     pdom.releaseReadLock();
-	 * } </pre>
-	 * @throws InterruptedException
-	 * @since 4.0
-	 */
-	public void acquireReadLock() throws InterruptedException;
-	public void releaseReadLock();
-	
-	/**
-	 * You must not hold any other lock on any PDOM when acquiring a write lock.
-	 * Failing to do so may lead to dead-locks.
-	 */
-	public void acquireWriteLock() throws InterruptedException;
-	public void releaseWriteLock();
-	
-}
+public interface IPDOM extends IAdaptable {}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMResolver.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMResolver.java
deleted file mode 100644
index 66ab7f92ca7..00000000000
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMResolver.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 QNX Software Systems and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * QNX - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.core.dom;
-
-import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-
-/**
- * This is the interface used by the DOM to help with resolving
- * bindings amongst other things.
- * 
- * @author Doug Schaefer
- */
-public interface IPDOMResolver extends IAdaptable {
-
-	public IBinding resolveBinding(IASTName name);
-	
-	public IName[] getDeclarations(IBinding binding) throws CoreException;
-	
-	public IName[] getDefinitions(IBinding binding) throws CoreException;
-	
-	public IName[] getReferences(IBinding binding) throws CoreException;
-
-}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java
index 48b46b4054d..4e727d13934 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java
@@ -11,6 +11,7 @@
  *******************************************************************************/
 package org.eclipse.cdt.core.dom.ast;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.IName;
 
 /**
@@ -42,6 +43,13 @@ public interface IASTName extends IASTNode, IName {
 	 */
 	public void setBinding( IBinding binding );
 	
+	/**
+	 * Resolve the semantic object this name is referring to.
+	 * 
+	 * @return <code>IBinding</code> binding
+	 */
+	public IBinding resolveBinding();
+
 	/**
 	 * Return a list of bindings in the scope of the name that have the name as
 	 * a prefix.
@@ -49,4 +57,9 @@ public interface IASTName extends IASTNode, IName {
 	 * @return <code>IBinding []</code> bindings that start with this name
 	 */
 	public IBinding[] resolvePrefix();
+	
+	/**
+	 * Determines the current linkage in which the name has to be resolved.
+	 */
+	public ILinkage getLinkage();
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java
index 3582f16abe8..bee233fde39 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTTranslationUnit.java
@@ -12,7 +12,7 @@
 package org.eclipse.cdt.core.dom.ast;
 
 import org.eclipse.cdt.core.dom.IName;
-import org.eclipse.cdt.core.dom.IPDOM;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.parser.ParserLanguage;
 
@@ -219,14 +219,14 @@ public interface IASTTranslationUnit extends IASTNode {
      * 
      * @return the Index for this translation unit
      */
-    public IPDOM getIndex();
+    public IIndex getIndex();
     
     /**
      * Set the Index to be used for this translation unit.
      * 
      * @param index
      */
-    public void setIndex(IPDOM index);
+    public void setIndex(IIndex index);
 
     /**
      * Returns the language for this translation unit.
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java
index 5baf4fc1e18..be176e1b0cb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IBinding.java
@@ -7,12 +7,16 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.core.dom.ast;
 
+import org.eclipse.cdt.core.dom.ILinkage;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
 
 /**
+ * Represents the semantics of a name found in the AST or the index.
  * @author Doug Schaefer
  */
 public interface IBinding extends IAdaptable {
@@ -37,5 +41,10 @@ public interface IBinding extends IAdaptable {
 	 * @return the scope of this name
 	 */
 	public IScope getScope() throws DOMException;
+	
+	/**
+	 * Every binding has a linkage.
+	 */
+	public ILinkage getLinkage() throws CoreException;
 
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope.java
index 1120d9dc010..7e78b9825c4 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope.java
@@ -45,16 +45,11 @@ public interface IScope {
 	 * @return List of IBinding
 	 */
 	public IBinding[] find(String name) throws DOMException;
-    
-    /**
-     * Return the physical IASTNode that this scope was created for
-     * @return
-     */
-    public IASTNode getPhysicalNode() throws DOMException;
-    
+        
     /**
      * The IScope serves as a mechanism for caching IASTNames and bindings to
      * speed up resolution.
+     * mstodo more work: remove the ast-specific methods.
      */
     
     /**
@@ -97,24 +92,4 @@ public interface IScope {
 	 * @throws DOMException
 	 */
 	public void addBinding(IBinding binding) throws DOMException;
-
-	/**
-	 * Set whether or not all the names in this scope have been cached
-	 * 
-	 * @param b
-	 */
-	public void setFullyCached(boolean b) throws DOMException;
-
-	/**
-	 * whether or not this scope's cache contains all the names
-	 * 
-	 * @return
-	 */
-	public boolean isFullyCached() throws DOMException;
-	
-	/** 
-	 * clear the name cache in this scope
-	 * @throws DOMException
-	 */
-	public void flushCache() throws DOMException;
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java
index 4a705e97420..9f34a1864af 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.core.dom.ast.gnu.c;
@@ -22,9 +23,10 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
 import org.eclipse.cdt.core.dom.ast.c.CASTVisitor;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.model.AbstractLanguage;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IContributedModelBuilder;
-import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.model.IWorkingCopy;
 import org.eclipse.cdt.core.parser.CodeReader;
@@ -36,28 +38,23 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.core.parser.ParserUtil;
 import org.eclipse.cdt.core.parser.ScannerInfo;
-import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory;
 import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser;
 import org.eclipse.cdt.internal.core.dom.parser.c.GCCParserExtensionConfiguration;
 import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser;
 import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner;
 import org.eclipse.cdt.internal.core.parser.scanner2.GCCScannerExtensionConfiguration;
 import org.eclipse.cdt.internal.core.parser.scanner2.IScannerExtensionConfiguration;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.PDOMCodeReaderFactory;
 import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
 import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory;
-import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.PlatformObject;
 
 /**
  * @author Doug Schaefer
  *
  */
-public class GCCLanguage extends PlatformObject implements ILanguage {
+public class GCCLanguage extends AbstractLanguage {
 
 	protected static final GCCScannerExtensionConfiguration C_GNU_SCANNER_EXTENSION = new GCCScannerExtensionConfiguration();
 	// Must match the id in the extension
@@ -80,53 +77,9 @@ public class GCCLanguage extends PlatformObject implements ILanguage {
 			return super.getAdapter(adapter);
 	}
 	
-	public IASTTranslationUnit getASTTranslationUnit(ITranslationUnit file, int style) throws CoreException {
-		ICodeReaderFactory fileCreator;
-		if ((style & (ILanguage.AST_SKIP_INDEXED_HEADERS | ILanguage.AST_SKIP_ALL_HEADERS)) != 0) {
-			PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(file.getCProject()).getAdapter(PDOM.class);
-			fileCreator = new PDOMCodeReaderFactory(pdom);
-		} else
-			fileCreator = SavedCodeReaderFactory.getInstance();
-
-		return getASTTranslationUnit(file, fileCreator, style);
-	}
-	
-	public IASTTranslationUnit getASTTranslationUnit(
-			ITranslationUnit file,
-			ICodeReaderFactory codeReaderFactory,
-			int style) throws CoreException {
-		IResource resource = file.getResource();
-		ICProject project = file.getCProject();
-		IProject rproject = project.getProject();
-		
-		IScannerInfo scanInfo = null;
-		IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(rproject);
-		if (provider != null){
-			IResource infoResource = resource != null ? resource : rproject; 
-			IScannerInfo buildScanInfo = provider.getScannerInformation(infoResource);
-			if (buildScanInfo != null)
-				scanInfo = buildScanInfo;
-			else if ((style & ILanguage.AST_SKIP_IF_NO_BUILD_INFO) != 0)
-				return null;
-			else
-				scanInfo = new ScannerInfo();
-		}
-		
-		CodeReader reader;
-		IFile rfile = (IFile)file.getResource();
-		String path	= rfile != null	? rfile.getLocation().toOSString() : file.getPath().toOSString();
-		if (file instanceof IWorkingCopy) {
-			// get the working copy contents
-			reader = new CodeReader(path, file.getContents());
-		} else {
-			reader = codeReaderFactory.createCodeReaderForTranslationUnit(path);
-			if (reader == null)
-				return null;
-		}
-		
-	    IScannerExtensionConfiguration scannerExtensionConfiguration
-	    	= C_GNU_SCANNER_EXTENSION;
-	    
+	public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, 
+			IScannerInfo scanInfo, ICodeReaderFactory codeReaderFactory, IIndex index) throws CoreException {
+	    IScannerExtensionConfiguration scannerExtensionConfiguration= C_GNU_SCANNER_EXTENSION;
 		IScanner scanner = new DOMScanner(reader, scanInfo, ParserMode.COMPLETE_PARSE,
                 ParserLanguage.C, ParserFactory.createDefaultLogService(), scannerExtensionConfiguration, codeReaderFactory);
 	    //assume GCC
@@ -135,8 +88,8 @@ public class GCCLanguage extends PlatformObject implements ILanguage {
 
 	    // Parse
 		IASTTranslationUnit ast = parser.parse();
-		if ((style & AST_USE_INDEX) != 0) 
-			ast.setIndex(CCorePlugin.getPDOMManager().getPDOM(file.getCProject()));
+		// mstodo isn't that too late to set the index?
+		ast.setIndex(index);
 		return ast;
 	}
 	
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java
index b011274c143..6f6bcdb81a6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.core.dom.ast.gnu.cpp;
@@ -22,9 +23,10 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
 import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.model.AbstractLanguage;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IContributedModelBuilder;
-import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.model.IWorkingCopy;
 import org.eclipse.cdt.core.parser.CodeReader;
@@ -36,28 +38,23 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.ParserMode;
 import org.eclipse.cdt.core.parser.ParserUtil;
 import org.eclipse.cdt.core.parser.ScannerInfo;
-import org.eclipse.cdt.internal.core.dom.SavedCodeReaderFactory;
 import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.GPPParserExtensionConfiguration;
 import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner;
 import org.eclipse.cdt.internal.core.parser.scanner2.GPPScannerExtensionConfiguration;
 import org.eclipse.cdt.internal.core.parser.scanner2.IScannerExtensionConfiguration;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.PDOMCodeReaderFactory;
 import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
 import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkageFactory;
-import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.PlatformObject;
 
 /**
  * @author Doug Schaefer
  *
  */
-public class GPPLanguage extends PlatformObject implements ILanguage {
+public class GPPLanguage extends AbstractLanguage {
 
 	protected static final GPPScannerExtensionConfiguration CPP_GNU_SCANNER_EXTENSION = new GPPScannerExtensionConfiguration();
 	public static final String ID = CCorePlugin.PLUGIN_ID + ".g++"; //$NON-NLS-1$
@@ -79,53 +76,10 @@ public class GPPLanguage extends PlatformObject implements ILanguage {
 			return super.getAdapter(adapter);
 	}
 	
-	public IASTTranslationUnit getASTTranslationUnit(ITranslationUnit file, int style) throws CoreException {
-		ICodeReaderFactory fileCreator;
-		if ((style & (ILanguage.AST_SKIP_INDEXED_HEADERS | ILanguage.AST_SKIP_ALL_HEADERS)) != 0) {
-			PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(file.getCProject()).getAdapter(PDOM.class);
-			fileCreator = new PDOMCodeReaderFactory(pdom);
-		} else
-			fileCreator = SavedCodeReaderFactory.getInstance();
-
-		return getASTTranslationUnit(file, fileCreator, style);
-	}
 	
-	public IASTTranslationUnit getASTTranslationUnit(
-			ITranslationUnit file,
-			ICodeReaderFactory codeReaderFactory,
-			int style) throws CoreException {
-		IResource resource = file.getResource();
-		ICProject project = file.getCProject();
-		IProject rproject = project.getProject();
-		
-		IScannerInfo scanInfo = null;
-		IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(rproject);
-		if (provider != null){
-			IResource infoResource = resource != null ? resource : rproject; 
-			IScannerInfo buildScanInfo = provider.getScannerInformation(infoResource);
-			if (buildScanInfo != null)
-				scanInfo = buildScanInfo;
-			else if ((style & ILanguage.AST_SKIP_IF_NO_BUILD_INFO) != 0)
-				return null;
-			else
-				scanInfo = new ScannerInfo();
-		}
-		
-		CodeReader reader;
-		IFile rfile = (IFile)file.getResource();
-		String path	= rfile != null	? rfile.getLocation().toOSString() : file.getPath().toOSString();
-		if (file instanceof IWorkingCopy) {
-			// get the working copy contents
-			reader = new CodeReader(path, file.getContents());
-		} else {
-			reader = codeReaderFactory.createCodeReaderForTranslationUnit(path);
-			if (reader == null)
-				return null;
-		}
-		
-	    IScannerExtensionConfiguration scannerExtensionConfiguration
-	    	= CPP_GNU_SCANNER_EXTENSION;
-	    
+	public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo,
+			ICodeReaderFactory codeReaderFactory, IIndex index) throws CoreException {
+	    IScannerExtensionConfiguration scannerExtensionConfiguration= CPP_GNU_SCANNER_EXTENSION;
 		IScanner scanner = new DOMScanner(reader, scanInfo, ParserMode.COMPLETE_PARSE,
                 ParserLanguage.CPP, ParserFactory.createDefaultLogService(), scannerExtensionConfiguration, codeReaderFactory);
 	    //assume GCC
@@ -133,9 +87,9 @@ public class GPPLanguage extends PlatformObject implements ILanguage {
 				new GPPParserExtensionConfiguration()  );
 
 	    // Parse
-		IASTTranslationUnit ast = parser.parse();
-		if ((style & AST_USE_INDEX) != 0)
-			ast.setIndex(CCorePlugin.getPDOMManager().getPDOM(file.getCProject()));
+		IASTTranslationUnit ast= parser.parse();
+		// mstodo isn't that too late to set the index?
+		ast.setIndex(index);
 		return ast;
 	}
 
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java
new file mode 100644
index 00000000000..22bab17a2b2
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java
@@ -0,0 +1,278 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.index;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.cdt.core.dom.IName;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Interface for accessing the index for one or more projects.
+ * 
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
+ * @since 4.0
+ */
+public interface IIndex {
+	/**
+	 * Constant to specify infinite depth. 
+	 * @see #findIncludedBy(IIndexFile, int) 
+	 * @see #findIncludes(IIndexFile, int)
+	 */
+	final int DEPTH_INFINITE = -1;
+
+	/**
+	 * Constant to find direct includes, only. 
+	 * @see #findIncludedBy(IIndexFile, int) 
+	 * @see #findIncludes(IIndexFile, int)
+	 */
+	final int DEPTH_ZERO = 0;
+
+	/** 
+	 * Constant to search for declarations. This does not include definitions.
+	 */
+	final int FIND_DECLARATIONS = 0x1;
+	/** 
+	 * Constant to search for definitions. This does not include declarations.
+	 */
+	final int FIND_DEFINITIONS  = 0x2;
+	/** 
+	 * Constant to search for all declarations including definitons.
+	 */
+	final int FIND_REFERENCES   = 0x4;
+	/** 
+	 * Constant to search for references. This does not include declarations or definitions.
+	 */
+	final int FIND_DECLARATIONS_DEFINITIONS = FIND_DECLARATIONS | FIND_DEFINITIONS;
+	/** 
+	 * Constant to search for all occurrences of a binding. This includes declarations, definitons and references.
+	 */
+	final int FIND_ALL_OCCURENCES = FIND_DECLARATIONS | FIND_DEFINITIONS | FIND_REFERENCES;
+
+	/**
+	 * Before making calls to an index you have to obtain a lock. The objects 
+	 * returned by an index become invalid as soon as the indexer writes to the
+	 * index. You may obtain nested read locks. Make sure you release the lock.
+	 * @see #getLastWriteAccess()
+	 * <pre>
+	 * index.acquireReadLock();
+	 * try {
+	 *    ....
+	 * }
+	 * finally {
+	 *    index.releaseReadLock();
+	 * }
+	 * </pre>
+	 */
+	public void acquireReadLock() throws InterruptedException;
+	
+	/**
+	 * Any lock obtained by {@link #acquireReadLock()} must be released.
+	 */
+	public void releaseReadLock();
+	
+	/**
+	 * Returns a timestamp of when the index was last written to. This can
+	 * be used to figure out whether information read from the index is 
+	 * still reliable or not.
+	 *
+	 * <pre>
+	 * long timestamp;
+	 * IBinding binding= null;
+	 * index.acquireReadLock();
+	 * try {
+	 *    timestamp= index.getLastWriteAccess();
+	 *    binding= index.findBinding(...);
+	 * }
+	 * finally {
+	 *    index.releaseReadLock();
+	 * }
+	 * ...
+	 * index.acqureReadLock();
+	 * try {
+	 *    if (index.getLastWriteAccess() != timestamp) {
+	 *       // don't use binding, it's not valid anymore
+	 *       binding= index.findBinding(...);
+	 *    }
+	 *    String name= binding.getName();
+	 *    ...
+	 * }
+	 * finally {
+	 *    index.releaseReadLock();
+	 * }
+	 */
+	public long getLastWriteAccess();
+	
+	/**
+	 * Looks for a file with the given location. May return <code>null</code>.
+	 * @param location absolute path of the file location
+	 * @return the file in the index or <code>null</code>
+	 * @throws CoreException
+	 */
+	public IIndexFile getFile(IPath location) throws CoreException;
+
+	/**
+	 * Looks for include relations originated by the given file.
+	 * This is the same as <pre> findIncludes(file, DEPTH_ZERO); </pre> 
+	 * @param file the file containing the include directives
+	 * @return an array of include relations
+	 * @throws CoreException
+	 */
+	public IIndexInclude[] findIncludes(IIndexFile file) throws CoreException;
+
+	/**
+	 * Looks for include relations pointing to the given file. 
+	 * This is the same as <pre> findIncludedBy(file, DEPTH_ZERO); </pre> 
+	 * @param file the file included by the directives to be found
+	 * @return an array of include relations
+	 * @throws CoreException
+	 */
+	public IIndexInclude[] findIncludedBy(IIndexFile file) throws CoreException;
+
+	/**
+	 * Looks recursively for include relations originated by the given file.
+	 * @param file the file containing the include directives
+	 * @param depth depth to which includes are followed, should be one of 
+	 * {@link #DEPTH_ZERO} or {@link #DEPTH_INFINITE}
+	 * @return an array of include relations
+	 * @throws CoreException
+	 */
+	public IIndexInclude[] findIncludes(IIndexFile file, int depth) throws CoreException;
+
+	/**
+	 * Looks recursively for include relations pointing to the given file.
+	 * @param file the file the include directives point to
+	 * @param depth depth to which includes are followed, should be one of 
+	 * {@link #DEPTH_ZERO} or {@link #DEPTH_INFINITE}
+	 * @return an array of include relations
+	 * @throws CoreException
+	 */
+	public IIndexInclude[] findIncludedBy(IIndexFile file, int depth) throws CoreException;
+
+	/**
+	 * Resolves the file that is included by the given include directive. May return <code>null</code>
+	 * in case the file cannot be found. This is usually more efficient than using:
+	 * <pre>
+	 * getFile(include.getIncludesLocation())
+	 * </pre>
+	 * @param include
+	 * @return the file included or <code>null</code>.
+	 * @throws CoreException
+	 * @since 4.0
+	 */
+	public IIndexFile resolveInclude(IIndexInclude include) throws CoreException;
+
+	/**
+	 * Looks for a binding for the given ICElement. May return <code>null</code>.
+	 * @param element an element a binding is searched for
+	 * @return a binding for the element or <code>null</code>
+	 * @throws CoreException
+	 */
+	public IIndexBinding findBinding(ICElement element) throws CoreException;
+	
+	/**
+	 * Searches for the binding of a name. The name may be originated by
+	 * an AST or by a search in an index. May return <code>null</code>.
+	 * @param name a name to find the binding for
+	 * @return the binding or <code>null</code>
+	 * @throws CoreException
+	 */
+	public IIndexBinding findBinding(IName name) throws CoreException;
+	
+	/**
+	 * Searches for all bindings with simple names that match the given pattern. In case a binding exists 
+	 * in multiple projects, no duplicate bindings are returned.
+	 * This is fully equivalent to 
+	 * <pre>
+	 * findBindings(new Pattern[]{pattern}, isFullyQualified, filter, monitor);
+	 * </pre> 
+	 * @param pattern the pattern the name of the binding has to match.
+	 * @param isFullyQualified if <code>true</code>, binding must be in global scope
+	 * @param filter a filter that allows for skipping parts of the index 
+	 * @param monitor a monitor to report progress
+	 * @return an array of bindings matching the pattern
+	 * @throws CoreException
+	 */
+	public IIndexBinding[] findBindings(Pattern pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
+
+	/**
+	 * Searches for all bindings with qualified names that seen as an array of simple names match the given array 
+	 * of patterns. In case a binding exists in multiple projects, no duplicate bindings are returned.
+	 * You can search with an array of patterns that specifies a partial qualification only. 
+	 * @param patterns an array of patterns the names of the qualified name of the bindings have to match.
+	 * @param isFullyQualified if <code>true</code>, the array of pattern specifies the fully qualified name
+	 * @param filter a filter that allows for skipping parts of the index 
+	 * @param monitor a monitor to report progress
+	 * @return an array of bindings matching the pattern
+	 * @throws CoreException
+	 */
+	public IIndexBinding[] findBindings(Pattern[] patterns, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
+	
+	/**
+	 * Searches for all names that resolve to the given binding. You can limit the result to references, declarations
+	 * or definitions, or a combination of those.
+	 * @param binding a binding for which names are searched for
+	 * @param flags a combination of {@link #FIND_DECLARATIONS}, {@link #FIND_DEFINITIONS} and {@link #FIND_REFERENCES}
+	 * @return an array of names
+	 * @throws CoreException
+	 */
+	public IIndexName[] findNames(IBinding binding, int flags) throws CoreException;
+
+	/**
+	 * Searches for all references that resolve to the given binding. 
+	 * This is fully equivalent to 
+	 * <pre>
+	 * findNames(binding, IIndex.FIND_REFERENCES);
+	 * </pre> 
+	 * @param binding a binding for which references are searched for
+	 * @return an array of names
+	 * @throws CoreException
+	 */
+	public IIndexName[] findReferences(IBinding binding) throws CoreException;
+
+	/**
+	 * Searches for all declarations and definitions that resolve to the given binding. 
+	 * This is fully equivalent to 
+	 * <pre>
+	 * findNames(binding, IIndex.FIND_DECLARATIONS_DEFINITIONS);
+	 * </pre> 
+	 * @param binding a binding for which declarations are searched for
+	 * @return an array of names
+	 * @throws CoreException
+	 */
+	public IIndexName[] findDeclarations(IBinding binding) throws CoreException;
+
+	/**
+	 * Searches for all definitions that resolve to the given binding. 
+	 * This is fully equivalent to 
+	 * <pre>
+	 * findNames(binding, IIndex.FIND_DEFINITIONS);
+	 * </pre> 
+	 * @param binding a binding for which declarations are searched for
+	 * @return an array of names
+	 * @throws CoreException
+	 */
+	public IIndexName[] findDefinitions(IBinding binding) throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java
new file mode 100644
index 00000000000..dabbbef505a
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.index;
+
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Represents the semantics of a name in the index.
+ * 
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
+ * @since 4.0
+ */
+public interface IIndexBinding extends IBinding {
+	/**
+	 * Returns the enclosing binding. May return <code>null</code>. To give an example, for a member function
+	 * the parent binding would be the class defining the member.
+	 * @throws CoreException
+	 */
+	IIndexBinding getParentBinding() throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java
new file mode 100644
index 00000000000..925a0ff6f96
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexFile.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.index;
+
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Represents a file that has been indexed.
+ * 
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
+ * @since 4.0
+ */
+public interface IIndexFile {
+
+	/**
+	 * Returns the absolute path of the location of the file.
+	 * @return the absolute path of the location of the file
+	 * @throws CoreException
+	 */
+	String getLocation() throws CoreException;
+
+	/**
+	 * Returns all includes found in this file.
+	 * @return an array of all includes found in this file
+	 * @throws CoreException
+	 */
+	IIndexInclude[] getIncludes() throws CoreException;
+	
+	/**
+	 * Returns all macros defined in this file.
+	 * @return an array of macros found in this file
+	 * @throws CoreException
+	 */
+	IIndexMacro[] getMacros() throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java
new file mode 100644
index 00000000000..6b1381c5fca
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexInclude.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.core.index;
+
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Interface for an include directive stored in the index.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
+ * @since 4.0
+ */
+public interface IIndexInclude {
+	IIndexInclude[] EMPTY_INCLUDES_ARRAY = new IIndexInclude[0];
+
+	/**
+	 * Returns the file that contains this directive.
+	 * @return the file performing the include
+	 * @throws CoreException
+	 */
+	IIndexFile getIncludedBy() throws CoreException;
+
+	/**
+	 * Returns the absolute path of the location of the file that contains this directive.
+	 * @return the absolute path of the location of the file performing the include
+	 * @throws CoreException
+	 */
+	String getIncludedByLocation() throws CoreException;
+	
+	/**
+	 * Returns the absolute path of the location of the file that is included by this directive.
+	 * @return the absolute path of the location of the file that is included by this directive
+	 * @throws CoreException
+	 */
+	String getIncludesLocation() throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexLinkage.java
new file mode 100644
index 00000000000..b12cfad2d32
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexLinkage.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.index;
+
+import org.eclipse.cdt.core.dom.ILinkage;
+
+/**
+ * Represents the linkage of a name in the index.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
+ * @since 4.0
+ */
+public interface IIndexLinkage extends ILinkage {
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexMacro.java
new file mode 100644
index 00000000000..fc1f7336468
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexMacro.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.index;
+
+import org.eclipse.cdt.core.parser.IMacro;
+
+/**
+ * Represents a macro stored in the index.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
+ * @since 4.0
+ */
+public interface IIndexMacro extends IMacro {
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java
new file mode 100644
index 00000000000..1b9558a0e2a
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexManager.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.index;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Starting point for working with the index. The manager can be obtained via
+ * {@link CCorePlugin#getIndexManager()}.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
+ * @since 4.0
+ */
+public interface IIndexManager {
+	public final static int ADD_DEPENDENCIES = 0x1;
+	public final static int ADD_DEPENDENT    = 0x2;
+	
+	/**
+	 * Returns the index for the given project.
+	 * @param project the project to get the index for
+	 * @return an index for the project
+	 * @throws CoreException
+	 */
+	IIndex getIndex(ICProject project) throws CoreException;
+
+	/**
+	 * Returns the index for the given projects.
+	 * @param projects the projects to get the index for
+	 * @return an index for the projects
+	 * @throws CoreException
+	 */
+	IIndex getIndex(ICProject[] projects) throws CoreException;
+
+	/**
+	 * Returns the index for the given project. You can specify to add dependencies or dependent projects.
+	 * @param project the project to get the index for
+	 * @param options <code>0</code> or a combination of {@link #ADD_DEPENDENCIES} and {@link #ADD_DEPENDENT}.
+	 * @return an index for the project
+	 * @throws CoreException
+	 */
+	IIndex getIndex(ICProject project, int options) throws CoreException;
+
+	/**
+	 * Returns the index for the given projects. You can specify to add dependencies or dependent projects.
+	 * @param projects the projects to get the index for
+	 * @param options <code>0</code> or a combination of {@link #ADD_DEPENDENCIES} and {@link #ADD_DEPENDENT}.
+	 * @return an index for the projects
+	 * @throws CoreException
+	 */
+	IIndex getIndex(ICProject[] projects, int options) throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java
index 6bfd93afb12..c73a8a70ad2 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexName.java
@@ -15,29 +15,33 @@ import org.eclipse.cdt.core.dom.IName;
 
 
 /**
- * Interface for all the names in the index. These constitute either a 
+ * Interface for all the names in the index. These constitute either a
  * declaration or a reference.
+ * <p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will work or
+ * that it will remain the same. Please do not use this API without consulting
+ * with the CDT team.
+ * </p>
+ * 
  * @since 4.0
  */
 public interface IIndexName extends IName {
-
-	public static final IIndexName[] EMPTY_NAME_ARRAY = new IIndexName[0];
-
 	/**
 	 * Returns the location of the file the name resides in.
-	 * @since 4.0
 	 */
 	public String getFileName();
 
 	/**
 	 * Returns the character offset of the location of the name.
-	 * @since 4.0
 	 */
 	public int getNodeOffset();
 
 	/**
 	 * Returns the length of the name.
-	 * @since 4.0
 	 */
 	public int getNodeLength();
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexFilter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexFilter.java
new file mode 100644
index 00000000000..8a234f63a0b
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexFilter.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.core.index;
+
+import org.eclipse.cdt.core.dom.ILinkage;
+
+/**
+ * Can be subclassed and used for queries in the index.
+ * @since 4.0
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. This class or interface has been added as
+ * part of a work in progress. There is no guarantee that this API will
+ * work or that it will remain the same. Please do not use this API without
+ * consulting with the CDT team.
+ * </p>
+ */
+
+public class IndexFilter {
+	/**
+	 * Returns whether or not to include objects of the given linkage in the query.
+	 * @see IIndex#findBindings(java.util.regex.Pattern, boolean, IndexFilter, org.eclipse.core.runtime.IProgressMonitor)
+	 * @param linkage a linkage to be tested
+	 * @return whether to include objects of the given linkage in the query.
+	 */
+	public boolean acceptLinkage(ILinkage linkage) {
+		return true;
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/Linkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/Linkage.java
new file mode 100644
index 00000000000..8e0cd3da130
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/Linkage.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.dom;
+
+import org.eclipse.cdt.core.dom.ILinkage;
+
+public class Linkage implements ILinkage {
+
+	public static final ILinkage NO_LINKAGE = new Linkage(NO_LINKAGE_ID);
+	public static final ILinkage C_LINKAGE = new Linkage(C_LINKAGE_ID);
+	public static final ILinkage CPP_LINKAGE = new Linkage(CPP_LINKAGE_ID);
+	
+	private String fID;
+	private Linkage(String id) {
+		fID= id;
+	}
+	public String getID() {
+		return fID;
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java
new file mode 100644
index 00000000000..30b9d849e3e
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTInternal.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.dom.parser;
+
+import org.eclipse.cdt.core.dom.ast.DOMException;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.dom.ast.IScope;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalBinding;
+
+/**
+ * Access to methods on scopes and bindings internal to the parser.
+ * @since 4.0
+ */
+public class ASTInternal {
+
+	public static IASTNode[] getDeclarationsOfBinding(IBinding binding) {
+		if( binding instanceof ICPPInternalBinding ) {
+			return ((ICPPInternalBinding)binding).getDeclarations();
+		}
+		assert false;
+		return IASTNode.EMPTY_NODE_ARRAY;
+	}
+
+	public static IASTNode getPhysicalNodeOfScope(IScope scope) throws DOMException {
+		if (scope instanceof IASTInternalScope) {
+			return ((IASTInternalScope) scope).getPhysicalNode();
+		}
+		assert false;
+		return null;
+	}
+
+	public static void flushCache(IScope scope) throws DOMException {
+		if (scope instanceof IASTInternalScope) {
+			((IASTInternalScope) scope).flushCache();
+		}
+	}
+
+	public static boolean isFullyCached(IScope scope) throws DOMException {
+		if (scope instanceof IASTInternalScope) {
+			return ((IASTInternalScope) scope).isFullyCached();
+		}
+		return true;
+	}
+
+	public static void setFullyCached(IScope scope, boolean val) throws DOMException {
+		if (scope instanceof IASTInternalScope) {
+			((IASTInternalScope) scope).setFullyCached(val);
+		}
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java
index 3fe89f409b0..04cced1fc2e 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/GCCBuiltinSymbolProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,9 +7,11 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
 import org.eclipse.cdt.core.dom.ast.IASTBuiltinSymbolProvider;
 import org.eclipse.cdt.core.dom.ast.IASTInitializer;
@@ -22,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
 import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.c.CBasicType;
 import org.eclipse.cdt.internal.core.dom.parser.c.CFunctionType;
 import org.eclipse.cdt.internal.core.dom.parser.c.CImplicitFunction;
@@ -2351,7 +2354,10 @@ public class GCCBuiltinSymbolProvider implements IASTBuiltinSymbolProvider {
 		public IScope getScope() {
 			return null;
 		}
-		
+
+		public ILinkage getLinkage() {
+			return Linkage.C_LINKAGE;
+		}
 	}
     
 	static public class CPPBuiltinParameter extends PlatformObject implements ICPPParameter {
@@ -2435,6 +2441,9 @@ public class GCCBuiltinSymbolProvider implements IASTBuiltinSymbolProvider {
         public boolean isGloballyQualified() {
             return false;
         }
-        
+
+		public ILinkage getLinkage() {
+			return Linkage.CPP_LINKAGE;
+		}
     }
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IASTInternalScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IASTInternalScope.java
new file mode 100644
index 00000000000..d54aef351f0
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/IASTInternalScope.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.dom.parser;
+
+import org.eclipse.cdt.core.dom.ast.DOMException;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+
+/** 
+ * Interface for methods on scopes that are internal to the AST.
+ * @since 4.0
+ */
+public interface IASTInternalScope {
+    /**
+     * Return the physical IASTNode that this scope was created for
+     * @return
+     */
+    public IASTNode getPhysicalNode() throws DOMException;
+
+	/**
+	 * Set whether or not all the names in this scope have been cached
+	 * 
+	 * @param b
+	 */
+	public void setFullyCached(boolean b) throws DOMException;
+
+	/**
+	 * whether or not this scope's cache contains all the names
+	 * 
+	 * @return
+	 */
+	public boolean isFullyCached() throws DOMException;
+	
+	/** 
+	 * clear the name cache in this scope
+	 * @throws DOMException
+	 */
+	public void flushCache() throws DOMException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java
index 33ad9fa35e6..25b689d047f 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java
@@ -17,6 +17,7 @@ package org.eclipse.cdt.internal.core.dom.parser;
 
 import java.text.MessageFormat;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.IName;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
@@ -26,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IProblemBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics;
 import org.eclipse.cdt.internal.core.parser.ParserMessages;
 import org.eclipse.core.runtime.PlatformObject;
@@ -33,7 +35,7 @@ import org.eclipse.core.runtime.PlatformObject;
 /**
  * @author aniefer
  */
-public class ProblemBinding extends PlatformObject implements IProblemBinding, IType, IScope {
+public class ProblemBinding extends PlatformObject implements IProblemBinding, IType, IScope, IASTInternalScope {
     protected final int id;
     protected final char [] arg;
     protected IASTNode node;
@@ -208,4 +210,8 @@ public class ProblemBinding extends PlatformObject implements IProblemBinding, I
 	public void addBinding(IBinding binding) throws DOMException {
 		throw new DOMException( this );
 	}
+
+	public ILinkage getLinkage() {
+		return Linkage.NO_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java
index a361f547d7f..6499fb1f48c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguity.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
@@ -21,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.c.CASTVisitor;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
 
@@ -75,7 +77,7 @@ public abstract class CASTAmbiguity extends CASTNode  {
                     if( scope != null )
                     {
                         try {
-                            scope.flushCache();
+                            ASTInternal.flushCache(scope);
                         } catch (DOMException e) {
                         }
                     }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java
index 4f3ae2e52cb..688586564e3 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java
@@ -7,14 +7,17 @@
  *
  * Contributors:
  * IBM Rational Software - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.ASTVisitor;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 
 /**
  * @author jcamelon
@@ -141,4 +144,7 @@ public class CASTName extends CASTNode implements IASTName {
         return false;
     }
 
+	public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java
index c3deaafebe8..706f8331db4 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTranslationUnit.java
@@ -13,8 +13,6 @@ package org.eclipse.cdt.internal.core.dom.parser.c;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.IName;
-import org.eclipse.cdt.core.dom.IPDOM;
-import org.eclipse.cdt.core.dom.IPDOMResolver;
 import org.eclipse.cdt.core.dom.ast.ASTVisitor;
 import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
 import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
@@ -42,6 +40,7 @@ import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.c.CASTVisitor;
 import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
 import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.ast.IASTEnumerator;
@@ -51,7 +50,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTPreprocessorSelectionResult;
 import org.eclipse.cdt.internal.core.dom.parser.IRequiresLocationInformation;
 import org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver;
 import org.eclipse.cdt.internal.core.parser.scanner2.InvalidPreprocessorNodeException;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.core.runtime.CoreException;
 
 /**
@@ -68,7 +66,7 @@ public class CASTTranslationUnit extends CASTNode implements
 
 	private ILocationResolver resolver;
 	
-	private IPDOM pdom;
+	private IIndex index;
 
 	private static final IASTPreprocessorStatement[] EMPTY_PREPROCESSOR_STATEMENT_ARRAY = new IASTPreprocessorStatement[0];
 
@@ -125,11 +123,9 @@ public class CASTTranslationUnit extends CASTNode implements
 	 */
 	public IName[] getDeclarations(IBinding binding) {
     	IName[] names= getDeclarationsInAST(binding);
-        if (names.length == 0 && pdom != null) {
+        if (names.length == 0 && index != null) {
         	try {
-        		binding = ((PDOM)pdom).getLinkage(getLanguage()).adaptBinding(binding);
-        		if (binding != null)
-        			names = ((IPDOMResolver)pdom.getAdapter(IPDOMResolver.class)).getDeclarations(binding);
+        		names = index.findDeclarations(binding);
         	} catch (CoreException e) {
         		CCorePlugin.log(e);
         		return names;
@@ -156,11 +152,9 @@ public class CASTTranslationUnit extends CASTNode implements
      */
     public IName[] getDefinitions(IBinding binding) {
     	IName[] names= getDefinitionsInAST(binding);
-        if (names.length == 0 && pdom != null) {
+        if (names.length == 0 && index != null) {
         	try {
-        		binding = ((PDOM)pdom).getLinkage(getLanguage()).adaptBinding(binding);
-        		if (binding != null)
-        			names = ((IPDOMResolver)pdom.getAdapter(IPDOMResolver.class)).getDefinitions(binding);
+        		names= index.findDefinitions(binding);
         	} catch (CoreException e) {
         		CCorePlugin.log(e);
         		return names;
@@ -566,12 +560,12 @@ public class CASTTranslationUnit extends CASTNode implements
     	return new GCCLanguage();
     }
     
-    public IPDOM getIndex() {
-    	return pdom;
+    public IIndex getIndex() {
+    	return index;
     }
     
-    public void setIndex(IPDOM pdom) {
-    	this.pdom = pdom;
+    public void setIndex(IIndex index) {
+    	this.index = index;
     }
     
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumeration.java
index 461f68b46cc..e78d089590f 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumeration.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumeration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,6 +15,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
@@ -28,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.ITypedef;
 import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
 import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -156,4 +159,8 @@ public class CEnumeration extends PlatformObject implements IEnumeration {
 
         return false;
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumerator.java
index eb8b79c31e0..b8f7b8924dc 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumerator.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CEnumerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,6 +15,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -23,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IEnumerator;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -76,4 +79,7 @@ public class CEnumerator extends PlatformObject implements IEnumerator {
 		return enumeration;
 	}
 
+	public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CExternalVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CExternalVariable.java
index 878a17188e8..846b251706a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CExternalVariable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CExternalVariable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,12 +15,15 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.IVariable;
 import org.eclipse.cdt.core.dom.ast.c.ICExternalBinding;
+import org.eclipse.cdt.internal.core.dom.Linkage;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -91,4 +95,8 @@ public class CExternalVariable extends PlatformObject implements ICExternalBindi
     public boolean isRegister() {
         return false;
     }
+
+	public ILinkage getLinkage() throws CoreException {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java
index 82d1a364b64..bcd5c857a67 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CFunction.java
@@ -1,15 +1,17 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- * IBM Rational Software - Initial API and implementation 
+ * IBM Rational Software - Initial API and implementation
+ * Markus Schorn (Wind River Systems) 
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
 import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
@@ -31,7 +33,9 @@ import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -431,4 +435,8 @@ public class CFunction extends PlatformObject implements IFunction, ICInternalFu
 		else 
 			bits &= ~FULLY_RESOLVED;
 	}
+
+	public ILinkage getLinkage() throws CoreException {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CKnRParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CKnRParameter.java
index b0e4f834e77..bdc3b120366 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CKnRParameter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CKnRParameter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,9 +7,11 @@
  *
  * Contributors:
  * IBM Rational Software - Initial API and implementation 
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
 import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
@@ -20,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IParameter;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -114,4 +117,8 @@ public class CKnRParameter extends PlatformObject implements IParameter {
             return ((IASTSimpleDeclaration)declaration).getDeclSpecifier().getStorageClass() == IASTDeclSpecifier.sc_register;
         return false;
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CLabel.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CLabel.java
index f0a10031fdf..5ffed13875b 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CLabel.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CLabel.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,12 +15,14 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.ILabel;
 import org.eclipse.cdt.core.dom.ast.IScope;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -71,4 +74,7 @@ public class CLabel extends PlatformObject implements ILabel {
         return CVisitor.getContainingScope( labelStatement.getParent() );
     }
 
+    public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CParameter.java
index 498e3d8ca3c..e0d87ac47e2 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CParameter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CParameter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,10 +7,12 @@
  *
  * Contributors:
  * IBM Rational Software - Initial API and implementation 
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@@ -26,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -184,4 +187,8 @@ public class CParameter extends PlatformObject implements IParameter {
         }
         return false;
 	}
+    
+	public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java
index ba9e991c07d..6127b582bc8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java
@@ -35,11 +35,12 @@ import org.eclipse.cdt.core.dom.ast.c.ICScope;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope;
 
 /**
  * @author aniefer
  */
-public class CScope implements ICScope {
+public class CScope implements ICScope, IASTInternalScope {
 	/**
 	 * ISO C:99 6.2.3 there are seperate namespaces for various categories of
 	 * identifiers: - label names ( labels have ICFunctionScope ) - tags of
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java
index 126ff6537c6..0765f4b79ed 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CStructure.java
@@ -1,16 +1,18 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- * IBM Rational Software - Initial API and implementation 
+ * IBM Rational Software - Initial API and implementation
+ * Markus Schorn (Wind River Systems) 
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@@ -31,6 +33,8 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier;
 import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
 import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -107,7 +111,7 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte
 		IField[] fields = new IField[ size ];
 		if( size > 0 ){
 		    ICCompositeTypeScope scope = (ICCompositeTypeScope) getCompositeScope();
-		    if( scope.isFullyCached() )
+		    if( ASTInternal.isFullyCached(scope) )
 		        scope = null;
 			for( int i = 0; i < size; i++ ){
 				IASTNode node = members[i];
@@ -125,7 +129,7 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte
 				}
 			}
 			if( scope != null )
-			    scope.setFullyCached( true );
+				ASTInternal.setFullyCached(scope, true);
 		}
 		return (IField[]) ArrayUtil.trim( IField.class, fields );
 	}
@@ -142,7 +146,7 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte
 	    }
 	    
 	    ICCompositeTypeScope scope = (ICCompositeTypeScope) getCompositeScope();
-	    if( scope != null && scope.isFullyCached() ){
+	    if( scope != null && ASTInternal.isFullyCached(scope) ){
 	        IBinding binding = scope.getBinding( name.toCharArray() );
 	        if( binding instanceof IField )
 	            return (IField) binding;
@@ -186,7 +190,7 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte
 		    	}
 	    	}
     		if( scope != null )
-    		    scope.setFullyCached( true );
+    		    ASTInternal.setFullyCached(scope, true);
     		if( found != null )
     		    return found;
 	    }
@@ -237,4 +241,8 @@ public class CStructure extends PlatformObject implements ICompositeType, ICInte
             return type.isSameType( this );
         return false;
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CTypedef.java
index 90c50c1341e..e60ed5c9418 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CTypedef.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CTypedef.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,10 +7,12 @@
  *
  * Contributors:
  * IBM Rational Software - Initial API and implementation 
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
 import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -18,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.ITypedef;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -98,4 +101,8 @@ public class CTypedef extends PlatformObject implements ITypedef, ITypeContainer
 	        return temp.isSameType( t );
 	    return false;
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java
index 6ddcc3425e4..bcdda3c0134 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVariable.java
@@ -1,16 +1,18 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- * IBM Rational Software - Initial API and implementation 
+ * IBM Rational Software - Initial API and implementation
+ * Markus Schorn (Wind River Systems) 
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@@ -22,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.IVariable;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -131,4 +134,8 @@ public class CVariable extends PlatformObject implements IVariable, ICInternalBi
     public boolean isRegister() {
         return hasStorageClass( IASTDeclSpecifier.sc_register );
     }
+	
+    public ILinkage getLinkage() {
+		return Linkage.C_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java
index 40872602422..35fce23eb05 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java
@@ -7,12 +7,12 @@
  *
  * Contributors:
  * IBM Rational Software - Initial API and implementation 
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.dom.parser.c;
 
-import org.eclipse.cdt.core.dom.IPDOM;
-import org.eclipse.cdt.core.dom.IPDOMResolver;
+import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
@@ -89,10 +89,12 @@ import org.eclipse.cdt.core.dom.ast.c.ICScope;
 import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
 import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
 import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTSimpleDeclSpecifier;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
 import org.eclipse.cdt.core.parser.util.ObjectSet;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.CoreException;
@@ -851,7 +853,7 @@ public class CVisitor {
 			    binding = new CParameter( name );
 		    }
 		    try {
-				if( scope != null && scope.getPhysicalNode() instanceof IASTTranslationUnit ){
+				if( scope != null && ASTInternal.getPhysicalNodeOfScope(scope) instanceof IASTTranslationUnit ){
 					return binding;
 				}
 			} catch (DOMException e) {
@@ -1205,7 +1207,7 @@ public class CVisitor {
 			if( prefix )
 			    scope = null;
 			
-			if( scope != null && scope.isFullyCached() ){
+			if( scope != null && ASTInternal.isFullyCached(scope) ){
 			    try {
                     binding = scope.getBinding( name, true );
                 } catch ( DOMException e ) {
@@ -1278,7 +1280,7 @@ public class CVisitor {
 				}
 				if( scope != null ) {
 	                try {
-	                    scope.setFullyCached( true );
+	                	ASTInternal.setFullyCached(scope, true);
 	                } catch ( DOMException e ) {
 	                }
 				}
@@ -1305,9 +1307,13 @@ public class CVisitor {
 		if( blockItem != null) {
 			// We're at the end of our rope, check the PDOM if we can
 			IASTTranslationUnit tu = (IASTTranslationUnit)blockItem;
-			IPDOM pdom = tu.getIndex();
-			if (pdom != null) {
-				binding = ((IPDOMResolver)pdom.getAdapter(IPDOMResolver.class)).resolveBinding(name);
+			IIndex index = tu.getIndex();
+			if (index != null) {
+				try {
+					binding = index.findBinding(name);
+				} catch (CoreException e) {
+					CCorePlugin.log(e);
+				}
 			}
 			
 			if (binding == null)
@@ -1915,7 +1921,7 @@ public class CVisitor {
     }
     
     public static IBinding[] findBindings( IScope scope, String name ) throws DOMException{
-        IASTNode node = scope.getPhysicalNode();
+        IASTNode node = ASTInternal.getPhysicalNodeOfScope(scope);
         if( node instanceof IASTFunctionDefinition )
             node = ((IASTFunctionDefinition)node).getBody();
         
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java
index dad275c104a..7ccf8cd9958 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguity.java
@@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.IProblemBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
 
 public abstract class CPPASTAmbiguity extends CPPASTNode {
@@ -76,7 +77,7 @@ public abstract class CPPASTAmbiguity extends CPPASTNode {
                 if( scope != null )
                 {
                     try {
-                        scope.flushCache();
+                        ASTInternal.flushCache(scope);
                     } catch (DOMException de) {}
                 }
             }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java
index 099b331bdf8..4ac189ee10c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java
@@ -10,11 +10,13 @@
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.ASTVisitor;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 
 /**
  * @author jcamelon
@@ -151,5 +153,4 @@ public class CPPASTName extends CPPASTNode implements IASTName {
         }
         return false;
     }
-
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNode.java
index 0446db8cbc6..07921e082e2 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNode.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNode.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 
 /**
@@ -17,6 +19,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
  */
 public abstract class CPPASTNode extends ASTNode {
 
-	// A little empty isn't it...
-	
+    public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java
index f9fdd8c7557..d7059bfd525 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.ASTVisitor;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNameOwner;
@@ -20,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 
 /**
  * @author jcamelon
@@ -276,6 +278,4 @@ public class CPPASTQualifiedName extends CPPASTNode implements
         }
         return false;
     }
-
-
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java
index 11cc8a73541..841623d0895 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java
@@ -13,8 +13,6 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.IName;
-import org.eclipse.cdt.core.dom.IPDOM;
-import org.eclipse.cdt.core.dom.IPDOMResolver;
 import org.eclipse.cdt.core.dom.ast.ASTVisitor;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
@@ -56,6 +54,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
 import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.parser.ParserLanguage;
 import org.eclipse.cdt.core.parser.ast.IASTEnumerator;
@@ -67,7 +66,6 @@ import org.eclipse.cdt.internal.core.dom.parser.IRequiresLocationInformation;
 import org.eclipse.cdt.internal.core.dom.parser.GCCBuiltinSymbolProvider.CPPBuiltinParameter;
 import org.eclipse.cdt.internal.core.parser.scanner2.ILocationResolver;
 import org.eclipse.cdt.internal.core.parser.scanner2.InvalidPreprocessorNodeException;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.core.runtime.CoreException;
 
 /**
@@ -83,7 +81,7 @@ public class CPPASTTranslationUnit extends CPPASTNode implements
 
     private ILocationResolver resolver;
 
-    private IPDOM pdom;
+    private IIndex index;
 
     private static final IASTPreprocessorStatement[] EMPTY_PREPROCESSOR_STATEMENT_ARRAY = new IASTPreprocessorStatement[0];
 
@@ -189,11 +187,9 @@ public class CPPASTTranslationUnit extends CPPASTNode implements
 
     public IName[] getDeclarations(IBinding b) {
         IName[] names = getDeclarationsInAST(b);
-        if (names.length == 0 && pdom != null) {
+        if (names.length == 0 && index != null) {
         	try {
-        		b = ((PDOM)pdom).getLinkage(getLanguage()).adaptBinding(b);
-        		if (binding != null)
-        			names = ((IPDOMResolver)pdom.getAdapter(IPDOMResolver.class)).getDeclarations(b);
+        		names = index.findDeclarations(b);
         	} catch (CoreException e) {
         		CCorePlugin.log(e);
         		return names;
@@ -220,11 +216,9 @@ public class CPPASTTranslationUnit extends CPPASTNode implements
 
     public IName[] getDefinitions(IBinding binding) {
     	IName[] names = getDefinitionsInAST(binding);
-        if (names.length == 0 && pdom != null) {
+        if (names.length == 0 && index != null) {
         	try {
-        		binding = ((PDOM)pdom).getLinkage(getLanguage()).adaptBinding(binding);
-        		if (binding != null)
-        			names = ((IPDOMResolver)pdom.getAdapter(IPDOMResolver.class)).getDefinitions(binding);
+        		names = index.findDefinitions(binding);
         	} catch (CoreException e) {
         		CCorePlugin.log(e);
         		return names;
@@ -609,12 +603,12 @@ public class CPPASTTranslationUnit extends CPPASTNode implements
     	return new GPPLanguage();
     }
     
-    public IPDOM getIndex() {
-    	return pdom;
+    public IIndex getIndex() {
+    	return index;
     }
     
-    public void setIndex(IPDOM pdom) {
-    	this.pdom = pdom;
+    public void setIndex(IIndex pdom) {
+    	this.index = pdom;
     }
     
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java
index 760f98d3162..2f98b772b14 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstance.java
@@ -13,6 +13,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IBinding;
@@ -30,6 +31,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateInstance;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
 import org.eclipse.cdt.core.parser.util.ObjectMap;
+import org.eclipse.cdt.internal.core.dom.Linkage;
+import org.eclipse.core.runtime.CoreException;
 
 /**
  * @author aniefer
@@ -197,5 +200,4 @@ public class CPPClassInstance extends CPPInstance implements ICPPClassType, ICPP
 	public ICPPClassType[] getNestedClasses() throws DOMException {
 		return ICPPClassType.EMPTY_CLASS_ARRAY;
 	}
-
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java
index a01eaa67d0e..70d5da7e411 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java
@@ -33,11 +33,13 @@ import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
 import org.eclipse.cdt.core.parser.util.ObjectMap;
 import org.eclipse.cdt.core.parser.util.ObjectSet;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
+import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope;
 
 /**
  * @author aniefer
  */
-public class CPPClassInstanceScope implements ICPPClassScope {
+public class CPPClassInstanceScope implements ICPPClassScope, IASTInternalScope {
 	private static final char[] CONSTRUCTOR_KEY = "!!!CTOR!!!".toCharArray();  //$NON-NLS-1$
 
 	private CharArrayObjectMap bindings;
@@ -251,14 +253,17 @@ public class CPPClassInstanceScope implements ICPPClassScope {
 	public IASTNode getPhysicalNode() throws DOMException {
 		ICPPClassType cls = getOriginalClass();
 		ICPPClassScope scope = (ICPPClassScope)cls.getCompositeScope();
-		if( scope != null )
-			return scope.getPhysicalNode();
 		
-		if( cls instanceof ICPPInternalBinding ){
-			IASTNode [] nds = ((ICPPInternalBinding)cls).getDeclarations();
-			if( nds != null && nds.length > 0 )
-				return nds[0];
+		IASTNode node= ASTInternal.getPhysicalNodeOfScope(scope);
+		if (node != null) {
+			return node;
 		}
+		
+		IASTNode[] nds= ASTInternal.getDeclarationsOfBinding(cls);
+
+		if( nds != null && nds.length > 0 )
+			return nds[0];
+
 		return null;
 	}
 
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java
index 376f25ac9b4..60441c3a2fe 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassSpecialization.java
@@ -181,5 +181,4 @@ public class CPPClassSpecialization extends CPPSpecialization implements
 	public ICPPClassType[] getNestedClasses() throws DOMException {
 		return ICPPClassType.EMPTY_CLASS_ARRAY;
 	}
-
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java
index 3e5bffe8f92..a3fce21fa1f 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java
@@ -50,6 +50,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBas
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
 import org.eclipse.cdt.core.parser.util.ObjectSet;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType.CPPClassTypeProblem;
 
 /**
@@ -389,7 +390,7 @@ public class CPPClassTemplate extends CPPTemplateDefinition implements
         }
         
         ICPPClassScope scope = (ICPPClassScope) getCompositeScope();
-        if( scope.isFullyCached() )
+        if( ASTInternal.isFullyCached(scope))
         	return ((CPPClassScope)scope).getConstructors( true );
         	
         IASTDeclaration [] members = getCompositeTypeSpecifier().getMembers();
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java
index a3ab17601e1..9970496865d 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,14 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Nov 29, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@@ -47,12 +49,13 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
 import org.eclipse.cdt.core.parser.util.ObjectSet;
+import org.eclipse.cdt.internal.core.dom.Linkage;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
@@ -373,7 +376,7 @@ public class CPPClassType extends PlatformObject implements ICPPClassType, ICPPI
 		    {
 	            while( scope instanceof ICPPClassScope || scope instanceof ICPPFunctionScope ){
 					try {
-						scope = (ICPPScope) scope.getParent();
+						scope = scope.getParent();
 					} catch (DOMException e1) {
 					}
 				}
@@ -678,7 +681,7 @@ public class CPPClassType extends PlatformObject implements ICPPClassType, ICPPI
         }
         
         ICPPClassScope scope = (ICPPClassScope) getCompositeScope();
-        if( scope.isFullyCached() )
+        if( ASTInternal.isFullyCached(scope) )
         	return ((CPPClassScope)scope).getConstructors( true );
         	
         IASTDeclaration [] members = getCompositeTypeSpecifier().getMembers();
@@ -821,4 +824,8 @@ public class CPPClassType extends PlatformObject implements ICPPClassType, ICPPI
         }
 		return (ICPPClassType[]) ArrayUtil.trim( ICPPClassType.class, result );
 	}
+	
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPCompositeBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPCompositeBinding.java
index 3d48a67e6de..6dc7d956ef9 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPCompositeBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPCompositeBinding.java
@@ -13,11 +13,14 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -66,4 +69,8 @@ public class CPPCompositeBinding extends PlatformObject implements IBinding {
 		return bindings;
 	}
 
+	public ILinkage getLinkage() throws CoreException {
+		return Linkage.CPP_LINKAGE;
+	}
+
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDelegate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDelegate.java
index 0b8125a0467..630fc95ae78 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDelegate.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPDelegate.java
@@ -14,6 +14,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -21,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -154,5 +156,8 @@ public class CPPDelegate extends PlatformObject implements ICPPDelegate, ICPPInt
 	public void removeDeclaration(IASTNode node) {
 		
 	}
-    
+
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java
index a26373c7027..1d6bd3256b5 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumeration.java
@@ -14,6 +14,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -25,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.ITypedef;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -188,4 +190,8 @@ public class CPPEnumeration extends PlatformObject implements IEnumeration, ICPP
             return ((ITypedef)type).isSameType( this );
         return false;
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumerator.java
index 10937f69972..fa57723d427 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumerator.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPEnumerator.java
@@ -14,6 +14,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -25,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -152,4 +154,7 @@ public class CPPEnumerator extends PlatformObject implements IEnumerator, ICPPIn
 		
 	}
 
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java
index bd894d6aaa1..d9603f062ed 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Nov 29, 2004
@@ -28,6 +29,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 
 /**
  * @author aniefer
@@ -87,7 +89,7 @@ public class CPPField extends CPPVariable implements ICPPField, ICPPInternalBind
 		char [] myName = getNameCharArray();
 		
 		ICPPClassScope scope = (ICPPClassScope) getScope();
-		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) scope.getPhysicalNode();
+		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) ASTInternal.getPhysicalNodeOfScope(scope);
 		IASTDeclaration [] members = compSpec.getMembers();
 		for( int i = 0; i < members.length; i++ ){
 			if( members[i] instanceof IASTSimpleDeclaration ){
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java
index 895ae85faee..22b7efd35a0 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunction.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,14 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Dec 1, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@@ -36,6 +38,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
@@ -172,7 +176,7 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
 	            //implicit binding
 	            IScope scope = getScope();
                 try {
-                    IASTNode node = scope.getPhysicalNode();
+                    IASTNode node = ASTInternal.getPhysicalNodeOfScope(scope);
                     tu = node.getTranslationUnit();
                 } catch ( DOMException e ) {
                 }
@@ -592,4 +596,8 @@ public class CPPFunction extends PlatformObject implements ICPPFunction, ICPPInt
         }
         return false;
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java
index a47cfc9e9a3..711ea946898 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPImplicitMethod.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -32,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 
 /**
  * @author aniefer
@@ -84,7 +86,7 @@ public class CPPImplicitMethod extends CPPImplicitFunction implements ICPPMethod
 		IFunctionType ftype = getType();
 		IType [] params = ftype.getParameterTypes();
 		
-		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) getScope().getPhysicalNode();
+		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) ASTInternal.getPhysicalNodeOfScope(getScope());
 		IASTDeclaration [] members = compSpec.getMembers();
 		for( int i = 0; i < members.length; i++ ){
 			IASTDeclarator dtor = null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPLabel.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPLabel.java
index ec5258ed295..fb4851e07ac 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPLabel.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPLabel.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,12 +15,14 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.ILabel;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -143,5 +146,8 @@ public class CPPLabel extends PlatformObject implements ILabel, ICPPInternalBind
 		
 	}
 
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethod.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethod.java
index 0e3a7e51f7d..fe66a070476 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethod.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethod.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Dec 1, 2004
@@ -33,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 
 /**
  * @author aniefer
@@ -118,7 +120,7 @@ public class CPPMethod extends CPPFunction implements ICPPMethod {
 		char [] myName = getNameCharArray();
 		
 		ICPPClassScope scope = (ICPPClassScope) getScope();
-		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) scope.getPhysicalNode();
+		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) ASTInternal.getPhysicalNodeOfScope(scope);
 		IASTDeclaration [] members = compSpec.getMembers();
 		for( int i = 0; i < members.length; i++ ){
 			if( members[i] instanceof IASTSimpleDeclaration ){
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplate.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplate.java
index d14a751cf82..acaca8a1de2 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplate.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPMethodTemplate.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Mar 31, 2005
@@ -30,6 +31,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateScope;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 
 /**
  * @author aniefer
@@ -64,7 +66,7 @@ public class CPPMethodTemplate extends CPPFunctionTemplate implements
 		if( scope instanceof ICPPTemplateScope )
 		    scope = scope.getParent();
 		ICPPClassScope clsScope = (ICPPClassScope) scope;
-		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) clsScope.getPhysicalNode();
+		ICPPASTCompositeTypeSpecifier compSpec = (ICPPASTCompositeTypeSpecifier) ASTInternal.getPhysicalNodeOfScope(clsScope);
 		IASTDeclaration [] members = compSpec.getMembers();
 		for( int i = 0; i < members.length; i++ ){
 		    if( members[i] instanceof ICPPASTTemplateDeclaration ){
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java
index 2ccdd298d30..52dd05764a0 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespace.java
@@ -7,12 +7,14 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Dec 1, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@@ -37,6 +39,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
 import org.eclipse.cdt.core.parser.util.ObjectSet;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
@@ -240,7 +243,7 @@ public class CPPNamespace extends PlatformObject implements ICPPNamespace, ICPPI
 	 * @see org.eclipse.cdt.core.dom.ast.IBinding#getName()
 	 */
 	public String getName() {
-		return tu != null ? null : namespaceDefinitions[0].toString(); //$NON-NLS-1$
+		return tu != null ? null : namespaceDefinitions[0].toString(); 
 	}
 
 	/* (non-Javadoc)
@@ -363,4 +366,7 @@ public class CPPNamespace extends PlatformObject implements ICPPNamespace, ICPPI
 		return IBinding.EMPTY_BINDING_ARRAY;
 	}
 
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespaceAlias.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespaceAlias.java
index 654cf40118c..36c252f7811 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespaceAlias.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNamespaceAlias.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,6 +15,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -24,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -151,4 +154,8 @@ public class CPPNamespaceAlias extends PlatformObject implements ICPPNamespaceAl
 	public IBinding[] getMemberBindings() throws DOMException {
 		return namespace.getMemberBindings();
 	}
+	
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java
index 5fcc21c1d60..62083daa2cc 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPParameter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,14 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Dec 10, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@@ -28,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -280,4 +283,8 @@ public class CPPParameter extends PlatformObject implements ICPPParameter, ICPPI
 		}
 		return null;
 	}
+	
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java
index 0757984a436..46baf7aaaa6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java
@@ -7,13 +7,14 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Nov 29, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
-import org.eclipse.cdt.core.dom.IPDOM;
+import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -23,16 +24,18 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
 import org.eclipse.cdt.core.parser.util.ObjectSet;
+import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
+import org.eclipse.core.runtime.CoreException;
 
 /**
  * @author aniefer
  */
-abstract public class CPPScope implements ICPPScope{
+abstract public class CPPScope implements ICPPScope, IASTInternalScope {
     public static class CPPScopeProblem extends ProblemBinding implements ICPPScope {
         public CPPScopeProblem( IASTNode node, int id, char[] arg ) {
             super( node, id, arg );
@@ -125,13 +128,18 @@ abstract public class CPPScope implements ICPPScope{
 	        }
 	        return (IBinding) obj;
 	    } else {
-	    	IPDOM pdom = name.getTranslationUnit().getIndex();
-	    	if (pdom != null) {
+	    	IIndex index = name.getTranslationUnit().getIndex();
+	    	if (index != null) {
 	    		// Try looking this up in the PDOM
 	    		if (physicalNode instanceof ICPPASTNamespaceDefinition) {
 	    			ICPPASTNamespaceDefinition nsdef = (ICPPASTNamespaceDefinition)physicalNode;
 	    			IASTName nsname = nsdef.getName();
-	    			IBinding nsbinding = ((PDOM)pdom).resolveBinding(nsname);
+	    			IBinding nsbinding= null;
+					try {
+						nsbinding = index.findBinding(nsname);
+					} catch (CoreException e) {
+						CCorePlugin.log(e);
+					}
 		    		if (nsbinding instanceof ICPPScope)
 		    			return ((ICPPScope)nsbinding).getBinding(name, forceResolve);
 	    		}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
index 053678f75f6..b8f123a87cd 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java
@@ -7,14 +7,14 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Dec 8, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
-import org.eclipse.cdt.core.dom.IPDOM;
-import org.eclipse.cdt.core.dom.IPDOMResolver;
+import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression;
@@ -117,16 +117,19 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTemplateParameter;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
 import org.eclipse.cdt.core.parser.util.ObjectMap;
 import org.eclipse.cdt.core.parser.util.ObjectSet;
 import org.eclipse.cdt.core.parser.util.ArrayUtil.ArrayWrapper;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
+import org.eclipse.core.runtime.CoreException;
 
 /**
  * @author aniefer
@@ -136,7 +139,7 @@ public class CPPSemantics {
     protected static final ASTNodeProperty STRING_LOOKUP_PROPERTY = new ASTNodeProperty("CPPSemantics.STRING_LOOKUP_PROPERTY - STRING_LOOKUP"); //$NON-NLS-1$
 	public static final char[] EMPTY_NAME_ARRAY = new char[0];
 	public static final String EMPTY_NAME = ""; //$NON-NLS-1$
-	public static final char[] OPERATOR_ = new char[] {'o','p','e','r','a','t','o','r',' '};  //$NON-NLS-1$
+	public static final char[] OPERATOR_ = new char[] {'o','p','e','r','a','t','o','r',' '};  
 	public static final IType VOID_TYPE = new CPPBasicType( IBasicType.t_void, 0 );
 	
 	static protected class LookupData
@@ -749,9 +752,13 @@ public class CPPSemantics {
 		}
 		if( binding == null || binding instanceof IProblemBinding ){
 			// Let's try the pdom
-			IPDOM pdom = name.getTranslationUnit().getIndex();
-			if (pdom != null) {
-				binding = ((IPDOMResolver)pdom.getAdapter(IPDOMResolver.class)).resolveBinding(name);
+			IIndex index = name.getTranslationUnit().getIndex();
+			if (index != null) {
+				try {
+					binding = index.findBinding(name);
+				} catch (CoreException e) {
+					CCorePlugin.log(e);
+				}
 			}
 			
 			// If we're still null...
@@ -1015,7 +1022,7 @@ public class CPPSemantics {
 			
 			ArrayWrapper directives = null;
 			if( !data.usingDirectivesOnly ){
-				if( scope.isFullyCached() && !data.prefixLookup && data.astName != null ){
+				if( ASTInternal.isFullyCached(scope) && !data.prefixLookup && data.astName != null ){
 					IBinding binding = data.prefixLookup ? null : scope.getBinding( data.astName, true );
 					if( binding != null && 
 						( CPPSemantics.declaredBefore( binding, data.astName ) || 
@@ -1156,7 +1163,7 @@ public class CPPSemantics {
 				//is circular inheritance
 				if( ! data.inheritanceChain.containsKey( parent ) ){
 					//is this name define in this scope?
-					if( data.astName != null && !data.prefixLookup && parent.isFullyCached() )
+					if( data.astName != null && !data.prefixLookup && ASTInternal.isFullyCached(parent) )
 						inherited = parent.getBinding( data.astName, true );
 					else 
 						inherited = lookupInScope( data, parent, null );
@@ -1363,7 +1370,7 @@ public class CPPSemantics {
 	static protected IASTName[] lookupInScope( CPPSemantics.LookupData data, ICPPScope scope, IASTNode blockItem ) throws DOMException {
 		Object possible = null;
 		IASTNode [] nodes = null;
-		IASTNode parent = scope.getPhysicalNode();
+		IASTNode parent = ASTInternal.getPhysicalNodeOfScope(scope);
 		
 		IASTName [] namespaceDefs = null;
 		int namespaceIdx = -1;
@@ -1521,7 +1528,7 @@ public class CPPSemantics {
 		}
 		
 
-		scope.setFullyCached( true );
+		ASTInternal.setFullyCached(scope, true);
 		
 		return found;
 	}
@@ -1546,7 +1553,7 @@ public class CPPSemantics {
 				ArrayWrapper usings = new ArrayWrapper();
 				
 				boolean found = false;
-				if( temp.isFullyCached() && !data.prefixLookup ){
+				if( ASTInternal.isFullyCached(temp) && !data.prefixLookup ){
 					IBinding binding = temp.getBinding( data.astName, true );
 					if( binding != null && 
 						( CPPSemantics.declaredBefore( binding, data.astName ) || 
@@ -2155,7 +2162,7 @@ public class CPPSemantics {
 				if( scope instanceof ICPPClassScope ){
 					cls = ((ICPPClassScope)scope).getClassType();
 				} else {
-					cls = new CPPClassType.CPPClassTypeProblem( scope.getPhysicalNode(), IProblemBinding.SEMANTIC_BAD_SCOPE, fn.getNameCharArray() );
+					cls = new CPPClassType.CPPClassTypeProblem(ASTInternal.getPhysicalNodeOfScope(scope), IProblemBinding.SEMANTIC_BAD_SCOPE, fn.getNameCharArray() );
 				}
 				if( cls instanceof ICPPClassTemplate ){
 					IBinding within = CPPTemplates.instantiateWithinClassTemplate( (ICPPClassTemplate) cls );
@@ -3211,7 +3218,7 @@ public class CPPSemantics {
 	public static IBinding[] findBindings( IScope scope, char []name, boolean qualified ) throws DOMException{
 	    CPPASTName astName = new CPPASTName();
 	    astName.setName( name );
-	    astName.setParent( scope.getPhysicalNode() );
+	    astName.setParent( ASTInternal.getPhysicalNodeOfScope(scope));
 	    astName.setPropertyInParent( STRING_LOOKUP_PROPERTY );
 	    
 	    LookupData data = new LookupData( astName );
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java
index 30a6662978a..cc8bd66e0ca 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSpecialization.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  * /
  *******************************************************************************/
 /*
@@ -14,6 +15,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IBinding;
@@ -22,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.ObjectMap;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -114,5 +117,7 @@ public abstract class CPPSpecialization extends PlatformObject implements ICPPSp
 	public boolean isGloballyQualified() throws DOMException {
 		return ((ICPPInternalBinding)specialized).isGloballyQualified();
 	}
-
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java
index c49bb7aee6b..23c8e6b0846 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateDefinition.java
@@ -7,12 +7,14 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Mar 14, 2005
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
@@ -41,6 +43,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.ObjectMap;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
@@ -387,4 +390,8 @@ public abstract class CPPTemplateDefinition extends PlatformObject implements IC
 	public IASTNode getDefinition() {
 		return definition;
 	}
+	
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java
index 0506617ec1a..e8f3574ea61 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTemplateParameter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005 IBM Corporation and others.
+ * Copyright (c) 2005, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,14 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Mar 11, 2005
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
 import org.eclipse.cdt.core.dom.ast.IScope;
@@ -20,6 +22,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.core.runtime.PlatformObject;
 
@@ -153,4 +156,8 @@ public class CPPTemplateParameter extends PlatformObject implements ICPPTemplate
 			}
 		}
 	}
+	
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java
index 4f532ea3195..ddc7437e66f 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPTypedef.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,14 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Dec 11, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
 import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -23,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
 import org.eclipse.core.runtime.PlatformObject;
@@ -215,4 +218,8 @@ public class CPPTypedef extends PlatformObject implements ITypedef, ITypeContain
 			}
 		}
 	}
+	
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java
index d1df35e0560..ef0d4bcc4fa 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownBinding.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,6 +15,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -24,6 +26,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
 import org.eclipse.cdt.core.parser.util.ObjectMap;
+import org.eclipse.cdt.internal.core.dom.Linkage;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -146,7 +150,7 @@ public class CPPUnknownBinding extends PlatformObject implements ICPPInternalUnk
             if( t instanceof ICPPClassType ){
                 IScope s = ((ICPPClassType)t).getCompositeScope();
                 
-                if( s != null && s.isFullyCached() )
+                if( s != null && ASTInternal.isFullyCached(s) )
                 	result = s.getBinding( name, true );
 //                CPPSemantics.LookupData data = CPPSemantics.createLookupData( name, false );
 //                CPPSemantics.lookup( data, s );
@@ -156,4 +160,8 @@ public class CPPUnknownBinding extends PlatformObject implements ICPPInternalUnk
         }
         return result;
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java
index 79a065ee061..5160517562b 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java
@@ -23,11 +23,12 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPScope;
 import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
+import org.eclipse.cdt.internal.core.dom.parser.IASTInternalScope;
 
 /**
  * @author aniefer
  */
-public class CPPUnknownScope implements ICPPScope {
+public class CPPUnknownScope implements ICPPScope, IASTInternalScope {
     private IBinding binding = null;
     private IASTName scopeName = null;
     private CharArrayObjectMap map = null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUsingDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUsingDeclaration.java
index a00a2aa44ce..e4cb82fb173 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUsingDeclaration.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUsingDeclaration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 /*
@@ -14,6 +15,7 @@
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTNode;
@@ -25,6 +27,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 /**
@@ -152,4 +155,7 @@ public class CPPUsingDeclaration extends PlatformObject implements ICPPUsingDecl
     public void removeDeclaration( IASTNode node ) {
     }
 
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java
index 7ba986016b0..df30af7fba5 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVariable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,14 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Markus Schorn (Wind River Systems)
  *******************************************************************************/
 /*
  * Created on Nov 29, 2004
  */
 package org.eclipse.cdt.internal.core.dom.parser.cpp;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
 import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
@@ -28,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPDelegate;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 import org.eclipse.core.runtime.PlatformObject;
@@ -368,4 +371,8 @@ public class CPPVariable extends PlatformObject implements ICPPVariable, ICPPInt
     public boolean isRegister() {
         return hasStorageClass( IASTDeclSpecifier.sc_register );
     }
+    
+	public ILinkage getLinkage() {
+		return Linkage.CPP_LINKAGE;
+	}    
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java
index 1415fad55c8..a52e8b53810 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java
@@ -141,6 +141,7 @@ import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTPointerToMember;
 import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTSimpleDeclSpecifier;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
 import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
 
@@ -618,7 +619,7 @@ public class CPPVisitor {
 	    
 	    ICPPASTCompositeTypeSpecifier clsTypeSpec;
         try {
-        	IASTNode node = ((ICPPClassScope)containingScope).getPhysicalNode();
+        	IASTNode node = ASTInternal.getPhysicalNodeOfScope(containingScope);
         	if (node instanceof ICPPASTCompositeTypeSpecifier)
         		clsTypeSpec = (ICPPASTCompositeTypeSpecifier)node;
         	else
@@ -1639,7 +1640,7 @@ public class CPPVisitor {
 			IASTNode node = null;
 			while( scope != null ){
 				if( scope instanceof ICPPBlockScope ){
-					node = ((ICPPBlockScope)scope).getPhysicalNode();
+					node = ASTInternal.getPhysicalNodeOfScope(scope);
 					if( node.getParent() instanceof IASTFunctionDefinition )
 						break;
 				}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java
new file mode 100644
index 00000000000..5924c8ef5c7
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java
@@ -0,0 +1,311 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.eclipse.cdt.core.dom.IName;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.core.index.IIndexInclude;
+import org.eclipse.cdt.core.index.IIndexName;
+import org.eclipse.cdt.core.index.IndexFilter;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+
+public class CIndex implements IIndex {
+	final private IIndexFragment[] fFragments;
+	final private int fPrimaryFragmentCount;
+	private int fReadLock;
+
+	public CIndex(IIndexFragment[] fragments, int primaryFragmentCount) {
+		fFragments= fragments;
+		fPrimaryFragmentCount= primaryFragmentCount;
+	}
+
+	public CIndex(IIndexFragment[] fragments) {
+		this(fragments, fragments.length);
+	}
+
+	public IIndexBinding findBinding(ICElement element) throws CoreException {
+		// mstodo ICElement to IBinding
+		return null;
+	}
+	
+	public IIndexBinding findBinding(IName name) throws CoreException {
+		if (name instanceof IIndexFragmentName) {
+			return findBinding((IIndexFragmentName) name);
+		}
+		if (name instanceof IASTName) {
+			return findBinding((IASTName) name);
+		}
+		return null;
+	}
+
+	private IIndexBinding findBinding(IIndexFragmentName indexName) throws CoreException {
+		IIndexProxyBinding proxy= indexName.getBinding();
+		
+		if (proxy instanceof IIndexFragmentBinding) {
+			IIndexFragmentBinding binding= (IIndexFragmentBinding) proxy;
+			if (isFragment(binding.getFragment())) {
+				return binding;
+			}
+		}
+		
+		if (proxy != null) {
+			for (int i = 0; i < fFragments.length; i++) {
+				IIndexProxyBinding result= fFragments[i].adaptBinding(proxy);
+				if (result instanceof IIndexFragmentBinding) {
+					return (IIndexFragmentBinding) result;
+				}
+			}
+		}
+		return null;
+	}
+
+	private boolean isFragment(IIndexFragment frag) {
+		for (int i = 0; i < fFragments.length; i++) {
+			if (frag == fFragments[i]) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private boolean isPrimaryFragment(IIndexFragment frag) {
+		for (int i = 0; i < fPrimaryFragmentCount; i++) {
+			if (frag == fFragments[i]) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private IIndexBinding findBinding(IASTName astName) throws CoreException {
+		IIndexProxyBinding binding= null;
+		for (int i = 0; i < fFragments.length; i++) {
+			if (binding == null) {
+				binding= fFragments[i].findBinding(astName);
+				if (binding instanceof IIndexFragmentBinding) {
+					return (IIndexFragmentBinding) binding;
+				}
+			}
+			else {
+				IIndexProxyBinding alt= fFragments[i].adaptBinding(binding);
+				if (alt instanceof IIndexFragmentBinding) {
+					return (IIndexFragmentBinding) alt;
+				}
+			}
+		}
+		return null;
+	}
+	
+	public IIndexBinding[] findBindings(Pattern pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
+		return findBindings(new Pattern[]{pattern}, isFullyQualified, filter, monitor);
+	}
+	
+	public IIndexBinding[] findBindings(Pattern[] patterns, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
+		ArrayList result= new ArrayList();
+		monitor.beginTask(Messages.CIndex_FindBindingsTask_label, fFragments.length);
+		for (int i = 0; !monitor.isCanceled() && i < fFragments.length; i++) {
+			result.addAll(Arrays.asList(fFragments[i].findBindings(patterns, isFullyQualified, filter, new SubProgressMonitor(monitor, 1))));
+		}
+		monitor.done();
+		return (IIndexBinding[]) result.toArray(new IIndexBinding[result.size()]);
+	}
+
+
+	public IIndexName[] findNames(IBinding binding, int flags) throws CoreException {
+		ArrayList result= new ArrayList();
+		for (int i = 0; i < fPrimaryFragmentCount; i++) {
+			IIndexProxyBinding adaptedBinding= fFragments[i].adaptBinding(binding);
+			if (adaptedBinding != null) {
+				result.addAll(Arrays.asList(fFragments[i].findNames(adaptedBinding, flags)));
+			}
+		}
+		return (IIndexName[]) result.toArray(new IIndexName[result.size()]);
+	}
+
+	public IIndexName[] findDeclarations(IBinding binding) throws CoreException {
+		return findNames(binding, FIND_DECLARATIONS_DEFINITIONS);
+	}
+
+	public IIndexName[] findDefinitions(IBinding binding) throws CoreException {
+		return findNames(binding, FIND_DEFINITIONS);
+	}
+
+	public IIndexName[] findReferences(IBinding binding) throws CoreException {
+		return findNames(binding, FIND_REFERENCES);
+	}
+
+	public IIndexFile getFile(IPath location) throws CoreException {
+		IIndexFile result= null;
+		for (int i = 0; result==null && i < fPrimaryFragmentCount; i++) {
+			result= fFragments[i].getFile(location);
+		}
+		return result;
+	}
+
+	public IIndexFile resolveInclude(IIndexInclude include) throws CoreException {
+		IIndexFragmentInclude fragmentInclude = (IIndexFragmentInclude) include;
+		IIndexFragment frag= fragmentInclude.getFragment();
+		if (isPrimaryFragment(frag)) {
+			IIndexFile result= fragmentInclude.getIncludes();
+			if (result != null) {
+				return result;
+			}
+		}
+		Path location= new Path(include.getIncludesLocation());
+		for (int i = 0; i < fPrimaryFragmentCount; i++) {
+			IIndexFragment otherFrag = fFragments[i];
+			if (otherFrag != frag) {
+				IIndexFile result= otherFrag.getFile(location);
+				if (result != null) {
+					return result;
+				}
+			}
+		}
+		return null;
+	}
+
+	public IIndexInclude[] findIncludedBy(IIndexFile file) throws CoreException {
+		return findIncludedBy(file, 0);
+	}	
+	
+	public IIndexInclude[] findIncludedBy(IIndexFile file, int depth) throws CoreException {
+		List result= new ArrayList();
+		findIncludedBy(Collections.singletonList(file), result, depth, new HashSet());
+		return (IIndexInclude[]) result.toArray(new IIndexInclude[result.size()]);
+	}
+
+	public void findIncludedBy(List in, List out, int depth, HashSet handled) throws CoreException {
+		List nextLevel= depth != 0 ? new LinkedList() : null;
+		for (Iterator it= in.iterator(); it.hasNext(); ) {
+			IIndexFragmentFile file = (IIndexFragmentFile) it.next();
+			for (int j= 0; j < fPrimaryFragmentCount; j++) {
+				IIndexInclude[] includedBy= fFragments[j].findIncludedBy(file);
+				for (int k= 0; k < includedBy.length; k++) {
+					IIndexInclude include = includedBy[k];
+					if (handled.add(include.getIncludedByLocation())) {
+						out.add(include);
+						if (depth != 0) {
+							nextLevel.add(include.getIncludedBy());
+						}
+					}
+				}
+			}
+		}
+		if (depth == 0 || nextLevel.isEmpty()) {
+			return;
+		}
+		if (depth > 0) {
+			depth--;
+		}
+		findIncludedBy(nextLevel, out, depth, handled);
+	}
+		
+
+	public IIndexInclude[] findIncludes(IIndexFile file) throws CoreException {
+		return findIncludes(file, 0);
+	}
+	
+	public IIndexInclude[] findIncludes(IIndexFile file, int depth) throws CoreException {
+		List result= new ArrayList();
+		findIncludes(Collections.singletonList(file), result, depth, new HashSet());
+		result= result.subList(1, result.size());
+		return (IIndexInclude[]) result.toArray(new IIndexInclude[result.size()]);
+	}
+
+	public void findIncludes(List in, List out, int depth, HashSet handled) throws CoreException {
+		List nextLevel= depth != 0 ? new LinkedList() : null;
+		for (Iterator it= in.iterator(); it.hasNext(); ) {
+			IIndexFragmentFile file = (IIndexFragmentFile) it.next();
+			IIndexFragment frag= file.getIndexFragment();
+			if (isPrimaryFragment(frag)) {
+				IIndexInclude[] includes= file.getIncludes();
+				for (int k= 0; k < includes.length; k++) {
+					IIndexInclude include = includes[k];
+					if (handled.add(include.getIncludesLocation())) {
+						out.add(include);
+						if (depth != 0) {
+							IIndexFile includedByFile= resolveInclude(include);
+							if (includedByFile != null) {
+								nextLevel.add(includedByFile);
+							}
+						}
+					}
+				}
+			}
+		}
+		if (depth == 0 || nextLevel.isEmpty()) {
+			return;
+		}
+		if (depth > 0) {
+			depth--;
+		}
+		findIncludes(nextLevel, out, depth, handled);
+	}
+
+	public synchronized void acquireReadLock() throws InterruptedException {
+		if (++fReadLock == 1) {
+			int i= 0;
+			try {
+				for (i = 0; i < fFragments.length; i++) {
+					fFragments[i].acquireReadLock();
+				}
+			}
+			finally {
+				if (i < fFragments.length) {
+					// rollback
+					fReadLock--;
+					while (--i >= 0) {
+						fFragments[i].releaseReadLock();
+					}
+				}
+			}
+		}
+	}
+
+	public synchronized void releaseReadLock() {
+		if (--fReadLock == 0) {
+			for (int i=0; i < fFragments.length; i++) {
+				fFragments[i].releaseReadLock();
+			}
+		}
+	}
+	
+	protected synchronized int getReadLockCount() {
+		return fReadLock;
+	}
+
+	public long getLastWriteAccess() {
+		long result= 0;
+		for (int i=0; i < fFragments.length; i++) {
+			result= Math.max(result, fFragments[i].getLastWriteAccess());
+		}
+		return result;
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java
new file mode 100644
index 00000000000..d951fff3573
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.cdt.core.dom.IName;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.core.index.IIndexInclude;
+import org.eclipse.cdt.core.index.IIndexName;
+import org.eclipse.cdt.core.index.IndexFilter;
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+final public class EmptyCIndex implements IIndex {
+	public static IIndex INSTANCE= new EmptyCIndex();
+	
+	private EmptyCIndex() {
+	}
+	
+	public IIndexBinding findBinding(ICElement element) {
+		return null;
+	}
+
+	public IIndexName[] findDeclarations(IBinding binding) {
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
+	}
+
+	public IIndexName[] findDefinitions(IBinding binding) {
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
+	}
+
+	public IIndexName[] findReferences(IBinding binding) {
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
+	}
+
+	public IIndexName[] findNames(IBinding binding, int flags) {
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
+	}
+
+	public IIndexFile getFile(IPath location) {
+		return null;
+	}
+
+	public IIndexFile resolveInclude(IIndexInclude include) {
+		return null;
+	}
+
+	public IIndexInclude[] findIncludedBy(IIndexFile file) {
+		return IIndexInclude.EMPTY_INCLUDES_ARRAY;
+	}
+
+	public IIndexInclude[] findIncludedBy(IIndexFile file, int depth) {
+		return IIndexInclude.EMPTY_INCLUDES_ARRAY;
+	}
+
+	public IIndexInclude[] findIncludes(IIndexFile file) {
+		return IIndexInclude.EMPTY_INCLUDES_ARRAY;
+	}
+
+	public IIndexInclude[] findIncludes(IIndexFile file, int depth) {
+		return IIndexInclude.EMPTY_INCLUDES_ARRAY;
+	}
+
+	public void acquireReadLock() {
+	}
+
+	public void releaseReadLock() {
+	}
+
+	public long getLastWriteAccess() {
+		return 0;
+	}
+
+	public IIndexBinding findBinding(IName name) {
+		return null;
+	}
+
+	public IIndexBinding[] findBindings(Pattern pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) {
+		return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
+	}
+
+	public IIndexBinding[] findBindings(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
+		return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
+	}
+}
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java
new file mode 100644
index 00000000000..4cd52eb95f0
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IBinding;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IndexFilter;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Interface for the implementation of the actual index storage mechanism.
+ * 
+ * @since 4.0
+ */
+public interface IIndexFragment {
+	/**
+	 * @see IIndex#FIND_DECLARATIONS
+	 */
+	final int FIND_DECLARATIONS = IIndex.FIND_DECLARATIONS;
+	/**
+	 * @see IIndex#FIND_DEFINITIONS
+	 */
+	final int FIND_DEFINITIONS  = IIndex.FIND_DEFINITIONS;
+	/**
+	 * @see IIndex#FIND_REFERENCES
+	 */
+	final int FIND_REFERENCES   = IIndex.FIND_REFERENCES;
+	/**
+	 * @see IIndex#FIND_DECLARATIONS_DEFINITIONS
+	 */
+	final int FIND_DECLARATIONS_DEFINITIONS = IIndex.FIND_DECLARATIONS_DEFINITIONS;
+	/**
+	 * @see IIndex#FIND_ALL_OCCURENCES
+	 */
+	final int FIND_ALL_OCCURENCES = 		  IIndex.FIND_ALL_OCCURENCES;
+
+	/**
+	 * Returns the file for the given location. May return <code>null</code>, if no such file exists.
+	 * This method may only return files that are actually managed by this fragement.
+	 * @param location absolute path to the location of the file
+	 * @return the file for the location
+	 * @throws CoreException
+	 */
+	IIndexFragmentFile getFile(IPath location) throws CoreException;
+
+	/**
+	 * Returns all include directives that point to the given file. The input file may belong to 
+	 * another fragment. All of the include directives returned must belong to files managed by 
+	 * this fragment.
+	 * @param file a file to search for includes pointing to it
+	 * @return an array of inlucde directives managed by this fragment
+	 * @throws CoreException
+	 */
+	IIndexFragmentInclude[] findIncludedBy(IIndexFragmentFile file) throws CoreException;
+	
+	/**
+	 * Looks for a binding matching the given one. May return <code>null</code>, if no
+	 * such binding exists. The binding may belong to an AST or another index fragment.
+	 * @param binding the binding to look for.
+	 * @return the binding, or <code>null</code>
+	 * @throws CoreException 
+	 */
+	IIndexProxyBinding adaptBinding(IBinding binding) throws CoreException;
+
+	/**
+	 * Looks for a proxy binding matching the given one. May return <code>null</code>, if no
+	 * such binding exists. The binding may belong to another index fragment.
+	 * @param proxy the binding to look for.
+	 * @return the binding, or <code>null</code>
+	 * @throws CoreException 
+	 */
+	IIndexProxyBinding adaptBinding(IIndexProxyBinding proxy) throws CoreException;
+
+	/**
+	 * Looks for a binding of the given name from the AST. May return <code>null</code>, if no
+	 * such binding exists.
+	 * @param astName the name for looking up the binding
+	 * @return the binding for the name, or <code>null</code>
+	 * @throws CoreException
+	 */
+	IIndexProxyBinding findBinding(IASTName astName) throws CoreException;
+	
+	/**
+	 * Searches for all bindings with qualified names that seen as an array of simple names match the given array 
+	 * of patterns. In case a binding exists in multiple projects, no duplicate bindings are returned.
+	 * You can search with an array of patterns that specifies a partial qualification only. 
+	 * @param patterns an array of patterns the names of the qualified name of the bindings have to match.
+	 * @param isFullyQualified if <code>true</code>, the array of pattern specifies the fully qualified name
+	 * @param filter a filter that allows for skipping parts of the index 
+	 * @param monitor a monitor to report progress
+	 * @return an array of bindings matching the pattern
+	 * @throws CoreException
+	 */
+	IIndexFragmentBinding[] findBindings(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException;
+
+	/**
+	 * Searches for all names that resolve to the given binding. You can limit the result to references, declarations
+	 * or definitions, or a combination of those.
+	 * @param binding a binding for which names are searched for
+	 * @param flags a combination of {@link #FIND_DECLARATIONS}, {@link #FIND_DEFINITIONS} and {@link #FIND_REFERENCES}
+	 * @return an array of names
+	 * @throws CoreException
+	 */
+	IIndexFragmentName[] findNames(IIndexProxyBinding binding, int flags) throws CoreException;
+	
+	/**
+	 * Acquires a read lock.
+	 * @throws InterruptedException
+	 */
+	void acquireReadLock() throws InterruptedException;
+
+	/**
+	 * Releases a read lock.
+	 */
+	void releaseReadLock();
+	
+	/**
+	 * Returns the timestamp of the last modification to the index.
+	 */
+	long getLastWriteAccess();
+
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentBinding.java
new file mode 100644
index 00000000000..b80265b9cb4
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentBinding.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.index.IIndexBinding;
+
+public interface IIndexFragmentBinding extends IIndexBinding, IIndexProxyBinding {
+	IIndexFragmentBinding[] EMPTY_INDEX_BINDING_ARRAY= new IIndexFragmentBinding[0];
+}
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentFile.java
similarity index 52%
rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMWriter.java
rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentFile.java
index 4bb5fd0fc1b..c6e1e27a2da 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/IPDOMWriter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentFile.java
@@ -1,24 +1,23 @@
 /*******************************************************************************
- * Copyright (c) 2006 QNX Software Systems and others.
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- * QNX - Initial API and implementation
- *******************************************************************************/
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
 
-package org.eclipse.cdt.core.dom;
+package org.eclipse.cdt.internal.core.index;
 
-import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.cdt.core.index.IIndexFile;
 
-/**
- * This is the interface used by clients, such as indexers, to
- * write content to the PDOM.
- * 
- * @author Doug Schaefer
- */
-public interface IPDOMWriter extends IAdaptable {
+public interface IIndexFragmentFile extends IIndexFile {
+
+	/**
+	 * Returns the fragment that owns this file.
+	 */
+	IIndexFragment getIndexFragment();
 
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentInclude.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentInclude.java
new file mode 100644
index 00000000000..a690ad823b6
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentInclude.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.index.IIndexInclude;
+import org.eclipse.core.runtime.CoreException;
+
+public interface IIndexFragmentInclude extends IIndexInclude {
+
+	/**
+	 * Returns the fragment that owns this include.
+	 */
+	IIndexFragment getFragment();
+
+	/**
+	 * Returns the file that is included by this include. May return <code>null</code> in case
+	 * the included file is not part of this fragment.
+	 */
+	IIndexFragmentFile getIncludes() throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentName.java
new file mode 100644
index 00000000000..391d19f2c51
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragmentName.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.index.IIndexName;
+import org.eclipse.core.runtime.CoreException;
+
+public interface IIndexFragmentName extends IIndexName {
+	
+	public static final IIndexFragmentName[] EMPTY_NAME_ARRAY = new IIndexFragmentName[0];
+
+	/**
+	 * Returns the fragment that owns this name.
+	 */
+	IIndexFragment getIndexFragment();
+
+	/**
+	 * Returns the (proxy) binding the name resolves to.
+	 */
+	IIndexProxyBinding getBinding() throws CoreException;
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexProxyBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexProxyBinding.java
new file mode 100644
index 00000000000..f22008f9380
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexProxyBinding.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.dom.ILinkage;
+import org.eclipse.core.runtime.CoreException;
+
+public interface IIndexProxyBinding {
+	/**
+	 * Returns the owner of the binding.
+	 */
+	IIndexFragment getFragment();
+
+	/**
+	 * Returns the linkage the binding belongs to.
+	 */
+	ILinkage getLinkage() throws CoreException;
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java
new file mode 100644
index 00000000000..9a10107b0fa
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndex.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Interface used by the indexer to write to the index. 
+ *
+ * @since 4.0
+ */
+public interface IWritableIndex extends IIndex {
+
+	/**
+	 * Creates a file object for the given location or returns an existing one.
+	 */
+	IIndexFragmentFile addFile(String fileLocation) throws CoreException;
+
+	/**
+	 * Adds an AST name to the given file.
+	 */
+	void addName(IIndexFragmentFile sourceFile, IASTName name) throws CoreException;
+
+	/**
+	 * Adds a AST macro to the given file.
+	 */
+	void addMacro(IIndexFragmentFile sourceFile, IASTPreprocessorMacroDefinition macro) throws CoreException;
+
+	/**
+	 * Adds an include to the given file.
+	 */
+	void addInclude(IIndexFragmentFile sourceFile, IIndexFragmentFile destFile) throws CoreException;
+
+	/**
+	 * Clears the entire index.
+	 */
+	void clear() throws CoreException;
+
+	/**
+	 * Clears the given file in the index.
+	 */
+	void clearFile(IIndexFragmentFile file) throws CoreException;
+
+	/**
+	 * Acquires a write lock, while giving up a certain amount of read locks.
+	 */
+	void acquireWriteLock(int giveupReadLockCount) throws InterruptedException;
+
+	/**
+	 * Releases a write lock, reestablishing a certain amount of read locks.
+	 */
+	void releaseWriteLock(int establishReadLockCount);
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java
new file mode 100644
index 00000000000..b2681ce0d24
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexFragment.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * The interface that an actual storage for an index has to implement.
+ */
+public interface IWritableIndexFragment extends IIndexFragment {
+
+	/**
+	 * Clears the entire fragment.
+	 */
+	void clear() throws CoreException;
+
+	/**
+	 * Clears the given file in the index.
+	 */
+	void clearFile(IIndexFragmentFile file) throws CoreException;
+
+	/**
+	 * Creates a file object for the given location or returns an existing one.
+	 */
+	IIndexFragmentFile addFile(String fileLocation) throws CoreException;
+
+	/**
+	 * Adds an include to the given file.
+	 */
+	void addInclude(IIndexFragmentFile sourceFile, IIndexFragmentFile destFile) throws CoreException;
+
+	/**
+	 * Adds a AST macro to the given file.
+	 */
+	void addMacro(IIndexFragmentFile sourceFile, IASTPreprocessorMacroDefinition macro) throws CoreException;
+
+	/**
+	 * Adds an AST name to the given file.
+	 */
+	void addName(IIndexFragmentFile sourceFile, IASTName name) throws CoreException;
+
+	/**
+	 * Acquires a write lock, while giving up a certain amount of read locks.
+	 */
+	void acquireWriteLock(int giveupReadLockCount) throws InterruptedException;
+	
+	/**
+	 * Releases a write lock, reestablishing a certain amount of read locks.
+	 */
+	void releaseWriteLock(int establishReadLockCount);
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexManager.java
new file mode 100644
index 00000000000..bda7cfd95a0
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IWritableIndexManager.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.index.IIndexManager;
+import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.core.runtime.CoreException;
+
+public interface IWritableIndexManager extends IIndexManager {
+
+	IWritableIndex getWritableIndex(ICProject project) throws CoreException;
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMCodeReaderFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexBasedCodeReaderFactory.java
similarity index 58%
rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMCodeReaderFactory.java
rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexBasedCodeReaderFactory.java
index 397fe3c2b4a..af91825ed43 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMCodeReaderFactory.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IndexBasedCodeReaderFactory.java
@@ -7,8 +7,9 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
-package org.eclipse.cdt.internal.core.pdom;
+package org.eclipse.cdt.internal.core.index;
 
 import java.io.File;
 import java.io.IOException;
@@ -22,53 +23,34 @@ import java.util.Set;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ICodeReaderFactory;
-import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.core.model.IWorkingCopy;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.core.index.IIndexInclude;
 import org.eclipse.cdt.core.parser.CodeReader;
 import org.eclipse.cdt.core.parser.ICodeReaderCache;
 import org.eclipse.cdt.core.parser.IMacro;
 import org.eclipse.cdt.core.parser.IScanner;
 import org.eclipse.cdt.core.parser.ParserUtil;
 import org.eclipse.cdt.internal.core.parser.scanner2.ObjectStyleMacro;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMMacro;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.Path;
 
 /**
  * @author Doug Schaefer
  *
  */
-public class PDOMCodeReaderFactory implements ICodeReaderFactory {
+public class IndexBasedCodeReaderFactory implements ICodeReaderFactory {
 
-	private final PDOM pdom;
+	private final IIndex index;
 	
-	private List workingCopies = new ArrayList(1);
 	private Map fileCache = new HashMap(); // filename, pdomFile
 	private Map macroCache = new HashMap();// record, list of IMacros
-	
 	private List usedMacros = new ArrayList();
 	
 	private static final char[] EMPTY_CHARS = new char[0];
 	
-	public PDOMCodeReaderFactory(PDOM pdom) {
-		this.pdom = pdom;
-	}
-
-	public PDOMCodeReaderFactory(PDOM pdom, IWorkingCopy workingCopy) {
-		this(pdom);
-		workingCopies.add(workingCopy);
-	}
-	
-	public PDOMFile getCachedFile(String filename) throws CoreException {
-		PDOMFile file = (PDOMFile)fileCache.get(filename);
-		if (file == null) {
-			file = pdom.addFile(filename);
-			fileCache.put(filename, file);
-		}
-		return file;
+	public IndexBasedCodeReaderFactory(IIndex index) {
+		this.index = index;
 	}
 	
 	public int getUniqueIdentifier() {
@@ -76,38 +58,30 @@ public class PDOMCodeReaderFactory implements ICodeReaderFactory {
 	}
 
 	public CodeReader createCodeReaderForTranslationUnit(String path) {
-		return ParserUtil.createReader(path,
-				workingCopies != null ? workingCopies.iterator() : null);
-	}
-
-	public CodeReader createCodeReaderForTranslationUnit(ITranslationUnit tu) {
-		return new CodeReader(tu.getResource().getLocation().toOSString(), tu.getContents());
+		return ParserUtil.createReader(path, null);
 	}
 	
-	private void fillMacros(PDOMFile file, IScanner scanner, Set visited) throws CoreException {
-		Integer record = new Integer(file.getRecord());
-		if (visited.contains(record))
+	private void fillMacros(IIndexFragmentFile file, IScanner scanner, Set visited) throws CoreException {
+		Object key= file.getLocation();	// mstodo revisit, the pdom-id was faster but cannot be used in indexes.
+		if (!visited.add(key)) {
 			return;
-		visited.add(record);
+		}
 
 		// Follow the includes
-		PDOMInclude include = file.getFirstInclude();
-		while (include != null) {
-			fillMacros(include.getIncludes(), scanner, visited);
-			include = include.getNextInIncludes();
+		IIndexInclude[] includeDirectives= file.getIncludes();
+		for (int i = 0; i < includeDirectives.length; i++) {
+			IIndexFragmentFile includedFile= (IIndexFragmentFile) index.resolveInclude(includeDirectives[i]);
+			if (includedFile != null) {
+				fillMacros(includedFile, scanner, visited);
+			}
+			// mstodo revisit, what if includedFile == null (problem with index??)
 		}
 		
 		// Add in my macros now
-		IMacro[] macros = (IMacro[])macroCache.get(record);
+		IMacro[] macros = (IMacro[]) macroCache.get(key);
 		if (macros == null) {
-			List macroList = new ArrayList();
-			PDOMMacro macro = file.getFirstMacro();
-			while (macro != null) {
-				macroList.add(macro.getMacro());
-				macro = macro.getNextMacro();
-			}
-			macros = (IMacro[])macroList.toArray(new IMacro[macroList.size()]);
-			macroCache.put(record, macros);
+			macros= file.getMacros();
+			macroCache.put(key, macros);
 		}
 
 		for (int i = 0; i < macros.length; ++i)
@@ -128,11 +102,12 @@ public class PDOMCodeReaderFactory implements ICodeReaderFactory {
 			} catch (IOException e) {
 				// ignore and use the path we were passed in
 			}
-			PDOMFile file = (PDOMFile)fileCache.get(path);
+			IIndexFragmentFile file = getCachedFile(path);
 			if (file == null) {
-				file = pdom.getFile(path);
-				if (file != null)
-					fileCache.put(path, file);
+				file = (IIndexFragmentFile) index.getFile(new Path(path));
+				if (file != null) {
+					addFileToCache(path, file);
+				}
 			}
 			if (file != null) {
 				// Already got things from here,
@@ -141,8 +116,7 @@ public class PDOMCodeReaderFactory implements ICodeReaderFactory {
 				return new CodeReader(path, EMPTY_CHARS);
 			}
 		} catch (CoreException e) {
-			CCorePlugin.log(new CoreException(new Status(IStatus.ERROR,
-					CCorePlugin.PLUGIN_ID, 0, "PDOM Exception", e)));
+			CCorePlugin.log(e); 
 		}
 		
 		return ParserUtil.createReader(path, null);
@@ -166,4 +140,28 @@ public class PDOMCodeReaderFactory implements ICodeReaderFactory {
 		return null;
 	}
 
+	protected IIndexFragmentFile getCachedFile(String filename) throws CoreException {
+		IIndexFragmentFile file = (IIndexFragmentFile) fileCache.get(filename);
+		if (file == null) {
+			file = (IIndexFragmentFile) index.getFile(new Path(filename));
+			if (file != null) {
+				addFileToCache(filename, file);
+			}
+		}
+		return file;
+	}
+	
+	protected void addFileToCache(String filename, IIndexFile file) {
+		fileCache.put(filename, file);
+	}
+
+	public IIndexFragmentFile createCachedFile(IWritableIndex index, String location) throws CoreException {
+		assert this.index == index;
+		
+		IIndexFragmentFile file= getCachedFile(location);
+		if (file == null) {
+			file= index.addFile(location);
+		}
+		return file;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/Messages.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/Messages.java
new file mode 100644
index 00000000000..f643b9d53b5
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/Messages.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.core.index.messages"; //$NON-NLS-1$
+	public static String CIndex_FindBindingsTask_label;
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+
+	private Messages() {
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java
new file mode 100644
index 00000000000..480581059f9
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/WritableCIndex.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.index;
+
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
+import org.eclipse.core.runtime.CoreException;
+
+public class WritableCIndex extends CIndex implements IWritableIndex {
+
+	final private IWritableIndexFragment[] fWritableFragments;
+	private boolean fIsWriteLocked= false;
+
+	public WritableCIndex(IWritableIndexFragment[] writable, IIndexFragment[] readonly) {
+		super (concat(writable, readonly));
+		fWritableFragments= writable;
+	}
+
+	private static IIndexFragment[] concat(IIndexFragment[] writable, IIndexFragment[] readonly) {
+		IIndexFragment[] result= new IIndexFragment[writable.length + readonly.length];
+		System.arraycopy(writable, 0, result, 0, writable.length);
+		System.arraycopy(readonly, 0, result, writable.length, readonly.length);
+		return result;
+	}
+
+	public IIndexFragmentFile addFile(String fileLocation) throws CoreException {
+		IWritableIndexFragment frag= selectFragment(fileLocation);
+		
+		return frag.addFile(fileLocation);
+	}
+
+	private IWritableIndexFragment selectFragment(String fileLocation) {
+		// todo handling of multiple writable indices
+		assert fWritableFragments.length == 1;
+		return fWritableFragments[0];
+	}
+
+	public void addInclude(IIndexFragmentFile sourceFile, IIndexFragmentFile destFile) throws CoreException {
+		IIndexFragment indexFragment = sourceFile.getIndexFragment();
+		assert isWritableFragment(indexFragment);
+		assert isWritableFragment(destFile.getIndexFragment());
+		
+		((IWritableIndexFragment) indexFragment).addInclude(sourceFile, destFile);
+	}
+
+	private boolean isWritableFragment(IIndexFragment frag) {
+		for (int i = 0; i < fWritableFragments.length; i++) {
+			if (fWritableFragments[i] == frag) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	public void addMacro(IIndexFragmentFile sourceFile,	IASTPreprocessorMacroDefinition macro) throws CoreException {
+		IIndexFragment indexFragment = sourceFile.getIndexFragment();
+		assert isWritableFragment(indexFragment);
+		
+		((IWritableIndexFragment) indexFragment).addMacro(sourceFile, macro);
+	}
+
+	public void addName(IIndexFragmentFile sourceFile, IASTName name) throws CoreException {
+		IIndexFragment indexFragment = sourceFile.getIndexFragment();
+		assert isWritableFragment(indexFragment);
+		
+		((IWritableIndexFragment) indexFragment).addName(sourceFile, name);
+	}
+
+	public void clear() throws CoreException {
+		for (int i = 0; i < fWritableFragments.length; i++) {
+			IWritableIndexFragment frag = fWritableFragments[i];
+			frag.clear();
+		}
+	}
+
+	public void clearFile(IIndexFragmentFile file) throws CoreException {
+		IIndexFragment indexFragment = file.getIndexFragment();
+		assert isWritableFragment(indexFragment);
+		
+		((IWritableIndexFragment) indexFragment).clearFile(file);
+	}
+
+	
+	public synchronized void acquireReadLock() throws InterruptedException {
+		assert !fIsWriteLocked: "Read locks are not allowed while write-locked."; //$NON-NLS-1$
+		super.acquireReadLock();
+	}
+
+	public synchronized void releaseReadLock() {
+		assert !fIsWriteLocked: "Read locks are not allowed while write-locked."; //$NON-NLS-1$
+		super.releaseReadLock();
+	}
+
+	public synchronized void acquireWriteLock(int giveupReadlockCount) throws InterruptedException {
+		assert !fIsWriteLocked: "Multiple write locks is not allowed"; //$NON-NLS-1$
+		assert giveupReadlockCount == getReadLockCount(): "Unexpected read lock is not allowed"; //$NON-NLS-1$
+		
+		fIsWriteLocked= true;
+		int i= 0;
+		try {
+			for (i = 0; i < fWritableFragments.length; i++) {
+				fWritableFragments[i].acquireWriteLock(giveupReadlockCount);
+			}
+		}
+		finally {
+			if (i < fWritableFragments.length) {
+				// rollback
+				fIsWriteLocked= false;
+				while (--i >= 0) {
+					fWritableFragments[i].releaseWriteLock(giveupReadlockCount);
+				}
+			}
+		}
+	}
+
+	public synchronized void releaseWriteLock(int establishReadlockCount) {
+		assert fIsWriteLocked: "No write lock to be released"; //$NON-NLS-1$
+		assert establishReadlockCount == getReadLockCount(): "Unexpected read lock is not allowed"; //$NON-NLS-1$
+
+		fIsWriteLocked= false;
+		int i= 0;
+		for (i = 0; i < fWritableFragments.length; i++) {
+			fWritableFragments[i].releaseWriteLock(establishReadlockCount);
+		}
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/messages.properties b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/messages.properties
new file mode 100644
index 00000000000..cfa64aacf3e
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/messages.properties
@@ -0,0 +1 @@
+CIndex_FindBindingsTask_label=Find Bindings
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java
index 9402ccb924a..713e0bfa9fb 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/LocationMap.java
@@ -7,9 +7,11 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.parser.scanner2;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
 import org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter;
 import org.eclipse.cdt.core.dom.ast.IASTMacroExpansion;
@@ -40,6 +42,7 @@ import org.eclipse.cdt.core.parser.CodeReader;
 import org.eclipse.cdt.core.parser.IMacro;
 import org.eclipse.cdt.core.parser.util.ArrayUtil;
 import org.eclipse.cdt.core.parser.util.CharArrayUtils;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
 import org.eclipse.cdt.internal.core.dom.parser.ASTPreprocessorSelectionResult;
 
@@ -708,6 +711,10 @@ public class LocationMap implements ILocationResolver, IScannerPreprocessorLog {
         public void setBinding(IBinding binding) {
             //do nothing
         }
+        
+    	public ILinkage getLinkage() {
+    		return Linkage.NO_LINKAGE;
+    	}
     }
 
     /**
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/MacroBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/MacroBinding.java
index 52694649582..7d1a1327e11 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/MacroBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/MacroBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2005 IBM Corporation and others.
+ * Copyright (c) 2004, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -7,12 +7,15 @@
  *
  * Contributors:
  * IBM - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.parser.scanner2;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IMacroBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
+import org.eclipse.cdt.internal.core.dom.Linkage;
 import org.eclipse.core.runtime.PlatformObject;
 
 public class MacroBinding extends PlatformObject implements IMacroBinding {
@@ -47,5 +50,7 @@ public class MacroBinding extends PlatformObject implements IMacroBinding {
         return definition;
     }
     
-
+	public ILinkage getLinkage() {
+		return Linkage.NO_LINKAGE;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/Messages.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/Messages.java
new file mode 100644
index 00000000000..46fa8d8d52d
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/Messages.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.cdt.internal.core.pdom;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.core.pdom.messages"; //$NON-NLS-1$
+	public static String WritablePDOM_error_unknownLinkage;
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+
+	private Messages() {
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
index 6e6165cb00e..3870e564894 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java
@@ -12,6 +12,7 @@
 package org.eclipse.cdt.internal.core.pdom;
 
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -20,24 +21,31 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.ICodeReaderFactory;
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.IName;
 import org.eclipse.cdt.core.dom.IPDOM;
 import org.eclipse.cdt.core.dom.IPDOMNode;
-import org.eclipse.cdt.core.dom.IPDOMResolver;
 import org.eclipse.cdt.core.dom.IPDOMVisitor;
-import org.eclipse.cdt.core.dom.IPDOMWriter;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.model.ILanguage;
-import org.eclipse.cdt.core.model.IWorkingCopy;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexName;
+import org.eclipse.cdt.core.index.IndexFilter;
 import org.eclipse.cdt.core.model.LanguageManager;
+import org.eclipse.cdt.internal.core.index.IIndexFragment;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentInclude;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentName;
+import org.eclipse.cdt.internal.core.index.IIndexProxyBinding;
 import org.eclipse.cdt.internal.core.pdom.db.BTree;
 import org.eclipse.cdt.internal.core.pdom.db.Database;
 import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
+import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMInclude;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
@@ -54,7 +62,7 @@ import org.eclipse.core.runtime.Status;
  * 
  * @author Doug Schaefer
  */
-public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMWriter {
+public class PDOM extends PlatformObject implements IIndexFragment, IPDOM {
 
 	private Database db;
 	
@@ -78,19 +86,14 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 	
 	// Local caches
 	private BTree fileIndex;
-	private Map linkageCache = new HashMap();
+	private Map fLinkageIDCache = new HashMap();
 	
 	public PDOM(IPath dbPath) throws CoreException {
 		// Load up the database
 		db = new Database(dbPath.toOSString());
 		
 		if (db.getVersion() == VERSION) {
-			// populate the linkage cache
-			PDOMLinkage linkage = getFirstLinkage();
-			while (linkage != null) {
-				linkageCache.put(linkage.getLanguage().getId(), linkage);
-				linkage = linkage.getNextLinkage();
-			}
+			readLinkages();
 		}
 	}
 	
@@ -101,24 +104,12 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 		} else
 			return false;
 	}
-
-	public Object getAdapter(Class adapter) {
-		if (adapter == IPDOM.class)
-			return this;
-		else if (adapter == IPDOMResolver.class)
-			return this;
-		else if (adapter == IPDOMWriter.class)
-			return this;
-		else if (adapter == PDOM.class)
-			// TODO this use is deprecated (or bad at least)
-			return this;
-		else
-			return super.getAdapter(adapter);
-	}
 	
 	public void accept(IPDOMVisitor visitor) throws CoreException {
-		for (PDOMLinkage linkage = getFirstLinkage(); linkage != null; linkage = linkage.getNextLinkage())
+		for (Iterator iter = fLinkageIDCache.values().iterator(); iter.hasNext();) {
+			PDOMLinkage linkage = (PDOMLinkage) iter.next();
 			linkage.accept(visitor);
+		}
 	}
 	
 	public static interface IListener {
@@ -164,11 +155,11 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 		return record != 0 ? new PDOMFile(this, record) : null;
 	}
 	
-	public PDOMFile getFile(IPath path) throws CoreException {
+	public IIndexFragmentFile getFile(IPath path) throws CoreException {
 		return getFile(path.toOSString());
 	}
 	
-	public PDOMFile addFile(String filename) throws CoreException {
+	protected IIndexFragmentFile addFile(String filename) throws CoreException {
 		PDOMFile file = getFile(filename);
 		if (file == null) {
 			file = new PDOMFile(this, filename);
@@ -177,7 +168,7 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 		return file;		
 	}
 	
-	public void clear() throws CoreException {
+	protected void clear() throws CoreException {
 		Database db = getDB();
 		// Clear out the database
 		db.clear();
@@ -187,38 +178,23 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 		fileIndex = null;
 		
 		db.putInt(LINKAGES, 0);
-		linkageCache.clear();
+		fLinkageIDCache.clear();
 	}
 
 	public boolean isEmpty() throws CoreException {
-		return getFirstLinkage() == null;
-	}
-
-	public ICodeReaderFactory getCodeReaderFactory() {
-		return new PDOMCodeReaderFactory(this);
-	}
-
-	public ICodeReaderFactory getCodeReaderFactory(IWorkingCopy root) {
-		return new PDOMCodeReaderFactory(this, root);
+		return getFirstLinkageRecord() == 0;
 	}
 
+	/**
+	 * @deprecated use findDeclarations() instead.
+	 */
 	public IName[] getDeclarations(IBinding binding) throws CoreException {
-		if (binding instanceof PDOMBinding) {
-			List names = new ArrayList();
-			for (PDOMName name = ((PDOMBinding)binding).getFirstDeclaration();
-					name != null;
-					name = name.getNextInBinding())
-				names.add(name);
-			// Add in definitions, too
-			for (PDOMName name = ((PDOMBinding)binding).getFirstDefinition();
-					name != null;
-					name = name.getNextInBinding())
-				names.add(name);
-			return (IName[])names.toArray(new IName[names.size()]);
-		}
-		return IName.EMPTY_NAME_ARRAY;
+		return findNames(binding, IIndex.FIND_DECLARATIONS_DEFINITIONS);
 	}
 
+	/**
+	 * @deprecated use findDefinitions() instead
+	 */
 	public IName[] getDefinitions(IBinding binding) throws CoreException {
 		if (binding instanceof PDOMBinding) {
 			List names = new ArrayList();
@@ -226,11 +202,14 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 					name != null;
 					name = name.getNextInBinding())
 				names.add(name);
-			return (IName[])names.toArray(new IName[names.size()]);
+			return (IName[]) names.toArray(new IIndexName[names.size()]);
 		}
-		return IName.EMPTY_NAME_ARRAY;
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
 	}
-	
+
+	/**
+	 * @deprecated use findReferences() instead
+	 */
 	public IName[] getReferences(IBinding binding) throws CoreException {
 		if (binding instanceof PDOMBinding) {
 			List names = new ArrayList();
@@ -238,19 +217,16 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 					name != null;
 					name = name.getNextInBinding())
 				names.add(name);
-			return (IName[])names.toArray(new IName[names.size()]);
+			return (IName[]) names.toArray(new IIndexName[names.size()]);
 		}
-		return IName.EMPTY_NAME_ARRAY;
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
 	}
-	
-	public IBinding resolveBinding(IASTName name) {
-		try {
-			ILanguage language = name.getTranslationUnit().getLanguage();
-			return getLinkage(language).resolveBinding(name);
-		} catch (CoreException e) {
-			CCorePlugin.log(e);
-		}
 		
+	public IIndexProxyBinding findBinding(IASTName name) throws CoreException {
+		PDOMLinkage linkage= adaptLinkage(name.getLinkage());
+		if (linkage != null) {
+			return linkage.resolveBinding(name);
+		}
 		return null;
 	}
 
@@ -258,14 +234,19 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 		private final Pattern[] pattern;
 		private final IProgressMonitor monitor;
 		
-		private final IBinding[] match;
-		private int level = 0;
+		private final ArrayList currentPath= new ArrayList();
+		private final ArrayList matchStack= new ArrayList();
 		private List bindings = new ArrayList();
+		private boolean isFullyQualified;
+		private BitSet matchesUpToLevel;
 		
-		public BindingFinder(Pattern[] pattern, IProgressMonitor monitor) {
+		public BindingFinder(Pattern[] pattern, boolean isFullyQualified, IProgressMonitor monitor) {
 			this.pattern = pattern;
 			this.monitor = monitor;
-			match = new IBinding[pattern.length];
+			this.isFullyQualified= isFullyQualified;
+			matchesUpToLevel= new BitSet();
+			matchesUpToLevel.set(0);
+			matchStack.add(matchesUpToLevel);
 		}
 		
 		public boolean visit(IPDOMNode node) throws CoreException {
@@ -274,71 +255,117 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 			
 			if (node instanceof IBinding) {
 				IBinding binding = (IBinding)node;
-				if (pattern[level].matcher(binding.getName()).matches()) {
-					if (level < pattern.length - 1) {
-						match[level++] = binding;
-					} else {
-						bindings.add(binding);
-						// Only visit children if using simple name
-						return pattern.length == 1;
+				String name = binding.getName();
+
+				// check if we have a complete match.
+				final int lastIdx = pattern.length-1;
+				if (matchesUpToLevel.get(lastIdx) && pattern[lastIdx].matcher(name).matches()) {
+					bindings.add(binding);
+				}
+						
+				// check if we have a partial match
+				if (binding instanceof IPDOMMemberOwner) {
+					boolean visitNextLevel= false;
+					BitSet updatedMatchesUpToLevel= new BitSet();
+					if (!isFullyQualified) {
+						updatedMatchesUpToLevel.set(0);
+						visitNextLevel= true;
+					}
+					for (int i=0; i < lastIdx; i++) {
+						if (matchesUpToLevel.get(i) && pattern[i].matcher(name).matches()) {
+							updatedMatchesUpToLevel.set(i+1);
+							visitNextLevel= true;
+						}
+					}
+					if (visitNextLevel) {
+						matchStack.add(matchesUpToLevel);
+						matchesUpToLevel= updatedMatchesUpToLevel;
+						currentPath.add(binding);
+						return true;
 					}
 				}
+				return false;
 			}
+			return false;
+		}
 
-			return true;
-		}
-		
 		public void leave(IPDOMNode node) throws CoreException {
-			if (node instanceof IBinding) {
-				if (level > 0 && match[level - 1] == (IBinding)node)
-					// pop the stack
-					--level;
+			final int idx= currentPath.size()-1;
+			if (idx >= 0 && currentPath.get(idx) == node) {
+				currentPath.remove(idx);
+				matchesUpToLevel= (BitSet) matchStack.remove(matchStack.size()-1);
 			}
 		}
 		
-		public IBinding[] getBindings() {
-			return (IBinding[])bindings.toArray(new IBinding[bindings.size()]);
+		public IIndexFragmentBinding[] getBindings() {
+			return (IIndexFragmentBinding[])bindings.toArray(new IIndexFragmentBinding[bindings.size()]);
 		}
 	}
 	
+	/** 
+	 * @deprecated
+	 */
 	public IBinding[] findBindings(Pattern pattern, IProgressMonitor monitor) throws CoreException {
-		return findBindings(new Pattern[] { pattern }, monitor);
+		return findBindings(new Pattern[] { pattern }, false, new IndexFilter(), monitor);
+	}
+
+	/**
+	 * @deprecated
+	 */
+	public IBinding[] findBindings(Pattern[] pattern, IProgressMonitor monitor) throws CoreException {
+		return findBindings(pattern, true, new IndexFilter(), monitor);
 	}
 	
-	public IBinding[] findBindings(Pattern[] pattern, IProgressMonitor monitor) throws CoreException {
-		BindingFinder finder = new BindingFinder(pattern, monitor);
-		PDOMLinkage linkage = getFirstLinkage();
-		while (linkage != null) {
-			try {
-				linkage.accept(finder);
-			} catch (CoreException e) {
-				if (e.getStatus() != Status.OK_STATUS)
-					throw e;
-				else
-					return new IBinding[0];
+	public IIndexBinding[] findBindings(Pattern pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
+		return findBindings(new Pattern[] { pattern }, isFullyQualified, filter, monitor);
+	}
+
+	public IIndexFragmentBinding[] findBindings(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException {
+		BindingFinder finder = new BindingFinder(pattern, isFullyQualified, monitor);
+		for (Iterator iter = fLinkageIDCache.values().iterator(); iter.hasNext();) {
+			PDOMLinkage linkage = (PDOMLinkage) iter.next();
+			if (filter.acceptLinkage(linkage)) {
+				try {
+					linkage.accept(finder);
+				} catch (CoreException e) {
+					if (e.getStatus() != Status.OK_STATUS)
+						throw e;
+					else
+						return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY;
+				}
 			}
-			linkage = linkage.getNextLinkage();
 		}
 		return finder.getBindings();
 	}
-	
-	public PDOMLinkage getLinkage(ILanguage language) throws CoreException {
-		PDOMLinkage linkage = (PDOMLinkage)linkageCache.get(language.getId());
-		if (linkage != null)
-			return linkage;
-		
-		// Need to create it
-		IPDOMLinkageFactory factory = (IPDOMLinkageFactory)language.getAdapter(IPDOMLinkageFactory.class);
-		String id = language.getId();
-		int linkrec = db.getInt(LINKAGES);
-		while (linkrec != 0) {
-			if (PDOMLinkage.getId(this, linkrec).equals(id))
-				return factory.getLinkage(this, linkrec);
-			else
-				linkrec = PDOMLinkage.getNextLinkageRecord(this, linkrec);
+
+	private void readLinkages() throws CoreException {
+		// populate the linkage cache
+		int record= getFirstLinkageRecord();
+		while (record != 0) {
+			String linkageID= PDOMLinkage.getId(this, record).getString();
+			IPDOMLinkageFactory factory= LanguageManager.getInstance().getPDOMLinkageFactory(linkageID);
+			if (factory != null) {
+				PDOMLinkage linkage= factory.getLinkage(this, record);
+				fLinkageIDCache.put(linkageID, linkage);
+			}
+			record= PDOMLinkage.getNextLinkageRecord(this, record);
 		}
-		
-		return factory.createLinkage(this);
+	}
+
+	public PDOMLinkage getLinkage(String linkageID) throws CoreException {
+		return (PDOMLinkage) fLinkageIDCache.get(linkageID);
+	}
+
+	public PDOMLinkage createLinkage(String linkageID) throws CoreException {
+		PDOMLinkage pdomLinkage= (PDOMLinkage) fLinkageIDCache.get(linkageID);
+		if (pdomLinkage == null) {
+			// Need to create it
+			IPDOMLinkageFactory factory= LanguageManager.getInstance().getPDOMLinkageFactory(linkageID);
+			if (factory != null) {
+				return factory.createLinkage(this);
+			}
+		}
+		return pdomLinkage;
 	}
 
 	public PDOMLinkage getLinkage(int record) throws CoreException {
@@ -347,7 +374,7 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 		
 		// First check the cache. We do a linear search since there will be very few linkages
 		// in a given database.
-		Iterator i = linkageCache.values().iterator();
+		Iterator i = fLinkageIDCache.values().iterator();
 		while (i.hasNext()) {
 			PDOMLinkage linkage = (PDOMLinkage)i.next();
 			if (linkage.getRecord() == record)
@@ -355,23 +382,22 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 		}
 		
 		String id = PDOMLinkage.getId(this, record).getString();
-		ILanguage language = LanguageManager.getInstance().getLanguage(id);
-		return getLinkage(language);
+		return createLinkage(id);
 	}
 	
-	public PDOMLinkage getFirstLinkage() throws CoreException {
-		return getLinkage(db.getInt(LINKAGES));
+	private int getFirstLinkageRecord() throws CoreException {
+		return db.getInt(LINKAGES);
 	}
 	
 	public PDOMLinkage[] getLinkages() {
-		Collection values = linkageCache.values();
-		return (PDOMLinkage[])values.toArray(new PDOMLinkage[values.size()]);
+		Collection values = fLinkageIDCache.values();
+		return (PDOMLinkage[]) values.toArray(new PDOMLinkage[values.size()]);
 	}
 	
 	public void insertLinkage(PDOMLinkage linkage) throws CoreException {
 		linkage.setNext(db.getInt(LINKAGES));
 		db.putInt(LINKAGES, linkage.getRecord());
-		linkageCache.put(linkage.getLanguage().getId(), linkage);
+		fLinkageIDCache.put(linkage.getID(), linkage);
 	}
 	
 	public PDOMBinding getBinding(int record) throws CoreException {
@@ -388,6 +414,7 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 	private Object mutex = new Object();
 	private int lockCount;
 	private int waitingReaders;
+	private long lastWriteAccess= 0;
 	
 	public void acquireReadLock() throws InterruptedException {
 		synchronized (mutex) {
@@ -401,6 +428,7 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 	
 	public void releaseReadLock() {
 		synchronized (mutex) {
+			assert lockCount > 0: "No lock to release"; //$NON-NLS-1$
 			if (lockCount > 0)
 				--lockCount;
 			mutex.notifyAll();
@@ -408,7 +436,22 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 	}
 	
 	public void acquireWriteLock() throws InterruptedException {
+		acquireWriteLock(0);
+	}
+	
+	public void acquireWriteLock(int giveupReadLocks) throws InterruptedException {
 		synchronized (mutex) {
+			if (giveupReadLocks > 0) {
+				// giveup on read locks
+				assert lockCount >= giveupReadLocks: "Not enough locks to release"; //$NON-NLS-1$
+				if (lockCount >= giveupReadLocks) {
+					lockCount-= giveupReadLocks;
+				}
+				else if (lockCount >= 0) {
+					lockCount= 0;
+				}
+			}
+			
 			// Let the readers go first
 			while (lockCount != 0 || waitingReaders > 0)
 				mutex.wait();
@@ -417,12 +460,131 @@ public class PDOM extends PlatformObject implements IPDOM, IPDOMResolver, IPDOMW
 	}
 	
 	public void releaseWriteLock() {
+		releaseWriteLock(0);
+	}
+	
+	public void releaseWriteLock(int establishReadLocks) {
+		assert lockCount == -1;
+		lastWriteAccess= System.currentTimeMillis();
 		synchronized (mutex) {
 			if (lockCount < 0)
-				++lockCount;
+				lockCount= establishReadLocks;
 			mutex.notifyAll();
 		}
 		fireChange();
 	}
+		
 	
+	public long getLastWriteAccess() {
+		return lastWriteAccess;
+	}
+
+	protected PDOMLinkage adaptLinkage(ILinkage linkage) throws CoreException {
+		return (PDOMLinkage) fLinkageIDCache.get(linkage.getID());
+	}
+
+	public IIndexProxyBinding adaptBinding(IBinding binding) throws CoreException {
+		if (binding instanceof PDOMBinding) {
+			PDOMBinding pdomBinding= (PDOMBinding) binding;
+			if (pdomBinding.getPDOM() == this) {
+				return pdomBinding;
+			}
+		}
+		
+		PDOMLinkage linkage= adaptLinkage(binding.getLinkage());
+		if (linkage != null) {
+			return linkage.adaptBinding(binding);
+		}
+		return null;
+	}
+
+	public IIndexProxyBinding adaptBinding(IIndexProxyBinding binding) throws CoreException {
+		if (binding instanceof IBinding) {
+			return adaptBinding((IBinding) binding);
+		}
+		return null;
+	}
+
+	public IIndexFragmentBinding findBinding(IIndexFragmentName indexName) throws CoreException {
+		if (indexName instanceof PDOMName) {
+			PDOMName pdomName= (PDOMName) indexName;
+			return pdomName.getPDOMBinding();
+		}
+		return null;
+	}
+
+	public IIndexFragmentName[] findNames(IBinding binding, int options) throws CoreException {
+		IIndexProxyBinding proxyBinding= adaptBinding(binding);
+		if (proxyBinding != null) {
+			return findNames(proxyBinding, options);
+		}
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
+	}
+
+	public IIndexFragmentName[] findNames(IIndexProxyBinding binding, int options) throws CoreException {
+		PDOMBinding pdomBinding = (PDOMBinding) adaptBinding(binding);
+		
+		if (pdomBinding != null) {
+			PDOMName name;
+			List names = new ArrayList();
+			if ((options & FIND_DECLARATIONS) != 0) {
+				for (name= pdomBinding.getFirstDeclaration(); name != null; name= name.getNextInBinding()) {
+					names.add(name);
+				}
+			}
+			if ((options & FIND_DEFINITIONS) != 0) {
+				for (name = pdomBinding.getFirstDefinition(); name != null; name= name.getNextInBinding()) {
+					names.add(name);
+				}
+			}
+			if ((options & FIND_REFERENCES) != 0) {
+				for (name = pdomBinding.getFirstReference(); name != null; name= name.getNextInBinding()) {
+					names.add(name);
+				}
+			}
+			return (IIndexFragmentName[]) names.toArray(new IIndexFragmentName[names.size()]);
+		}
+		return IIndexFragmentName.EMPTY_NAME_ARRAY;
+	}
+
+	public IIndexFragmentInclude[] findIncludedBy(IIndexFragmentFile file) throws CoreException {
+		PDOMFile pdomFile= adaptFile(file);
+		if (pdomFile != null) {
+			List result = new ArrayList();
+			for (PDOMInclude i= pdomFile.getFirstIncludedBy(); i != null; i= i.getNextInIncludedBy()) {
+				result.add(i);
+			}
+			return (IIndexFragmentInclude[]) result.toArray(new PDOMInclude[result.size()]);
+		}
+		return new PDOMInclude[0];
+	}
+
+	private PDOMFile adaptFile(IIndexFragmentFile file) throws CoreException {
+		if (file.getIndexFragment() == this && file instanceof PDOMFile) {
+			return (PDOMFile) file;
+		}
+		
+		return getFile(file.getLocation());
+	}
+
+	public IIndexFragmentInclude[] findIncludes(IIndexFragmentFile file) throws CoreException {
+		PDOMFile pdomFile= adaptFile(file);
+		if (file != null) {
+			List result = new ArrayList();
+			for (PDOMInclude i= pdomFile.getFirstInclude(); i != null; i= i.getNextInIncludes()) {
+				result.add(i);
+			}
+			return (IIndexFragmentInclude[]) result.toArray(new PDOMInclude[result.size()]);
+		}
+		return new PDOMInclude[0];
+	}
+	
+	public IIndexFragmentFile resolveInclude(IIndexFragmentInclude include) throws CoreException {
+		if (include.getFragment() == this && include instanceof PDOMInclude) {
+			PDOMInclude pdomInclude= (PDOMInclude) include;
+			return pdomInclude.getIncludes();
+		}
+		return getFile(include.getIncludesLocation());
+	}
+
 }
\ No newline at end of file
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
index 4ebb4db17eb..9fd39e0b18a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java
@@ -7,10 +7,19 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.pdom;
 
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.ICDescriptor;
@@ -19,12 +28,21 @@ import org.eclipse.cdt.core.dom.IPDOM;
 import org.eclipse.cdt.core.dom.IPDOMIndexer;
 import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
 import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexManager;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ElementChangedEvent;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICElementDelta;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IElementChangedListener;
+import org.eclipse.cdt.internal.core.index.CIndex;
+import org.eclipse.cdt.internal.core.index.EmptyCIndex;
+import org.eclipse.cdt.internal.core.index.IIndexFragment;
+import org.eclipse.cdt.internal.core.index.IWritableIndex;
+import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
+import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
+import org.eclipse.cdt.internal.core.index.WritableCIndex;
 import org.eclipse.cdt.internal.core.pdom.indexer.nulli.PDOMNullIndexer;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ProjectScope;
@@ -51,7 +69,7 @@ import org.osgi.service.prefs.BackingStoreException;
  * 
  * @author Doug Schaefer
  */
-public class PDOMManager implements IPDOMManager, IElementChangedListener {
+public class PDOMManager implements IPDOMManager, IWritableIndexManager, IElementChangedListener {
 
 	private static final QualifiedName indexerProperty
 		= new QualifiedName(CCorePlugin.PLUGIN_ID, "pdomIndexer"); //$NON-NLS-1$
@@ -62,7 +80,7 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
 
 	public synchronized IPDOM getPDOM(ICProject project) throws CoreException {
 		IProject rproject = project.getProject();
-		PDOM pdom = (PDOM)rproject.getSessionProperty(pdomProperty);
+		WritablePDOM pdom = (WritablePDOM)rproject.getSessionProperty(pdomProperty);
 		if (pdom == null) {
 			String dbName = rproject.getPersistentProperty(dbNameProperty);
 			if (dbName == null) {
@@ -71,7 +89,7 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
 				rproject.setPersistentProperty(dbNameProperty, dbName);
 			}
 			IPath dbPath = CCorePlugin.getDefault().getStateLocation().append(dbName);
-			pdom = new PDOM(dbPath);
+			pdom = new WritablePDOM(dbPath);
 			rproject.setSessionProperty(pdomProperty, pdom);
 			if (pdom.versionMismatch())
 				getIndexer(project).reindex();
@@ -95,6 +113,139 @@ public class PDOMManager implements IPDOMManager, IElementChangedListener {
 		}
 	}
 	
+	public IIndex getIndex(ICProject project) throws CoreException {
+		return getIndex(new ICProject[] {project}, 0);
+	}
+
+	public IIndex getIndex(ICProject project, int options) throws CoreException {
+		return getIndex(new ICProject[] {project}, options);
+	}
+	
+	public IIndex getIndex(ICProject[] projects) throws CoreException {
+		return getIndex(projects, 0);
+	}
+	
+	public IIndex getIndex(ICProject[] projects, int options) throws CoreException {
+		boolean addDependencies= (options & ADD_DEPENDENCIES) != 0;
+		boolean addDependent=    (options & ADD_DEPENDENT) != 0;
+		
+		HashMap map= new HashMap();
+		Collection selectedProjects= getProjects(projects, addDependencies, addDependent, map, new Integer(1));
+		
+		ArrayList pdoms= new ArrayList();
+		for (Iterator iter = selectedProjects.iterator(); iter.hasNext(); ) {
+			ICProject project = (ICProject) iter.next();
+			IWritableIndexFragment pdom= (IWritableIndexFragment) getPDOM(project);
+			if (pdom != null) {
+				pdoms.add(pdom);
+			}
+		}
+		if (pdoms.isEmpty()) {
+			return EmptyCIndex.INSTANCE;
+		}
+		
+		// todo add the SDKs
+		int primaryFragmentCount= pdoms.size();
+		
+		if (!addDependencies) {
+			projects= (ICProject[]) selectedProjects.toArray(new ICProject[selectedProjects.size()]);
+			selectedProjects.clear();
+			// don't clear the map, so projects are not selected again
+			selectedProjects= getProjects(projects, true, false, map, new Integer(2));
+			for (Iterator iter = selectedProjects.iterator(); iter.hasNext(); ) {
+				ICProject project = (ICProject) iter.next();
+				IWritableIndexFragment pdom= (IWritableIndexFragment) getPDOM(project);
+				if (pdom != null) {
+					pdoms.add(pdom);
+				}
+			}
+			// todo add further SDKs
+		}
+		
+		return new CIndex((IIndexFragment[]) pdoms.toArray(new IIndexFragment[pdoms.size()]), primaryFragmentCount); 
+	}
+
+	private Collection getProjects(ICProject[] projects, boolean addDependencies, boolean addDependent, HashMap map, Integer markWith) {
+		List projectsToSearch= new ArrayList();
+		
+		for (int i = 0; i < projects.length; i++) {
+			ICProject cproject = projects[i];
+			IProject project= cproject.getProject();
+			checkAddProject(project, map, projectsToSearch, markWith);
+		}
+		
+		if (addDependencies || addDependent) {
+			for (int i=0; i<projectsToSearch.size(); i++) {
+				IProject project= (IProject) projectsToSearch.get(i);
+				IProject[] nextLevel;
+				try {
+					if (addDependencies) {
+						nextLevel = project.getReferencedProjects();
+						for (int j = 0; j < nextLevel.length; j++) {
+							checkAddProject(nextLevel[j], map, projectsToSearch, markWith);
+						}
+					}
+					if (addDependent) {
+						nextLevel= project.getReferencingProjects();
+						for (int j = 0; j < nextLevel.length; j++) {
+							checkAddProject(nextLevel[j], map, projectsToSearch, markWith);
+						}
+					}
+				} catch (CoreException e) {
+					// silently ignore
+					map.put(project, new Integer(0));
+				}
+			}
+		}
+		
+		CoreModel cm= CoreModel.getDefault();
+		Collection result= new ArrayList();
+		for (Iterator iter= map.entrySet().iterator(); iter.hasNext(); ) {
+			Map.Entry entry= (Map.Entry) iter.next();
+			if (entry.getValue() == markWith) {
+				ICProject cproject= cm.create((IProject) entry.getKey());
+				if (cproject != null) {
+					result.add(cproject);
+				}
+			}
+		}
+		return result;
+	}
+
+	private void checkAddProject(IProject project, HashMap map, List projectsToSearch, Integer markWith) {
+		if (map.get(project) == null) {
+			if (project.isOpen()) {
+				map.put(project, markWith);
+				projectsToSearch.add(project);
+			}
+			else {
+				map.put(project, new Integer(0));
+			}
+		}
+	}
+
+	public IWritableIndex getWritableIndex(ICProject project) throws CoreException {
+// mstodo to support dependent projects: Collection selectedProjects= getSelectedProjects(new ICProject[]{project}, false);
+		
+		Collection selectedProjects= Collections.singleton(project);
+		
+		ArrayList pdoms= new ArrayList();
+		for (Iterator iter = selectedProjects.iterator(); iter.hasNext(); ) {
+			ICProject p = (ICProject) iter.next();
+			IWritableIndexFragment pdom= (IWritableIndexFragment) getPDOM(p);
+			if (pdom != null) {
+				pdoms.add(pdom);
+			}
+		}
+		
+		if (pdoms.isEmpty()) {
+			throw new CoreException(CCorePlugin.createStatus(
+					MessageFormat.format("Cannot obtain index for project ''{0}''", new Object[]{project.getElementName()})));
+		}
+		
+		return new WritableCIndex((IWritableIndexFragment[]) pdoms.toArray(new IWritableIndexFragment[pdoms.size()]), new IIndexFragment[0]);
+	}
+
 	public synchronized void elementChanged(ElementChangedEvent event) {
 		// Only respond to post change events
 		if (event.getType() != ElementChangedEvent.POST_CHANGE)
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java
new file mode 100644
index 00000000000..afe6a6e6ce8
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/WritablePDOM.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.internal.core.pdom;
+
+import java.text.MessageFormat;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
+import org.eclipse.cdt.internal.core.index.IWritableIndexFragment;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+public class WritablePDOM extends PDOM implements IWritableIndexFragment {
+
+	public WritablePDOM(IPath dbPath) throws CoreException {
+		super(dbPath);
+	}
+	public IIndexFragmentFile addFile(String filename) throws CoreException {
+		return super.addFile(filename);
+	}
+
+	public void addInclude(IIndexFragmentFile sourceFile, IIndexFragmentFile destFile) throws CoreException {
+		assert sourceFile.getIndexFragment() == this;
+		assert destFile.getIndexFragment() == this;
+		((PDOMFile) sourceFile).addIncludeTo((PDOMFile) destFile);
+	}
+
+	public void addMacro(IIndexFragmentFile sourceFile, IASTPreprocessorMacroDefinition macro) throws CoreException {
+		assert sourceFile.getIndexFragment() == this;
+		((PDOMFile) sourceFile).addMacro(macro);
+	}
+
+	public void addName(IIndexFragmentFile sourceFile, IASTName name) throws CoreException {
+		assert sourceFile.getIndexFragment() == this;
+		PDOMLinkage linkage= createLinkage(name.getLinkage().getID());
+		if (linkage == null) {
+			CCorePlugin.log(MessageFormat.format(Messages.WritablePDOM_error_unknownLinkage, new Object[]{name.getLinkage()}));
+		}
+		else {
+			linkage.addName(name, (PDOMFile) sourceFile);
+		}
+	}
+
+	public void clearFile(IIndexFragmentFile file) throws CoreException {
+		assert file.getIndexFragment() == this;
+		((PDOMFile) file).clear();		
+	}
+	
+	public void clear() throws CoreException {
+		super.clear();
+	}
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java
index 1ff6c9c95f4..81f043f5c1e 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java
@@ -7,14 +7,17 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.pdom.dom;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ast.DOMException;
 import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IScope;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.internal.core.index.IIndexFragment;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentBinding;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.db.Database;
 import org.eclipse.core.runtime.CoreException;
@@ -23,7 +26,7 @@ import org.eclipse.core.runtime.CoreException;
  * @author Doug Schaefer
  *
  */
-public abstract class PDOMBinding extends PDOMNamedNode implements IBinding {
+public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmentBinding {
 
 	private static final int FIRST_DECL_OFFSET   = PDOMNamedNode.RECORD_SIZE +  0; // size 4
 	private static final int FIRST_DEF_OFFSET    = PDOMNamedNode.RECORD_SIZE + 4; // size 4
@@ -152,4 +155,15 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IBinding {
 		return null;
 	}
 
+	public IIndexBinding getParentBinding() throws CoreException {
+		PDOMNode parent= getParentNode();
+		if (parent instanceof IIndexBinding) {
+			return (IIndexBinding) parent;
+		}
+		return null;
+	}
+	
+	public IIndexFragment getFragment() {
+		return pdom;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBindingAdapterFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBindingAdapterFactory.java
deleted file mode 100644
index 72fa16dfea6..00000000000
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBindingAdapterFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 QNX Software Systems and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * QNX - Initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.cdt.internal.core.pdom.dom;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.IPDOM;
-import org.eclipse.cdt.core.dom.ast.DOMException;
-import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdapterFactory;
-
-/**
- * @author Doug Schaefer
- * This factory adapts IBinding object to PDOMBinding object
- */
-public class PDOMBindingAdapterFactory implements IAdapterFactory {
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (adaptableObject instanceof PDOMBinding)
-			return adaptableObject;
-		
-		try {
-			IBinding binding = (IBinding)adaptableObject;
-			ICProject[] projects = CoreModel.getDefault().getCModel().getCProjects();
-			for (int i = 0; i < projects.length; ++i) {
-				IPDOM ipdom = CCorePlugin.getPDOMManager().getPDOM(projects[i]);
-				if (ipdom == null || !(ipdom instanceof PDOM))
-					continue;
-				PDOM pdom = (PDOM)ipdom;
-			
-				for (PDOMLinkage linkage = pdom.getFirstLinkage(); linkage != null; linkage = linkage.getNextLinkage()) {
-					PDOMBinding pdomBinding = linkage.adaptBinding(binding);
-					if (binding != null)
-						return pdomBinding;
-				}
-			}
-			return null;
-		} catch (DOMException e) {
-			CCorePlugin.log(e);
-			return null;
-		} catch (CoreException e) {
-			CCorePlugin.log(e);
-			return null;
-		}
-	}
-
-	private static Class[] adapterList = {
-		PDOMBinding.class
-	};
-	
-	public Class[] getAdapterList() {
-		return adapterList;
-	}
-
-}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java
index e9081e2950c..21a9bfc2b95 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFile.java
@@ -7,15 +7,18 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.pdom.dom;
 
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
+import org.eclipse.cdt.core.index.IIndexInclude;
+import org.eclipse.cdt.core.index.IIndexMacro;
+import org.eclipse.cdt.internal.core.index.IIndexFragment;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.db.Database;
 import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator;
@@ -29,7 +32,7 @@ import org.eclipse.core.runtime.CoreException;
  * @author Doug Schaefer
  *
  */
-public class PDOMFile {
+public class PDOMFile implements IIndexFragmentFile {
 
 	private final PDOM pdom;
 	private final int record;
@@ -167,11 +170,12 @@ public class PDOMFile {
 	public void addMacro(IASTPreprocessorMacroDefinition macro) throws CoreException {
 		PDOMMacro firstMacro = getFirstMacro();
 		
+		// mstodo revisit: this can probably be done more efficiently
 		// Make sure we don't already have one
 		char[] name = macro.getName().toCharArray();
 		PDOMMacro pdomMacro = firstMacro;
 		while (pdomMacro != null) {
-			if (pdomMacro.getName().equals(name))
+			if (pdomMacro.getNameInDB().equals(name))
 				return;
 			pdomMacro = pdomMacro.getNextMacro();
 		}
@@ -235,64 +239,33 @@ public class PDOMFile {
 		setFirstIncludedBy(include);
 	}
 	
-	public PDOMFile[] getAllIncludedBy() throws CoreException {
-		Map files = new HashMap();
-		LinkedList todo = new LinkedList();
-		
-		// Add me in to make sure we don't get caught in a circular include
-		IString myFileName = getFileName();
-		files.put(myFileName, this);
-		
-		todo.addLast(this);
-		while (todo.size() > 0) {
-			PDOMFile file = (PDOMFile)todo.removeFirst();
-			PDOMInclude includedBy = file.getFirstIncludedBy();
-			while (includedBy != null) {
-				PDOMFile incFile = includedBy.getIncludedBy();
-				IString incFileName = incFile.getFileName();
-				if (files.get(incFileName) == null) {
-					files.put(incFileName, incFile);
-					todo.addLast(incFile);
-				}
-				includedBy = includedBy.getNextInIncludedBy();
-			}
+	
+	
+	public IIndexInclude[] getIncludes() throws CoreException {
+		List result= new ArrayList();
+		PDOMInclude include = getFirstInclude();
+		while (include != null) {
+			result.add(include);
+			include = include.getNextInIncludes();
 		}
-		
-		// Now remove me
-		files.remove(myFileName);
-		
-		Collection values = files.values(); 
-		return (PDOMFile[])values.toArray(new PDOMFile[values.size()]);
+		return (IIndexInclude[]) result.toArray(new IIndexInclude[result.size()]);
+	}
+
+	public String getLocation() throws CoreException {
+		return getFileName().getString();
+	}
+
+	public IIndexMacro[] getMacros() throws CoreException {
+		List result= new ArrayList();
+		PDOMMacro macro = getFirstMacro();
+		while (macro != null) {
+			result.add(macro);
+			macro = macro.getNextMacro();
+		}
+		return (IIndexMacro[]) result.toArray(new IIndexMacro[result.size()]);
 	}
 	
-	public PDOMFile[] getAllIncludes() throws CoreException {
-		Map files = new HashMap();
-		LinkedList todo = new LinkedList();
-		
-		// Add me in to make sure we don't get caught in a circular include
-		IString myFileName = getFileName();
-		files.put(myFileName, this);
-		
-		todo.addLast(this);
-		while (todo.size() > 0) {
-			PDOMFile file = (PDOMFile)todo.removeFirst();
-			PDOMInclude include = file.getFirstInclude();
-			while (include != null) {
-				PDOMFile incFile = include.getIncludes();
-				IString incFileName = incFile.getFileName();
-				if (files.get(incFileName) == null) {
-					files.put(incFileName, incFile);
-					todo.addLast(incFile);
-				}
-				include = include.getNextInIncludes();
-			}
-		}
-		
-		// Now remove me
-		files.remove(myFileName);
-		
-		Collection values = files.values(); 
-		return (PDOMFile[])values.toArray(new PDOMFile[values.size()]);
+	public IIndexFragment getIndexFragment() {
+		return pdom;
 	}
-	
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java
index a4c5d305145..86110ba2d22 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMInclude.java
@@ -7,10 +7,15 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom;
 
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.internal.core.index.IIndexFragment;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentInclude;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.core.runtime.CoreException;
 
@@ -18,7 +23,7 @@ import org.eclipse.core.runtime.CoreException;
  * @author Doug Schaefer
  *
  */
-public class PDOMInclude {
+public class PDOMInclude implements IIndexFragmentInclude {
 
 	private final PDOM pdom;
 	private final int record;
@@ -52,7 +57,7 @@ public class PDOMInclude {
 		if (prevInclude != null)
 			prevInclude.setNextInIncludedBy(nextInclude);
 		else
-			getIncludes().setFirstIncludedBy(null);
+			((PDOMFile) getIncludes()).setFirstIncludedBy(null);
 		
 		if (nextInclude != null)
 			nextInclude.setPrevInIncludedBy(prevInclude);
@@ -61,7 +66,7 @@ public class PDOMInclude {
 		pdom.getDB().free(record);
 	}
 	
-	public PDOMFile getIncludes() throws CoreException {
+	public IIndexFragmentFile getIncludes() throws CoreException {
 		int rec = pdom.getDB().getInt(record + INCLUDES);
 		return rec != 0 ? new PDOMFile(pdom, rec) : null;
 	}
@@ -71,7 +76,7 @@ public class PDOMInclude {
 		pdom.getDB().putInt(record + INCLUDES, rec);
 	}
 	
-	public PDOMFile getIncludedBy() throws CoreException {
+	public IIndexFile getIncludedBy() throws CoreException {
 		int rec = pdom.getDB().getInt(record + INCLUDED_BY);
 		return rec != 0 ? new PDOMFile(pdom, rec) : null;
 	}
@@ -110,5 +115,17 @@ public class PDOMInclude {
 		int rec = include != null ? include.getRecord() : 0;
 		pdom.getDB().putInt(record + INCLUDED_BY_PREV, rec);
 	}
+
+	public String getIncludedByLocation() throws CoreException {
+		return getIncludedBy().getLocation();
+	}
+
+	public String getIncludesLocation() throws CoreException {
+		return getIncludes().getLocation();
+	}
+
+	public IIndexFragment getFragment() {
+		return pdom;
+	}
 	
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java
index 74fb052a614..06990ac1cd3 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java
@@ -7,17 +7,27 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom;
 
+import org.eclipse.cdt.core.dom.ILinkage;
+import org.eclipse.cdt.core.dom.IName;
 import org.eclipse.cdt.core.dom.IPDOMVisitor;
+import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
 import org.eclipse.cdt.core.dom.ast.IASTName;
+import org.eclipse.cdt.core.dom.ast.IASTNode;
+import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
 import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IPointerType;
 import org.eclipse.cdt.core.dom.ast.IQualifierType;
+import org.eclipse.cdt.core.dom.ast.IScope;
 import org.eclipse.cdt.core.dom.ast.IType;
+import org.eclipse.cdt.core.index.IIndexBinding;
+import org.eclipse.cdt.core.index.IIndexLinkage;
 import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.db.BTree;
 import org.eclipse.cdt.internal.core.pdom.db.Database;
@@ -31,7 +41,7 @@ import org.eclipse.core.runtime.CoreException;
  * This class represents a collection of symbols that can be linked together at
  * link time. These are generally global symbols specific to a given language.
  */
-public abstract class PDOMLinkage extends PDOMNamedNode {
+public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage {
 
 	// record offsets
 	private static final int ID_OFFSET   = PDOMNamedNode.RECORD_SIZE + 0;
@@ -65,22 +75,20 @@ public abstract class PDOMLinkage extends PDOMNamedNode {
 		return RECORD_SIZE;
 	}
 
+	public int getNodeType() {
+		return LINKAGE;
+	}
+
 	public static IString getId(PDOM pdom, int record) throws CoreException {
 		Database db = pdom.getDB();
 		int namerec = db.getInt(record + ID_OFFSET);
 		return db.getString(namerec);
 	}
 	
-	public abstract ILanguage getLanguage();
-
 	public static int getNextLinkageRecord(PDOM pdom, int record) throws CoreException {
 		return pdom.getDB().getInt(record + NEXT_OFFSET);
 	}
-	
-	public PDOMLinkage getNextLinkage() throws CoreException {
-		return pdom.getLinkage(pdom.getDB().getInt(record + NEXT_OFFSET));
-	}
-	
+		
 	public void setNext(int nextrec) throws CoreException {
 		pdom.getDB().putInt(record + NEXT_OFFSET, nextrec);
 	}
@@ -107,7 +115,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode {
 		});
 	}
 	
-	public PDOMLinkage getLinkage() throws CoreException {
+	public ILinkage getLinkage() throws CoreException {
 		return this;
 	}
 
@@ -138,6 +146,37 @@ public abstract class PDOMLinkage extends PDOMNamedNode {
 	
 	public abstract PDOMBinding adaptBinding(IBinding binding) throws CoreException;
 	
-	public abstract IBinding resolveBinding(IASTName name) throws CoreException;
-
+	public abstract PDOMBinding resolveBinding(IASTName name) throws CoreException;
+	
+	public PDOMNode getAdaptedParent(IBinding binding) throws CoreException {
+		IScope scope = binding.getScope();
+		if (scope == null)
+			return null;
+		
+		if (scope instanceof IIndexBinding) {
+			IIndexBinding parent= ((IIndexBinding) scope).getParentBinding();
+			if (parent == null) {
+				return this;
+			}
+			return adaptBinding(parent);
+		}
+			
+		// the scope is from the ast
+		IASTNode scopeNode = ASTInternal.getPhysicalNodeOfScope(scope);
+		if (scopeNode instanceof IASTCompoundStatement)
+			return null;
+		else if (scopeNode instanceof IASTTranslationUnit)
+			return this;
+		else {
+			IName scopeName = scope.getScopeName();
+			if (scopeName instanceof IASTName) {
+				IBinding scopeBinding = ((IASTName) scopeName).resolveBinding();
+				PDOMBinding scopePDOMBinding = adaptBinding(scopeBinding);
+				if (scopePDOMBinding != null)
+					return scopePDOMBinding;
+			}
+		}
+			
+		return null;
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java
index be2f2c54891..853fbf9613c 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMacro.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom;
@@ -18,6 +19,7 @@ import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter;
 import org.eclipse.cdt.core.dom.ast.IASTPreprocessorFunctionStyleMacroDefinition;
 import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
+import org.eclipse.cdt.core.index.IIndexMacro;
 import org.eclipse.cdt.core.parser.IMacro;
 import org.eclipse.cdt.internal.core.parser.scanner2.FunctionStyleMacro;
 import org.eclipse.cdt.internal.core.parser.scanner2.ObjectStyleMacro;
@@ -31,10 +33,11 @@ import org.eclipse.core.runtime.CoreException;
  * 
  * @author Doug Schaefer
  */
-public class PDOMMacro {
+public class PDOMMacro implements IIndexMacro {
 
 	private final PDOM pdom;
 	private final int record;
+	private IMacro macro;
 
 	private static final int NAME = 0;
 	private static final int FIRST_PARAMETER = 4;
@@ -77,21 +80,21 @@ public class PDOMMacro {
 	}
 	
 	public void delete() throws CoreException {
-		getName().delete();
-		getExpansion().delete();
+		getNameInDB().delete();
+		getExpansionInDB().delete();
 		PDOMMacroParameter param = getFirstParameter();
 		if (param != null)
 			param.delete();
 		pdom.getDB().free(record);
 	}
 	
-	public IString getName() throws CoreException {
+	public IString getNameInDB() throws CoreException {
 		Database db = pdom.getDB();
 		int rec = db.getInt(record + NAME);
 		return db.getString(rec);
 	}
 	
-	public IString getExpansion() throws CoreException {
+	public IString getExpansionInDB() throws CoreException {
 		Database db = pdom.getDB();
 		int rec = db.getInt(record + EXPANSION);
 		return db.getString(rec);
@@ -135,7 +138,7 @@ public class PDOMMacro {
 	
 	private char[] getMacroExpansion() {
 		try {
-			return PDOMMacro.this.getExpansion().getChars();
+			return PDOMMacro.this.getExpansionInDB().getChars();
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
 			return new char[] { ' ' };
@@ -143,7 +146,12 @@ public class PDOMMacro {
 	}
 
 	public IMacro getMacro() throws CoreException {
-		char[] name = getName().getChars();
+		rebuildMacro();
+		return macro;
+	}
+	
+	private void rebuildMacro() throws CoreException {
+		char[] name = getNameInDB().getChars();
 		PDOMMacroParameter param = getFirstParameter();
 		if (param != null) {
 			List paramList = new ArrayList();
@@ -152,8 +160,38 @@ public class PDOMMacro {
 				param = param.getNextParameter();
 			}
 			char[][] params = (char[][])paramList.toArray(new char[paramList.size()][]);
-			return new FunctionStylePDOMMacro(name, params);
+			macro= new FunctionStylePDOMMacro(name, params);
 		} else
-			return new ObjectStylePDOMMacro(name);
+			macro= new ObjectStylePDOMMacro(name);
+	}
+
+	public char[] getSignature() {
+		try {
+			rebuildMacro();
+		} catch (CoreException e) {
+			CCorePlugin.log(e);
+			return new char[] { ' ' };
+		}
+		return macro.getSignature();
+	}
+
+	public char[] getExpansion() {
+		try {
+			rebuildMacro();
+		} catch (CoreException e) {
+			CCorePlugin.log(e);
+			return new char[] { ' ' };
+		}
+		return macro.getExpansion();
+	}
+
+	public char[] getName() {
+		try {
+			rebuildMacro();
+		} catch (CoreException e) {
+			CCorePlugin.log(e);
+			return new char[] { ' ' };
+		}
+		return macro.getName();
 	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java
index 32ca488b291..cbbf7d155a6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMName.java
@@ -14,8 +14,9 @@ package org.eclipse.cdt.internal.core.pdom.dom;
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
 import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IBinding;
-import org.eclipse.cdt.core.index.IIndexName;
+import org.eclipse.cdt.internal.core.index.IIndexFragment;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentName;
+import org.eclipse.cdt.internal.core.index.IIndexProxyBinding;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.db.Database;
 import org.eclipse.core.runtime.CoreException;
@@ -24,7 +25,7 @@ import org.eclipse.core.runtime.CoreException;
  * @author Doug Schaefer
  *
  */
-public class PDOMName implements IIndexName, IASTFileLocation {
+public class PDOMName implements IIndexFragmentName, IASTFileLocation {
 
 	private final PDOM pdom;
 	private final int record;
@@ -162,7 +163,7 @@ public class PDOMName implements IIndexName, IASTFileLocation {
 		setNameField(FILE_PREV_OFFSET, name);
 	}
 	
-	public IBinding resolveBinding() {
+	public PDOMBinding resolveBinding() {
 		try {
 			int bindingRecord = pdom.getDB().getInt(record + BINDING_REC_OFFSET);
 			return pdom.getBinding(bindingRecord);
@@ -288,5 +289,12 @@ public class PDOMName implements IIndexName, IASTFileLocation {
 		// Delete our record
 		pdom.getDB().free(record);
 	}
+
+	public IIndexFragment getIndexFragment() {
+		return pdom;
+	}
 	
+	public IIndexProxyBinding getBinding() throws CoreException {
+		return getPDOMBinding();
+	}
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java
index 1db98dfdafc..370b5eb41df 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMNode.java
@@ -7,12 +7,15 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom;
 
+import org.eclipse.cdt.core.dom.ILinkage;
 import org.eclipse.cdt.core.dom.IPDOMNode;
 import org.eclipse.cdt.core.dom.IPDOMVisitor;
+import org.eclipse.cdt.core.index.IIndexLinkage;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.db.Database;
 import org.eclipse.core.runtime.CoreException;
@@ -86,13 +89,17 @@ public abstract class PDOMNode implements IPDOMNode{
 	
 	public PDOMNode getParentNode() throws CoreException {
 		int parentrec = pdom.getDB().getInt(record + PARENT);
-		return parentrec != 0 ? getLinkage().getNode(parentrec) : null;
+		return parentrec != 0 ? getLinkageImpl().getNode(parentrec) : null;
 	}
 	
-	public PDOMLinkage getLinkage() throws CoreException {
+	public ILinkage getLinkage() throws CoreException {
 		return getLinkage(pdom, record);
 	}
-	
+
+	public PDOMLinkage getLinkageImpl() throws CoreException {
+		return getLinkage(pdom, record);
+	}
+
 	public static PDOMLinkage getLinkage(PDOM pdom, int record) throws CoreException {
 		Database db = pdom.getDB();
 		int linkagerec = record;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMPointerType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMPointerType.java
index 90b3b9ef9be..944d45d9ba8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMPointerType.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMPointerType.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom;
@@ -47,7 +48,7 @@ public class PDOMPointerType extends PDOMNode implements IPointerType,
 		IType targetType = ((ITypeContainer)type).getType();
 		int typeRec = 0;
 		if (type != null) {
-			PDOMNode targetTypeNode = getLinkage().addType(this, targetType);
+			PDOMNode targetTypeNode = getLinkageImpl().addType(this, targetType);
 			if (targetTypeNode != null)
 				typeRec = targetTypeNode.getRecord();
 		}
@@ -76,7 +77,7 @@ public class PDOMPointerType extends PDOMNode implements IPointerType,
 	
 	public IType getType() throws DOMException {
 		try {
-			PDOMNode node = getLinkage().getNode(pdom.getDB().getInt(record + TYPE));
+			PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
 			return node instanceof IType ? (IType)node : null;
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMQualifierType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMQualifierType.java
index 66fe3892f7c..afec28bb507 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMQualifierType.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMQualifierType.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom;
@@ -47,7 +48,7 @@ public class PDOMQualifierType extends PDOMNode implements IQualifierType,
 		// type
 		IType targetType = ((ITypeContainer)type).getType();
 		if (type != null) {
-			PDOMNode targetTypeNode = getLinkage().addType(this, targetType);
+			PDOMNode targetTypeNode = getLinkageImpl().addType(this, targetType);
 			if (targetTypeNode != null) {
 				db.putInt(record + TYPE, targetTypeNode.getRecord());
 			}
@@ -72,7 +73,7 @@ public class PDOMQualifierType extends PDOMNode implements IQualifierType,
 
 	public IType getType() throws DOMException {
 		try {
-			PDOMNode node = getLinkage().getNode(pdom.getDB().getInt(record + TYPE));
+			PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
 			return node instanceof IType ? (IType)node : null;
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java
index 2146dc3fe5e..0479f830258 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java
@@ -35,7 +35,9 @@ import org.eclipse.cdt.core.dom.ast.ITypedef;
 import org.eclipse.cdt.core.dom.ast.IVariable;
 import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
 import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
+import org.eclipse.cdt.core.index.IIndexBinding;
 import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
 import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
@@ -57,13 +59,13 @@ class PDOMCLinkage extends PDOMLinkage {
 	}
 
 	public PDOMCLinkage(PDOM pdom) throws CoreException {
-		super(pdom, GCCLanguage.ID, "C".toCharArray()); //$NON-NLS-1$
+		super(pdom, GCCLanguage.ID, C_LINKAGE_ID.toCharArray()); 
 	}
 	
-	public int getNodeType() {
-		return LINKAGE;
+	public String getID() {
+		return C_LINKAGE_ID;
 	}
-
+	
 	public static final int CVARIABLE = PDOMLinkage.LAST_NODE_TYPE + 1;
 	public static final int CFUNCTION = PDOMLinkage.LAST_NODE_TYPE + 2;
 	public static final int CSTRUCTURE = PDOMLinkage.LAST_NODE_TYPE + 3;
@@ -75,30 +77,7 @@ class PDOMCLinkage extends PDOMLinkage {
 	public ILanguage getLanguage() {
 		return new GCCLanguage();
 	}
-	
-	public PDOMNode getParent(IBinding binding) throws CoreException {
-		IScope scope = binding.getScope();
-		if (scope == null)
-			return null;
 		
-		IASTNode scopeNode = scope.getPhysicalNode();
-		if (scopeNode instanceof IASTCompoundStatement)
-			return null;
-		else if (scopeNode instanceof IASTTranslationUnit)
-			return this;
-		else {
-			IName scopeName = scope.getScopeName();
-			if (scopeName != null) {
-				IBinding scopeBinding = scopeName.resolveBinding();
-				PDOMBinding scopePDOMBinding = adaptBinding(scopeBinding);
-				if (scopePDOMBinding != null)
-					return scopePDOMBinding;
-			}
-		}
-			
-		return null;
-	}
-	
 	public PDOMBinding addName(IASTName name, PDOMFile file) throws CoreException {
 		if (name == null)
 			return null;
@@ -118,7 +97,7 @@ class PDOMCLinkage extends PDOMLinkage {
 	
 		PDOMBinding pdomBinding = adaptBinding(binding);
 		if (pdomBinding == null) {
-			PDOMNode parent = getParent(binding);
+			PDOMNode parent = getAdaptedParent(binding);
 			if (parent == null)
 				return null;
 			
@@ -236,7 +215,7 @@ class PDOMCLinkage extends PDOMLinkage {
 			// so if the binding is from another pdom it has to be adapted. 
 		}
 		
-		PDOMNode parent = getParent(binding);
+		PDOMNode parent = getAdaptedParent(binding);
 		if (parent == this) {
 			FindBinding visitor = new FindBinding(pdom, binding.getNameCharArray(), getBindingType(binding));
 			getIndex().accept(visitor);
@@ -280,7 +259,7 @@ class PDOMCLinkage extends PDOMLinkage {
 		return super.getNode(record);
 	}
 
-	public IBinding resolveBinding(IASTName name) throws CoreException {
+	public PDOMBinding resolveBinding(IASTName name) throws CoreException {
 		IASTNode parent = name.getParent();
 		if (parent instanceof IASTIdExpression) {
 			// reference
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java
index e92aeca38ca..03e470d815e 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom.c;
@@ -27,6 +28,7 @@ import org.eclipse.cdt.internal.core.pdom.PDOM;
 import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList;
 import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
+import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
 import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
 import org.eclipse.core.runtime.CoreException;
@@ -51,11 +53,11 @@ public class PDOMCStructure extends PDOMBinding implements ICompositeType, IPDOM
 
 	public void accept(IPDOMVisitor visitor) throws CoreException {
 		super.accept(visitor);
-		new PDOMNodeLinkedList(pdom, record+MEMBERLIST, getLinkage()).accept(visitor);
+		new PDOMNodeLinkedList(pdom, record+MEMBERLIST, getLinkageImpl()).accept(visitor);
 	}
 	
 	public void addMember(PDOMNode member) throws CoreException {
-		new PDOMNodeLinkedList(pdom, record+MEMBERLIST, getLinkage()).addMember(member);
+		new PDOMNodeLinkedList(pdom, record+MEMBERLIST, getLinkageImpl()).addMember(member);
 	}
 	
 	public int getNodeType() {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCTypedef.java
index a2b639a153c..dbbe74ce483 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCTypedef.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCTypedef.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.pdom.dom.c;
 
@@ -35,7 +36,7 @@ class PDOMCTypedef extends PDOMBinding implements ITypedef {
 		super(pdom, parent, name);
 		
 		IType type = typedef.getType();
-		PDOMNode typeNode = parent.getLinkage().addType(this, type);
+		PDOMNode typeNode = parent.getLinkageImpl().addType(this, type);
 		if (typeNode != null)
 			pdom.getDB().putInt(record + TYPE, typeNode.getRecord());
 	}
@@ -55,7 +56,7 @@ class PDOMCTypedef extends PDOMBinding implements ITypedef {
 	public IType getType() throws DOMException {
 		try {
 			int typeRec = pdom.getDB().getInt(record + TYPE);
-			return (IType)getLinkage().getNode(typeRec);
+			return (IType)getLinkageImpl().getNode(typeRec);
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
 			return null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java
index 9bee49195c1..708772310c9 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java
@@ -71,7 +71,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType,
 	}
 	
 	public void addMember(PDOMNode member) throws CoreException {
-		PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkage());
+		PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl());
 		list.addMember(member);
 	}
 	
@@ -135,7 +135,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType,
 
 	public void accept(IPDOMVisitor visitor) throws CoreException {
 		super.accept(visitor);
-		PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkage());
+		PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl());
 		list.accept(visitor);
 	}
 	
@@ -308,10 +308,6 @@ class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType,
 		throw new PDOMNotImplementedError();
 	}
 
-	public void flushCache() throws DOMException {
-		throw new PDOMNotImplementedError();
-	}
-
 	public IBinding getBinding(IASTName name, boolean resolve) throws DOMException {
 		return null;
 	}
@@ -320,10 +316,6 @@ class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType,
 		return null;
 	}
 
-	public IASTNode getPhysicalNode() throws DOMException {
-		throw new PDOMNotImplementedError();
-	}
-
 	public IName getScopeName() throws DOMException {
 		try {
 			PDOMName name = getFirstDefinition();
@@ -336,16 +328,7 @@ class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType,
 		}
 	}
 
-	public boolean isFullyCached() throws DOMException {
-		return true;
-	}
-
 	public void removeBinding(IBinding binding) throws DOMException {
 		throw new PDOMNotImplementedError();
 	}
-
-	public void setFullyCached(boolean b) throws DOMException {
-		throw new PDOMNotImplementedError();
-	}
-
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java
index 06682ce0a3e..1c9cb97ae60 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java
@@ -12,7 +12,6 @@
 
 package org.eclipse.cdt.internal.core.pdom.dom.cpp;
 
-import org.eclipse.cdt.core.dom.IName;
 import org.eclipse.cdt.core.dom.IPDOMNode;
 import org.eclipse.cdt.core.dom.IPDOMVisitor;
 import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
@@ -68,17 +67,17 @@ class PDOMCPPLinkage extends PDOMLinkage {
 
 	public PDOMCPPLinkage(PDOM pdom)
 			throws CoreException {
-		super(pdom, GPPLanguage.ID, "C++".toCharArray());
+		super(pdom, GPPLanguage.ID, CPP_LINKAGE_ID.toCharArray());
 	}
 
+	public String getID() {
+		return CPP_LINKAGE_ID;
+	}
+	
 	protected int getRecordSize() {
 		return RECORD_SIZE;
 	}
-	
-	public int getNodeType() {
-		return LINKAGE;
-	}
-	
+		
 	// Binding types
 	public static final int CPPVARIABLE = PDOMLinkage.LAST_NODE_TYPE + 1;
 	public static final int CPPFUNCTION = PDOMLinkage.LAST_NODE_TYPE + 2;
@@ -96,22 +95,7 @@ class PDOMCPPLinkage extends PDOMLinkage {
 	public ILanguage getLanguage() {
 		return new GPPLanguage();
 	}
-	
-	public PDOMNode getParent(IBinding binding) throws CoreException {
-		PDOMNode parent = this;
-		IScope scope = binding.getScope();
-		if (scope != null) {
-			IName scopeName = scope.getScopeName();
-			if (scopeName != null) {
-				IBinding scopeBinding = scopeName.resolveBinding();
-				PDOMBinding scopePDOMBinding = adaptBinding(scopeBinding);
-				if (scopePDOMBinding != null)
-					parent = scopePDOMBinding;
-			}
-		}
-		return parent;
-	}
-	
+		
 	public PDOMBinding addName(IASTName name, PDOMFile file) throws CoreException {
 		if (name == null || name instanceof ICPPASTQualifiedName)
 			return null;
@@ -132,39 +116,40 @@ class PDOMCPPLinkage extends PDOMLinkage {
 		
 		PDOMBinding pdomBinding = adaptBinding(binding);
 		if (pdomBinding == null) {
-			PDOMNode parent = getParent(binding);
-
-			if (binding instanceof ICPPField && parent instanceof PDOMCPPClassType)
-				pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, name);
-			else if (binding instanceof ICPPVariable) {
-				if (!(binding.getScope() instanceof CPPBlockScope))
-					pdomBinding = new PDOMCPPVariable(pdom, parent, name);
-			} else if (binding instanceof ICPPMethod && parent instanceof PDOMCPPClassType) {
-				pdomBinding = new PDOMCPPMethod(pdom, parent, name);
-			} else if (binding instanceof CPPImplicitMethod && parent instanceof PDOMCPPClassType) {
-				if(!name.isReference()) {
-					//because we got the implicit method off of an IASTName that is not a reference,
-					//it is no longer completly implicit and it should be treated as a normal method.
+			PDOMNode parent = getAdaptedParent(binding);
+			if (parent != null) {
+				if (binding instanceof ICPPField && parent instanceof PDOMCPPClassType)
+					pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, name);
+				else if (binding instanceof ICPPVariable) {
+					if (!(binding.getScope() instanceof CPPBlockScope))
+						pdomBinding = new PDOMCPPVariable(pdom, parent, name);
+				} else if (binding instanceof ICPPMethod && parent instanceof PDOMCPPClassType) {
 					pdomBinding = new PDOMCPPMethod(pdom, parent, name);
+				} else if (binding instanceof CPPImplicitMethod && parent instanceof PDOMCPPClassType) {
+					if(!name.isReference()) {
+						//because we got the implicit method off of an IASTName that is not a reference,
+						//it is no longer completly implicit and it should be treated as a normal method.
+						pdomBinding = new PDOMCPPMethod(pdom, parent, name);
+					}
+				} else if (binding instanceof ICPPFunction) {
+					pdomBinding = new PDOMCPPFunction(pdom, parent, name);
+				} else if (binding instanceof ICPPClassType) {
+					pdomBinding = new PDOMCPPClassType(pdom, parent, name);
+				} else if (binding instanceof ICPPNamespaceAlias) {
+					pdomBinding = new PDOMCPPNamespaceAlias(pdom, parent, name);
+				} else if (binding instanceof ICPPNamespace) {
+					pdomBinding = new PDOMCPPNamespace(pdom, parent, name);
+				} else if (binding instanceof IEnumeration) {
+					pdomBinding = new PDOMCPPEnumeration(pdom, parent, name);
+				} else if (binding instanceof IEnumerator) {
+					IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
+					PDOMBinding pdomEnumeration = adaptBinding(enumeration);
+					if (pdomEnumeration instanceof PDOMCPPEnumeration)
+						pdomBinding = new PDOMCPPEnumerator(pdom, parent, name,
+								(PDOMCPPEnumeration)pdomEnumeration);
+				} else if (binding instanceof ITypedef) {
+					pdomBinding = new PDOMCPPTypedef(pdom, parent, name, (ITypedef)binding);
 				}
-			} else if (binding instanceof ICPPFunction) {
-				pdomBinding = new PDOMCPPFunction(pdom, parent, name);
-			} else if (binding instanceof ICPPClassType) {
-				pdomBinding = new PDOMCPPClassType(pdom, parent, name);
-			} else if (binding instanceof ICPPNamespaceAlias) {
-				pdomBinding = new PDOMCPPNamespaceAlias(pdom, parent, name);
-			} else if (binding instanceof ICPPNamespace) {
-				pdomBinding = new PDOMCPPNamespace(pdom, parent, name);
-			} else if (binding instanceof IEnumeration) {
-				pdomBinding = new PDOMCPPEnumeration(pdom, parent, name);
-			} else if (binding instanceof IEnumerator) {
-				IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType();
-				PDOMBinding pdomEnumeration = adaptBinding(enumeration);
-				if (pdomEnumeration instanceof PDOMCPPEnumeration)
-				pdomBinding = new PDOMCPPEnumerator(pdom, parent, name,
-						(PDOMCPPEnumeration)pdomEnumeration);
-			} else if (binding instanceof ITypedef) {
-				pdomBinding = new PDOMCPPTypedef(pdom, parent, name, (ITypedef)binding);
 			}
 		}
 		
@@ -294,7 +279,7 @@ class PDOMCPPLinkage extends PDOMLinkage {
 			// so if the binding is from another pdom it has to be adapted. 
 		}
 		
-		PDOMNode parent = getParent(binding);
+		PDOMNode parent = getAdaptedParent(binding);
 		if (parent == this) {
 			FindBinding visitor = new FindBinding(pdom, binding.getNameCharArray(), getBindingType(binding));
 			getIndex().accept(visitor);
@@ -318,7 +303,8 @@ class PDOMCPPLinkage extends PDOMLinkage {
 		return null;
 	}
 	
-	public IBinding resolveBinding(IASTName name) throws CoreException {
+	public PDOMBinding resolveBinding(IASTName name) throws CoreException {
+		// mstodo revisit
 		IBinding origBinding = name.getBinding();
 		if (origBinding != null)
 			return adaptBinding(origBinding);
@@ -329,7 +315,7 @@ class PDOMCPPLinkage extends PDOMLinkage {
 			IASTName lastName = names[names.length - 1];
 			PDOMBinding nsBinding = adaptBinding(names[names.length - 2].resolveBinding());
 			if (nsBinding instanceof IScope) {
-				return ((IScope)nsBinding).getBinding(lastName, true);
+				return (PDOMBinding) ((IScope)nsBinding).getBinding(lastName, true);
 			}
 		}
 		IASTNode parent = name.getParent();
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java
index d9ee2268f4e..cd3ef20f4cf 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java
@@ -125,10 +125,6 @@ class PDOMCPPNamespace extends PDOMCPPBinding
 		}
 	}
 
-	public void flushCache() throws DOMException {
-		throw new PDOMNotImplementedError();
-	}
-
 	public IBinding getBinding(IASTName name, boolean resolve) throws DOMException {
 		try {
 			if (name instanceof ICPPASTQualifiedName) {
@@ -147,7 +143,7 @@ class PDOMCPPNamespace extends PDOMCPPBinding
 							nsname = names[i];
 					}
 					// make sure we're the namespace they're talking about
-					if (nsname != null && !equals(pdom.resolveBinding(nsname)))
+					if (nsname != null && !equals(pdom.findBinding(nsname)))
 						return null;
 					
 					// Look up the name
@@ -198,24 +194,11 @@ class PDOMCPPNamespace extends PDOMCPPBinding
 		return null;
 	}
 
-	public IASTNode getPhysicalNode() throws DOMException {
-		throw new PDOMNotImplementedError();
-	}
-
 	public IName getScopeName() throws DOMException {
 		throw new PDOMNotImplementedError();
 	}
 
-	public boolean isFullyCached() throws DOMException {
-		return true;
-	}
-
 	public void removeBinding(IBinding binding) throws DOMException {
 		throw new PDOMNotImplementedError();
 	}
-
-	public void setFullyCached(boolean b) throws DOMException {
-		throw new PDOMNotImplementedError();
-	}
-	
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java
index 76f05070e32..d6da5e32890 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@@ -51,7 +52,7 @@ class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter {
 		
 		IType type = param.getType();
 		if (type != null) {
-			PDOMNode typeNode = getLinkage().addType(this, type);
+			PDOMNode typeNode = getLinkageImpl().addType(this, type);
 			db.putInt(record + TYPE, typeNode != null ? typeNode.getRecord() : 0);
 		}
 	}
@@ -97,7 +98,7 @@ class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter {
 
 	public IType getType() throws DOMException {
 		try {
-			PDOMNode node = getLinkage().getNode(pdom.getDB().getInt(record + TYPE));
+			PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
 			return node instanceof IType ? (IType)node : null;
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java
index ec3a7d54f92..0848242a43b 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 package org.eclipse.cdt.internal.core.pdom.dom.cpp;
 
@@ -34,7 +35,7 @@ class PDOMCPPTypedef extends PDOMBinding implements ITypedef {
 			throws CoreException {
 		super(pdom, parent, name);
 		IType type = typedef.getType();
-		PDOMNode typeNode = parent.getLinkage().addType(this, type);
+		PDOMNode typeNode = parent.getLinkageImpl().addType(this, type);
 		if (typeNode != null)
 			pdom.getDB().putInt(record + TYPE, typeNode.getRecord());
 	}
@@ -53,7 +54,7 @@ class PDOMCPPTypedef extends PDOMBinding implements ITypedef {
 
 	public IType getType() throws DOMException {
 		try {
-			PDOMNode node = getLinkage().getNode(pdom.getDB().getInt(record + TYPE));
+			PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + TYPE));
 			return node instanceof IType ? (IType)node : null;
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java
index 6a67fbfd41c..ac328f46cd9 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@@ -43,7 +44,7 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable {
 		if (nameParent instanceof IASTDeclarator) {
 			IASTDeclarator declarator = (IASTDeclarator)nameParent;
 			IType type = CPPVisitor.createType(declarator);
-			PDOMNode typeNode = parent.getLinkage().addType(this, type);
+			PDOMNode typeNode = parent.getLinkageImpl().addType(this, type);
 			if (typeNode != null)
 				pdom.getDB().putInt(record + TYPE_OFFSET, typeNode.getRecord());
 		}
@@ -68,7 +69,7 @@ class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable {
 	public IType getType() throws DOMException {
 		try {
 			int typeRec = pdom.getDB().getInt(record + TYPE_OFFSET);
-			return (IType)getLinkage().getNode(typeRec);
+			return (IType)getLinkageImpl().getNode(typeRec);
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
 			return null;
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java
index d76762cb2a4..10def35fede 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastHandleDelta.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.indexer.fast;
@@ -16,13 +17,11 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.index.IIndexFile;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICElementDelta;
-import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.pdom.PDOMCodeReaderFactory;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -121,47 +120,15 @@ class PDOMFastHandleDelta extends PDOMFastIndexerJob {
 		}
 	}
 	
-	protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
-		ILanguage language = tu.getLanguage();
-		if (language == null)
-			return;
-	
-		PDOMCodeReaderFactory codeReaderFactory = new PDOMCodeReaderFactory(pdom);
-		
-		// get the AST in a "Fast" way
-		IASTTranslationUnit ast = language.getASTTranslationUnit(tu,
-				codeReaderFactory,
-				ILanguage.AST_USE_INDEX	| ILanguage.AST_SKIP_IF_NO_BUILD_INFO);
-		if (ast == null)
-			return;
-
-		// Clear the macros
-		codeReaderFactory.clearMacros();
-
-		pdom.acquireWriteLock();
-		try {
-			// Remove the old symbols in the tu
-			IPath path = ((IFile)tu.getResource()).getLocation();
-			PDOMFile file = pdom.getFile(path);
-			if (file != null)
-				file.clear();
-
-			// Add the new symbols
-			addSymbols(tu.getLanguage(), ast);
-		} finally {
-			pdom.releaseWriteLock();
-		}
-	}
-
 	protected void removeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
-		pdom.acquireWriteLock();
+		index.acquireWriteLock(0);
 		try {
 			IPath path = ((IFile)tu.getResource()).getLocation();
-			PDOMFile file = pdom.getFile(path);
+			IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(path);
 			if (file != null)
-				file.clear();
+				index.clearFile(file);
 		} finally {
-			pdom.releaseWriteLock();
+			index.releaseWriteLock(0);
 		}
 	}
 
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
index 5b792818189..76b3ee4ec7a 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastIndexerJob.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.indexer.fast;
@@ -22,11 +23,13 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
 import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.PDOMCodeReaderFactory;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
+import org.eclipse.cdt.core.parser.IScannerInfo;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
+import org.eclipse.cdt.internal.core.index.IWritableIndex;
+import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
+import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 
 /**
  * @author Doug Schaefer
@@ -35,8 +38,8 @@ import org.eclipse.core.runtime.CoreException;
 public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
 
 	protected final PDOMFastIndexer indexer;
-	protected final PDOM pdom;
-	protected final PDOMCodeReaderFactory codeReaderFactory;
+	protected final IWritableIndex index;
+	protected final IndexBasedCodeReaderFactory codeReaderFactory;
 	
 	// Error counter. If we too many errors we bail
 	protected int errorCount;
@@ -44,8 +47,8 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
 
 	public PDOMFastIndexerJob(PDOMFastIndexer indexer) throws CoreException {
 		this.indexer = indexer;
-		this.pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(indexer.getProject());
-		this.codeReaderFactory = new PDOMCodeReaderFactory(pdom);
+		this.index= ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject());
+		this.codeReaderFactory = new IndexBasedCodeReaderFactory(index);
 	}
 
 	public IPDOMIndexer getIndexer() {
@@ -53,33 +56,53 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
 	}
 	
 	protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
+		// we can do the same as for changing a tu
+		changeTU(tu);
+	}
+
+	protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
 		ILanguage language = tu.getLanguage();
 		if (language == null)
 			return;
 	
-		// get the AST in a "Fast" way
-		IASTTranslationUnit ast = language.getASTTranslationUnit(tu,
-				codeReaderFactory,
-				ILanguage.AST_USE_INDEX	| ILanguage.AST_SKIP_IF_NO_BUILD_INFO);
-		if (ast == null)
+		// skip if no scanner info
+		IScannerInfo scanner= tu.getScannerInfo(false);
+		if (scanner == null) {
 			return;
-		
-		// Clear the macros
-		codeReaderFactory.clearMacros();
+		}
 
-		pdom.acquireWriteLock();
+		IPath path = tu.getLocation();
+		if (path == null) {
+			return;
+		}
+
+		index.acquireReadLock();
 		try {
-			addSymbols(language, ast);
-		} finally {
-			pdom.releaseWriteLock();
+			// get the AST in a "Fast" way
+			IASTTranslationUnit ast= language.getASTTranslationUnit(tu.getCodeReader(), scanner, codeReaderFactory, index);
+
+			index.acquireWriteLock(1);
+			try {
+				// Clear the macros
+				codeReaderFactory.clearMacros();
+				
+				// Remove the old symbols in the tu
+				IIndexFragmentFile file= (IIndexFragmentFile) index.getFile(path);
+				if (file != null)
+					index.clearFile(file);
+
+				// Add the new symbols
+				addSymbols(ast);
+			} finally {
+				index.releaseWriteLock(1);
+			}
+		}
+		finally {
+			index.releaseReadLock();
 		}
 	}
 
-	protected void addSymbols(ILanguage language, IASTTranslationUnit ast) throws InterruptedException, CoreException {
-		final PDOMLinkage linkage = pdom.getLinkage(language);
-		if (linkage == null)
-			return;
-			
+	protected void addSymbols(IASTTranslationUnit ast) throws InterruptedException, CoreException {
 		// Add in the includes
 		IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
 		for (int i = 0; i < includes.length; ++i) {
@@ -91,10 +114,10 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
 				? sourceLoc.getFileName()
 				: ast.getFilePath(); // command-line includes
 				
-			PDOMFile sourceFile = codeReaderFactory.getCachedFile(sourcePath);
+			IIndexFragmentFile sourceFile = codeReaderFactory.createCachedFile(index, sourcePath);
 			String destPath = include.getPath();
-			PDOMFile destFile = codeReaderFactory.getCachedFile(destPath);
-			sourceFile.addIncludeTo(destFile);
+			IIndexFragmentFile destFile = codeReaderFactory.createCachedFile(index, destPath);
+			index.addInclude(sourceFile, destFile);
 		}
 	
 		// Add in the macros
@@ -107,8 +130,8 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
 				continue; // skip built-ins and command line macros
 				
 			String filename = sourceLoc.getFileName();
-			PDOMFile sourceFile = codeReaderFactory.getCachedFile(filename);
-			sourceFile.addMacro(macro);
+			IIndexFragmentFile sourceFile = codeReaderFactory.createCachedFile(index, filename);
+			index.addMacro(sourceFile, macro);
 		}
 			
 		// Add in the names
@@ -121,7 +144,7 @@ public abstract class PDOMFastIndexerJob implements IPDOMIndexerTask {
 				try {
 					IASTFileLocation nameLoc = name.getFileLocation();
 					if (nameLoc != null)
-						linkage.addName(name, codeReaderFactory.getCachedFile(nameLoc.getFileName()));
+						index.addName(codeReaderFactory.createCachedFile(index, nameLoc.getFileName()), name);
 					return PROCESS_CONTINUE;
 				} catch (Throwable e) {
 					CCorePlugin.log(e);
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java
index 5a6b63c5b40..29a73915df7 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/fast/PDOMFastReindex.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.indexer.fast;
@@ -57,7 +58,13 @@ public class PDOMFastReindex extends PDOMFastIndexerJob {
 			long start = System.currentTimeMillis();
 			
 			// First clear the pdom
-			pdom.clear();
+			index.acquireWriteLock(0);
+			try {
+				index.clear();
+			}
+			finally {
+				index.releaseWriteLock(0);
+			}
 			
 			ISourceRoot[] roots = indexer.getProject().getAllSourceRoots();
 			for (int i = 0; i < roots.length; ++i)
@@ -66,11 +73,12 @@ public class PDOMFastReindex extends PDOMFastIndexerJob {
 			String showTimings = Platform.getDebugOption(CCorePlugin.PLUGIN_ID
 					+ "/debug/pdomtimings"); //$NON-NLS-1$
 			if (showTimings != null && showTimings.equalsIgnoreCase("true")) //$NON-NLS-1$
-				System.out.println("PDOM Fast Reindex Time: " + (System.currentTimeMillis() - start)
+				System.out.println("PDOM Fast Reindex Time: " + (System.currentTimeMillis() - start) //$NON-NLS-1$
 						+ " " + indexer.getProject().getElementName()); //$NON-NLS-1$
 
 		} catch (CoreException e) {
 			CCorePlugin.log(e);
+		} catch (InterruptedException e) {
 		}
 	}
 
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullHandleDelta.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullHandleDelta.java
index 33bca5e6281..60e4f1d95b6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullHandleDelta.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullHandleDelta.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.indexer.full;
@@ -18,13 +19,14 @@ import java.util.List;
 import java.util.Map;
 
 import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexFile;
+import org.eclipse.cdt.core.index.IIndexInclude;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICElementDelta;
 import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -142,16 +144,16 @@ public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
 	
 	protected void processTranslationUnit(ITranslationUnit tu) throws CoreException {
 		IPath path = tu.getUnderlyingResource().getLocation();
-		PDOMFile pdomFile = pdom.getFile(path);
+		IIndexFile pdomFile= index.getFile(path);
 		boolean found = false;
 		if (pdomFile != null) {
 			// Look for all source units in the included list,
 			// If none, then add the header
-			PDOMFile[] includedBy = pdomFile.getAllIncludedBy();
+			IIndexInclude[] includedBy = index.findIncludedBy(pdomFile, IIndex.DEPTH_INFINITE); 
 			if (includedBy.length > 0) {
 				IProject project = tu.getCProject().getProject();
 				for (int i = 0; i < includedBy.length; ++i) {
-					String incfilename = includedBy[i].getFileName().getString();
+					String incfilename = includedBy[i].getIncludedByLocation();
 					if (CoreModel.isValidSourceUnitName(project, incfilename)) {
 						if (changed.get(incfilename) == null) {
 							IFile[] rfiles = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(incfilename));
@@ -170,44 +172,16 @@ public class PDOMFullHandleDelta extends PDOMFullIndexerJob {
 		if (!found)
 			changed.put(path.toOSString(), tu);
 	}
-	
-	protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
-		IASTTranslationUnit ast = parse(tu);
-		if (ast == null)
-			return;
-
-		// Remove the old symbols in the tu and all the headers
-		pdom.acquireWriteLock();
-		try {
-			IPath path = ((IFile)tu.getResource()).getLocation();
-			PDOMFile file = pdom.getFile(path);
-			if (file != null)
-				file.clear();
-	
-			IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
-			for (int i = 0; i < includes.length; ++i) {
-				String incname = includes[i].getPath();
-				PDOMFile incfile = pdom.getFile(incname);
-				if (incfile != null)
-					incfile.clear();
-			}
-			
-			// Add the new symbols
-			addSymbols(tu.getLanguage(), ast);
-		} finally {
-			pdom.releaseWriteLock();
-		}
-	}
 
 	protected void removeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
-		pdom.acquireWriteLock();
+		index.acquireWriteLock(0);
 		try {
 			IPath path = ((IFile)tu.getResource()).getLocation();
-			PDOMFile file = pdom.getFile(path);
+			IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(path);
 			if (file != null)
-				file.clear();
+				index.clearFile(file);
 		} finally {
-			pdom.releaseWriteLock();
+			index.releaseWriteLock(0);
 		}
 	}
 
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java
index f0eb7303b90..d7c5b1b3d01 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullIndexerJob.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.indexer.full;
@@ -20,12 +21,13 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
 import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
+import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
+import org.eclipse.cdt.internal.core.index.IWritableIndex;
+import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
 
 /**
  * @author Doug Schaefer
@@ -34,7 +36,7 @@ import org.eclipse.core.runtime.CoreException;
 public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
 
 	protected final PDOMFullIndexer indexer;
-	protected final PDOM pdom;
+	protected final IWritableIndex index;
 	
 	// Error count, bail when it gets too high
 	protected int errorCount;
@@ -42,49 +44,51 @@ public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
 	
 	public PDOMFullIndexerJob(PDOMFullIndexer indexer) throws CoreException {
 		this.indexer = indexer;
-		this.pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(indexer.getProject());
+		this.index = ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(indexer.getProject());
 	}
 
 	public IPDOMIndexer getIndexer() {
 		return indexer;
 	}
 	
-	protected IASTTranslationUnit parse(ITranslationUnit tu) throws CoreException {
-		ILanguage language = tu.getLanguage();
-		if (language == null)
-			return null;
-		
-		// get the AST in the "Full" way, i.e. don't skip anything.
-		return language.getASTTranslationUnit(tu, ILanguage.AST_SKIP_IF_NO_BUILD_INFO);
-	}
-
 	protected void addTU(ITranslationUnit tu) throws InterruptedException, CoreException {
-		IASTTranslationUnit ast = parse(tu);
+		changeTU(tu);
+	}
+	
+	protected void changeTU(ITranslationUnit tu) throws CoreException, InterruptedException {
+		IPath path = tu.getLocation();
+		if (path == null) {
+			return;
+		}
+		IASTTranslationUnit ast= tu.getAST(null, ITranslationUnit.AST_SKIP_IF_NO_BUILD_INFO);
 		if (ast == null)
 			return;
 		
-		pdom.acquireWriteLock();
+		index.acquireWriteLock(0);
+		
 		try {
-			// First clear out the symbols in the includes
+			// Remove the old symbols in the tu
+			IIndexFragmentFile file = (IIndexFragmentFile) index.getFile(path);
+			if (file != null)
+				index.clearFile(file);
+
+			// Clear out the symbols in the includes
 			IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
 			for (int i = 0; i < includes.length; ++i) {
 				String incname = includes[i].getPath();
-				PDOMFile incfile = pdom.getFile(incname);
-				if (incfile != null)
-					incfile.clear();
+				IIndexFragmentFile incfile = (IIndexFragmentFile) index.getFile(new Path(incname));
+				if (incfile != null) {
+					index.clearFile(incfile);
+				}
 			}
 			
-			addSymbols(tu.getLanguage(), ast);
+			addSymbols(ast);
 		} finally {
-			pdom.releaseWriteLock();
+			index.releaseWriteLock(0);
 		}
 	}
 	
-	public void addSymbols(ILanguage language, IASTTranslationUnit ast) throws CoreException {
-		final PDOMLinkage linkage = pdom.getLinkage(language);
-		if (linkage == null)
-			return;
-		
+	protected void addSymbols(IASTTranslationUnit ast) throws CoreException {
 		// Add in the includes
 		IASTPreprocessorIncludeStatement[] includes = ast.getIncludeDirectives();
 		for (int i = 0; i < includes.length; ++i) {
@@ -96,12 +100,12 @@ public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
 				? sourceLoc.getFileName()
 				: ast.getFilePath(); // command-line includes
 				
-			PDOMFile sourceFile = pdom.addFile(sourcePath);
+			IIndexFragmentFile sourceFile = index.addFile(sourcePath);
 			String destPath = include.getPath();
-			PDOMFile destFile = pdom.addFile(destPath);
-			sourceFile.addIncludeTo(destFile);
+			IIndexFragmentFile destFile = index.addFile(destPath);
+			index.addInclude(sourceFile, destFile);
 		}
-	
+					
 		// Add in the macros
 		IASTPreprocessorMacroDefinition[] macros = ast.getMacroDefinitions();
 		for (int i = 0; i < macros.length; ++i) {
@@ -110,33 +114,29 @@ public abstract class PDOMFullIndexerJob implements IPDOMIndexerTask {
 			IASTFileLocation sourceLoc = macro.getFileLocation();
 			if (sourceLoc == null)
 				continue; // skip built-ins and command line macros
-			
-			PDOMFile sourceFile = pdom.getFile(sourceLoc.getFileName());
-			if (sourceFile != null) // not sure why this would be null
-				sourceFile.addMacro(macro);
+				
+			String filename = sourceLoc.getFileName();
+			IIndexFragmentFile sourceFile = index.addFile(filename);
+			index.addMacro(sourceFile, macro);
 		}
-		
+					
 		// Add in the names
 		ast.accept(new ASTVisitor() {
 			{
 				shouldVisitNames = true;
 				shouldVisitDeclarations = true;
 			}
-
 			public int visit(IASTName name) {
 				try {
-					IASTFileLocation fileloc = name.getFileLocation();
-					if (fileloc != null) {
-						PDOMFile file = pdom.addFile(fileloc.getFileName());
-						linkage.addName(name, file);
-					}
+					IASTFileLocation nameLoc = name.getFileLocation();
+					if (nameLoc != null)
+						index.addName(index.addFile(nameLoc.getFileName()), name);
 					return PROCESS_CONTINUE;
 				} catch (Throwable e) {
 					CCorePlugin.log(e);
 					return ++errorCount > MAX_ERRORS ? PROCESS_ABORT : PROCESS_CONTINUE;
 				}
-			};
-		});;
+			}
+		});
 	}
-
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java
index e9331fbc415..6ac21f924a6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/full/PDOMFullReindex.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.indexer.full;
@@ -15,7 +16,6 @@ import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICElementVisitor;
 import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -37,7 +37,7 @@ public class PDOMFullReindex extends PDOMFullIndexerJob {
 			long start = System.currentTimeMillis();
 			
 			// First clear out the PDOM
-			pdom.clear();
+			index.clear();
 			
 			// First index all the source files (i.e. not headers)
 			indexer.getProject().accept(new ICElementVisitor() {
@@ -74,11 +74,9 @@ public class PDOMFullReindex extends PDOMFullIndexerJob {
 					case ICElement.C_UNIT:
 						ITranslationUnit tu = (ITranslationUnit)element;
 						if (tu.isHeaderUnit()) {
-							IFile rfile = (IFile)tu.getUnderlyingResource();
-							IPath fileLocation = rfile.getLocation();
+							IPath fileLocation = tu.getLocation();
 							if ( fileLocation != null ) {
-								String filename = fileLocation.toOSString();
-								if (pdom.getFile(filename) == null) {
+								if (index.getFile(fileLocation) == null) {
 									try {
 										addTU(tu);
 									} catch (InterruptedException e) {
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java
index b97a4f58991..47e1da9e7e6 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/indexer/nulli/PDOMNullIndexer.java
@@ -7,20 +7,20 @@
  *
  * Contributors:
  * QNX - Initial API and implementation
+ * Markus Schorn (Wind River Systems)
  *******************************************************************************/
 
 package org.eclipse.cdt.internal.core.pdom.indexer.nulli;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.IPDOMIndexer;
+import org.eclipse.cdt.core.dom.IPDOMIndexerTask;
 import org.eclipse.cdt.core.model.ICElementDelta;
 import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.internal.core.pdom.PDOM;
+import org.eclipse.cdt.internal.core.index.IWritableIndex;
+import org.eclipse.cdt.internal.core.index.IWritableIndexManager;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
 
 /**
  * @author Doug Schaefer
@@ -29,7 +29,7 @@ import org.eclipse.core.runtime.jobs.Job;
  */
 public class PDOMNullIndexer implements IPDOMIndexer {
 
-	public static final String ID = "org.eclipse.cdt.core.nullindexer";
+	public static final String ID = "org.eclipse.cdt.core.nullindexer"; //$NON-NLS-1$
 	
 	private ICProject project;
 	
@@ -43,33 +43,32 @@ public class PDOMNullIndexer implements IPDOMIndexer {
 	
 	public void handleDelta(ICElementDelta delta) {
 	}
-	
-	private class Reindex extends Job {
-		public Reindex() {
-			super("Null Reindex"); //$NON-NLS-1$
-			setSystem(true);
+		
+	private class PDOMNullReindex implements IPDOMIndexerTask {
+		public IPDOMIndexer getIndexer() {
+			return PDOMNullIndexer.this;
 		}
-		protected IStatus run(IProgressMonitor monitor) {
+
+		public void run(IProgressMonitor monitor) {
 			try {
-				PDOM pdom = (PDOM)CCorePlugin.getPDOMManager().getPDOM(project);
+				IWritableIndex index= ((IWritableIndexManager) CCorePlugin.getIndexManager()).getWritableIndex(project);
+				index.acquireWriteLock(0);
 				try {
-					pdom.acquireWriteLock();
-					pdom.clear();
-					return Status.OK_STATUS;
-				} catch (CoreException e) {
-					return e.getStatus();
-				} catch (InterruptedException e) {
-					return Status.CANCEL_STATUS;
-				} finally {
-					pdom.releaseWriteLock();
+					index.clear();
 				}
-			} catch (CoreException e) {
-				return e.getStatus();
+				finally {
+					index.releaseWriteLock(0);
+				}
+			}
+			catch (InterruptedException e) {
+			} 
+			catch (CoreException e) {
+				CCorePlugin.log(e);
 			}
 		}
 	}
 	public void reindex() throws CoreException {
-		new Reindex().schedule();
+		CCorePlugin.getPDOMManager().enqueue(new PDOMNullReindex());
 	}
 
 }
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties
new file mode 100644
index 00000000000..54995ed29ce
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/messages.properties
@@ -0,0 +1 @@
+WritablePDOM_error_unknownLinkage=AST specifies unknown linkage ''{0}''
diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml
index f5bcf9c3f5d..5b9549da56c 100644
--- a/core/org.eclipse.cdt.core/plugin.xml
+++ b/core/org.eclipse.cdt.core/plugin.xml
@@ -567,6 +567,12 @@
             name="GNU C++">
          <contentType id="org.eclipse.cdt.core.cxxSource"/>
       </language>
+      <pdomLinkageFactory
+            class="org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory"
+            id="C"/>
+      <pdomLinkageFactory
+            class="org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkageFactory"
+            id="C++"/>
    </extension>
    <extension
          point="org.eclipse.core.runtime.adapters">
diff --git a/core/org.eclipse.cdt.core/schema/language.exsd b/core/org.eclipse.cdt.core/schema/language.exsd
index d61057489ef..971e4fae955 100644
--- a/core/org.eclipse.cdt.core/schema/language.exsd
+++ b/core/org.eclipse.cdt.core/schema/language.exsd
@@ -12,8 +12,11 @@
 
    <element name="extension">
       <complexType>
-         <sequence>
-            <element ref="language"/>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <choice>
+               <element ref="language"/>
+               <element ref="pdomLinkageFactory"/>
+            </choice>
          </sequence>
          <attribute name="point" type="string" use="required">
             <annotation>
@@ -44,7 +47,7 @@
 
    <element name="language">
       <complexType>
-         <sequence>
+         <sequence minOccurs="1" maxOccurs="unbounded">
             <element ref="contentType"/>
          </sequence>
          <attribute name="id" type="string">
@@ -67,7 +70,7 @@
                   
                </documentation>
                <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.cdt.core.model.ILanguage"/>
+                  <meta.attribute kind="java" basedOn="org.eclipse.cdt.core.model.AbstractLanguage"/>
                </appInfo>
             </annotation>
          </attribute>
@@ -86,6 +89,28 @@
       </complexType>
    </element>
 
+   <element name="pdomLinkageFactory">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The factory that creates linkage objects.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
    <annotation>
       <appInfo>
          <meta.section type="since"/>
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
index 7f725a4ac6c..96f0af9efc4 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java
@@ -26,6 +26,7 @@ import java.util.ResourceBundle;
 
 import org.eclipse.cdt.core.dom.CDOM;
 import org.eclipse.cdt.core.dom.IPDOMManager;
+import org.eclipse.cdt.core.index.IIndexManager;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.IWorkingCopy;
 import org.eclipse.cdt.core.parser.IScannerInfoProvider;
@@ -244,6 +245,10 @@ public class CCorePlugin extends Plugin {
 		return fgCPlugin;
 	}
 
+	public static void log(String e) {
+		log(createStatus(e));
+	}
+	
 	public static void log(Throwable e) {
 		if ( e instanceof CoreException ) {
 			log(((CoreException)e).getStatus());
@@ -252,6 +257,14 @@ public class CCorePlugin extends Plugin {
 		}
 	}
 
+	public static IStatus createStatus(String msg) {
+		return createStatus(msg, null);
+	}
+
+	public static IStatus createStatus(String msg, Throwable e) {
+		return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, msg, e);
+	}
+	
 	public static void log(IStatus status) {
 		((Plugin) getDefault()).getLog().log(status);
 	}
@@ -638,9 +651,16 @@ public class CCorePlugin extends Plugin {
 		return fCoreModel;
 	}
 
+	/** 
+	 * deprecated, use getIndexManager()
+	 */
 	public static IPDOMManager getPDOMManager() {
 		return getDefault().pdomManager;
 	}
+
+	public static IIndexManager getIndexManager() {
+		return getDefault().pdomManager;
+	}
 	
 	public IPathEntryVariableManager getPathEntryVariableManager() {
 		return fPathEntryVariableManager;
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseTestCase.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseTestCase.java
index 321274d8fbd..3cbce55784e 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseTestCase.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/BaseTestCase.java
@@ -30,17 +30,15 @@ import org.eclipse.core.runtime.Path;
 import org.eclipse.swt.widgets.Display;
 
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.index.IIndex;
+import org.eclipse.cdt.core.index.IIndexFile;
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.core.model.ILanguage;
 import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.testplugin.util.TestSourceReader;
 import org.eclipse.cdt.ui.testplugin.CTestPlugin;
 
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
-
 public class BaseTestCase extends TestCase {
 	private boolean fExpectFailure= false;
 	private int fBugnumber= 0;
@@ -144,31 +142,31 @@ public class BaseTestCase extends TestCase {
     	return TestSourceReader.createFile(container, new Path(fileName), contents);
     }
     
-    protected IASTTranslationUnit createPDOMBasedAST(ICProject project, IFile file) throws CModelException, CoreException {
+    protected IASTTranslationUnit createIndexBasedAST(IIndex index, ICProject project, IFile file) throws CModelException, CoreException {
     	ICElement elem= project.findElement(file.getFullPath());
     	if (elem instanceof ITranslationUnit) {
     		ITranslationUnit tu= (ITranslationUnit) elem;
     		if (tu != null) {
-    			return tu.getLanguage().getASTTranslationUnit(tu, ILanguage.AST_SKIP_INDEXED_HEADERS |ILanguage.AST_USE_INDEX);
+    			return tu.getAST(index, ITranslationUnit.AST_SKIP_INDEXED_HEADERS);
     		}
     	}
     	fail("Could not create ast for " + file.getFullPath());
     	return null;
     }
 
-	protected void waitForIndexer(PDOM pdom, IFile file, int maxmillis) throws Exception {
+	protected void waitForIndexer(IIndex index, IFile file, int maxmillis) throws Exception {
 		long endTime= System.currentTimeMillis() + maxmillis;
 		do {
-			pdom.acquireReadLock();
+			index.acquireReadLock();
 			try {
-				PDOMFile pfile= pdom.getFile(file.getLocation());
+				IIndexFile pfile= index.getFile(file.getLocation());
 				// mstodo check timestamp
 				if (pfile != null) {
 					return;
 				}
 			}
 			finally {
-				pdom.releaseReadLock();
+				index.releaseReadLock();
 			}
 			
 			Thread.sleep(50);
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCallHierarchyTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCallHierarchyTest.java
index 04f48b95a5f..b715f8dd1b9 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCallHierarchyTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCallHierarchyTest.java
@@ -54,7 +54,7 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
 	private void doTestFunctions(String filename) throws IOException, Exception, PartInitException {
 		String content = readTaggedComment("testFunctions");
 		IFile file= createFile(getProject(), filename, content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -100,7 +100,7 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
 	private void doTestVariables(String filename) throws Exception {
 		String content = readTaggedComment("testVariables");
 		IFile file= createFile(getProject(), filename, content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -158,7 +158,7 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
 	private void doTestEnumerator(String filename, String contentTag) throws Exception {
 		String content = readTaggedComment(contentTag);
 		IFile file= createFile(getProject(), filename, content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -223,7 +223,7 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
 	private void doTestStructMembers(String filename) throws Exception {
 		String content = readTaggedComment("testStructMembers");
 		IFile file= createFile(getProject(), filename, content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -281,7 +281,7 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
 	private void doTestAnonymousStructMembers(String filename) throws Exception {
 		String content = readTaggedComment("testStructMembers");
 		IFile file= createFile(getProject(), filename, content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -355,7 +355,7 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
 	private void doTestUnionMembers(String filename) throws Exception {
 		String content = readTaggedComment("testUnionMembers");
 		IFile file= createFile(getProject(), filename, content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -413,7 +413,7 @@ public class BasicCallHierarchyTest extends CallHierarchyBaseTest {
 	private void doTestAnonymousUnionMembers(String filename) throws Exception {
 		String content = readTaggedComment("testUnionMembers");
 		IFile file= createFile(getProject(), filename, content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCppCallHierarchyTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCppCallHierarchyTest.java
index 1d53df65377..d19e4d4da9a 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCppCallHierarchyTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/BasicCppCallHierarchyTest.java
@@ -57,7 +57,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void testMethods() throws Exception {
 		String content = readTaggedComment("testMethods");
 		IFile file= createFile(getProject(), "testMethods.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -141,7 +141,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void testStaticMethods() throws Exception {
 		String content = readTaggedComment("testStaticMethods");
 		IFile file= createFile(getProject(), "testStaticMethods.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -230,7 +230,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void testFields() throws Exception {
 		String content = readTaggedComment("testFields");
 		IFile file= createFile(getProject(), "testFields.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -305,7 +305,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void _testAutomaticConstructor_156668() throws Exception {
 		String content = readTaggedComment("testAutomaticConstructor");
 		IFile file= createFile(getProject(), "testConstructor.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -335,7 +335,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void testConstructor() throws Exception {
 		String content = readTaggedComment("testConstructor");
 		IFile file= createFile(getProject(), "testConstructor.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -349,7 +349,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void _testDestructor_156669() throws Exception {
 		String content = readTaggedComment("testConstructor");
 		IFile file= createFile(getProject(), "testConstructor.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -385,7 +385,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void testNamespace() throws Exception {
 		String content = readTaggedComment("testNamespace");
 		IFile file= createFile(getProject(), "testNamespace.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
@@ -443,7 +443,7 @@ public class BasicCppCallHierarchyTest extends CallHierarchyBaseTest {
 	public void _testNamespacePart2_156519() throws Exception {
 		String content = readTaggedComment("testNamespace");
 		IFile file= createFile(getProject(), "testNamespace.cpp", content);
-		waitForIndexer(fPdom, file, MAX_TIME_INDEXER);
+		waitForIndexer(fIndex, file, MAX_TIME_INDEXER);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBaseTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBaseTest.java
index 38eb59573a5..588ad92f2af 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBaseTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CallHierarchyBaseTest.java
@@ -19,13 +19,13 @@ import org.eclipse.swt.widgets.TreeItem;
 import org.eclipse.ui.IWorkbenchPage;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.IPDOMIndexer;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.testplugin.CProjectHelper;
 import org.eclipse.cdt.ui.CUIPlugin;
 import org.eclipse.cdt.ui.tests.BaseTestCase;
 
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-
 import org.eclipse.cdt.internal.ui.callhierarchy.CHViewPart;
 import org.eclipse.cdt.internal.ui.callhierarchy.CallHierarchyUI;
 import org.eclipse.cdt.internal.ui.editor.CEditor;
@@ -33,7 +33,7 @@ import org.eclipse.cdt.internal.ui.editor.CEditor;
 public class CallHierarchyBaseTest extends BaseTestCase {
 	
 	private ICProject fCProject;
-	public PDOM fPdom;
+	protected IIndex fIndex;
 
 	public CallHierarchyBaseTest(String name) {
 		super(name);
@@ -42,8 +42,14 @@ public class CallHierarchyBaseTest extends BaseTestCase {
 	protected void setUp() throws CoreException {
 		fCProject= CProjectHelper.createCProject("__chTest__", "bin");
 		CCorePlugin.getPDOMManager().setIndexerId(fCProject, "org.eclipse.cdt.core.fastIndexer");
-		fPdom= (PDOM) CCorePlugin.getPDOMManager().getPDOM(fCProject);
-		fPdom.clear();
+		IPDOMIndexer indexer = CCorePlugin.getPDOMManager().getIndexer(fCProject);
+		try {
+			indexer.reindex();
+		} catch (CoreException e) {
+			CUIPlugin.getDefault().log(e);
+		}
+
+		fIndex= CCorePlugin.getIndexManager().getIndex(fCProject);
 	}
 	
 	protected void tearDown() throws CoreException {
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java
new file mode 100644
index 00000000000..8b5217169f6
--- /dev/null
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/CppCallHierarchyTest.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2006 Wind River Systems, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Markus Schorn - initial API and implementation
+ *******************************************************************************/ 
+
+package org.eclipse.cdt.ui.tests.callhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+import org.eclipse.cdt.internal.ui.editor.CEditor;
+
+
+public class CppCallHierarchyTest extends CallHierarchyBaseTest {
+	
+	private static final int MAX_TIME_INDEXER = 1000;
+
+	public CppCallHierarchyTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		return suite(CppCallHierarchyTest.class);
+	}
+
+	// {testMethods.h}
+	// class MyClass {
+	// public:
+	//    void method();
+	//    void inline_method() {
+	//        method(); // r1
+	//        inline_method(); // r1
+	//    }
+	// };
+	
+	// {testMethods.cpp}
+	// #include "testMethods.h"
+	// void MyClass::method() {
+	//    method(); // r2
+	//    inline_method(); // r2
+	// }
+	//
+	// void func() {
+    //	   MyClass m, *n;
+    //	   m.method(); // r3
+    //	   n->inline_method(); // r3
+    // }
+	public void _testMethods() throws Exception {
+		String header= readTaggedComment("testMethods.h");
+		IFile headerFile= createFile(getProject(), "testMethods.h", header);
+		String source = readTaggedComment("testMethods.cpp");
+		IFile sourceFile= createFile(getProject(), "testMethods.cpp", source);
+		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
+		CEditor editor= (CEditor) IDE.openEditor(page, sourceFile);
+		waitForIndexer(fIndex, sourceFile, MAX_TIME_INDEXER);
+		
+		editor.selectAndReveal(source.indexOf("method"), 2);
+		openCallHierarchy(editor);
+		Tree tree= getCHTree(page);
+
+		checkTreeNode(tree, 0, "MyClass::method()");
+		checkTreeNode(tree, 0, 0, "MyClass::inline_method()");
+		checkTreeNode(tree, 0, 1, "MyClass::method()");
+		checkTreeNode(tree, 0, 2, "func()");
+
+		editor.selectAndReveal(source.indexOf("method(); // r2"), 2);
+		openCallHierarchy(editor);
+
+		checkTreeNode(tree, 0, "MyClass::method()");
+		checkTreeNode(tree, 0, 0, "MyClass::inline_method()");
+		checkTreeNode(tree, 0, 1, "MyClass::method()");
+		checkTreeNode(tree, 0, 2, "func()");
+
+		editor.selectAndReveal(source.indexOf("inline_method(); // r2"), 2);
+		openCallHierarchy(editor);
+		checkTreeNode(tree, 0, "MyClass::inline_method()");
+		checkTreeNode(tree, 0, 0, "MyClass::inline_method()");
+		checkTreeNode(tree, 0, 1, "MyClass::method()");
+		checkTreeNode(tree, 0, 2, "func()");
+
+		editor.selectAndReveal(source.indexOf("method(); // r3"), 2);
+		openCallHierarchy(editor);
+		checkTreeNode(tree, 0, "MyClass::method()");
+		checkTreeNode(tree, 0, 0, "MyClass::inline_method()");
+		checkTreeNode(tree, 0, 1, "MyClass::method()");
+		checkTreeNode(tree, 0, 2, "func()");
+
+		editor.selectAndReveal(source.indexOf("inline_method(); // r3"), 2);
+		openCallHierarchy(editor);
+		checkTreeNode(tree, 0, "MyClass::inline_method()");
+		checkTreeNode(tree, 0, 0, "MyClass::inline_method()");
+		checkTreeNode(tree, 0, 1, "MyClass::method()");
+		checkTreeNode(tree, 0, 2, "func()");
+	}
+}
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/InitializersInCallHierarchyTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/InitializersInCallHierarchyTest.java
index 4e6e3d523ee..2811fb1ae93 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/InitializersInCallHierarchyTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/callhierarchy/InitializersInCallHierarchyTest.java
@@ -37,7 +37,7 @@ public class InitializersInCallHierarchyTest extends CallHierarchyBaseTest {
 	public void testCIntVarInitializer() throws Exception {
 		String content = readTaggedComment("intvar");
 		IFile file= createFile(getProject(), "intvar.c", content);
-		waitForIndexer(fPdom, file, 1000);
+		waitForIndexer(fIndex, file, 1000);
 		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 		CEditor editor= (CEditor) IDE.openEditor(page, file);
 
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/BaseSelectionTestsIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/BaseSelectionTestsIndexer.java
index c99d3a1cc4a..7ebb9842408 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/BaseSelectionTestsIndexer.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/BaseSelectionTestsIndexer.java
@@ -214,7 +214,7 @@ public class BaseSelectionTestsIndexer extends TestCase {
             if (sel instanceof ITextSelection) {
             	ITextSelection textSel = (ITextSelection)sel;
             	ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
-            	IASTTranslationUnit ast = tu.getLanguage().getASTTranslationUnit(tu, 0);
+            	IASTTranslationUnit ast = tu.getAST();
                 IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
 	                
                 if (names == null || names.length == 0)
@@ -302,7 +302,7 @@ public class BaseSelectionTestsIndexer extends TestCase {
             if (sel instanceof TextSelection) {
             	ITextSelection textSel = (ITextSelection)sel;
             	ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
-            	IASTTranslationUnit ast = tu.getLanguage().getASTTranslationUnit(tu, 0);
+            	IASTTranslationUnit ast = tu.getAST();
                 IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
                 
                 if (names == null || names.length == 0)
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java
index ee62ce39dd0..76f3d458a05 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CPPSelectionTestsNoIndexer.java
@@ -236,7 +236,7 @@ public class CPPSelectionTestsNoIndexer extends TestCase {
             if (sel instanceof TextSelection) {
             	ITextSelection textSel = (ITextSelection)sel;
             	ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
-            	IASTTranslationUnit ast = tu.getLanguage().getASTTranslationUnit(tu, 0);
+            	IASTTranslationUnit ast = tu.getAST();
                 IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
                 
                 if (names.length == 0) {
@@ -280,7 +280,7 @@ public class CPPSelectionTestsNoIndexer extends TestCase {
             if (sel instanceof TextSelection) {
             	ITextSelection textSel = (ITextSelection)sel;
             	ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
-            	IASTTranslationUnit ast = tu.getLanguage().getASTTranslationUnit(tu, 0);
+            	IASTTranslationUnit ast = tu.getAST();
                 IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
                 
                 if (names == null || names.length == 0)
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CSelectionTestsNoIndexer.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CSelectionTestsNoIndexer.java
index cd840eaf5ee..0317b3fbc87 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CSelectionTestsNoIndexer.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/CSelectionTestsNoIndexer.java
@@ -288,7 +288,7 @@ public class CSelectionTestsNoIndexer extends TestCase {
             if (sel instanceof TextSelection) {
             	ITextSelection textSel = (ITextSelection)sel;
             	ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
-            	IASTTranslationUnit ast = tu.getLanguage().getASTTranslationUnit(tu, 0);
+            	IASTTranslationUnit ast = tu.getAST();
                 IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
                 
                 if (names == null || names.length == 0)
@@ -331,7 +331,7 @@ public class CSelectionTestsNoIndexer extends TestCase {
             if (sel instanceof TextSelection) {
             	ITextSelection textSel = (ITextSelection)sel;
             	ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(file);
-            	IASTTranslationUnit ast = tu.getLanguage().getASTTranslationUnit(tu, 0);
+            	IASTTranslationUnit ast = tu.getAST();
                 IASTName[] names = tu.getLanguage().getSelectedNames(ast, textSel.getOffset(), textSel.getLength());
                 
                 if (names == null || names.length == 0)
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/ResolveBindingTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/ResolveBindingTests.java
index 6845198d1e0..45357a05311 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/ResolveBindingTests.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/selection/ResolveBindingTests.java
@@ -15,26 +15,28 @@ import junit.framework.Test;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.IPDOMIndexer;
 import org.eclipse.cdt.core.dom.ast.IASTName;
 import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
 import org.eclipse.cdt.core.dom.ast.IBinding;
 import org.eclipse.cdt.core.dom.ast.IProblemBinding;
 import org.eclipse.cdt.core.dom.ast.IVariable;
 import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
+import org.eclipse.cdt.core.index.IIndex;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.testplugin.CProjectHelper;
+import org.eclipse.cdt.ui.CUIPlugin;
 import org.eclipse.cdt.ui.tests.BaseTestCase;
 
-import org.eclipse.cdt.internal.core.pdom.PDOM;
-
 public class ResolveBindingTests extends BaseTestCase  {
 
 	private static final int WAIT_FOR_INDEXER = 5000;
 	private ICProject fCProject;
-	private PDOM fPdom;
+	private IIndex fIndex;
 
 	public ResolveBindingTests(String name) {
 		super(name);
@@ -48,8 +50,13 @@ public class ResolveBindingTests extends BaseTestCase  {
 		super.setUp();
 		fCProject= CProjectHelper.createCProject("ResolveBindingTests", "bin");
 		CCorePlugin.getPDOMManager().setIndexerId(fCProject, "org.eclipse.cdt.core.fastIndexer");
-		fPdom= (PDOM) CCorePlugin.getPDOMManager().getPDOM(fCProject);
-		fPdom.clear();
+		IPDOMIndexer indexer = CCorePlugin.getPDOMManager().getIndexer(fCProject);
+		try {
+			indexer.reindex();
+		} catch (CoreException e) {
+			CUIPlugin.getDefault().log(e);
+		}
+		fIndex= CCorePlugin.getIndexManager().getIndex(fCProject);
 	}
 		
 	protected void tearDown() throws Exception {
@@ -90,33 +97,47 @@ public class ResolveBindingTests extends BaseTestCase  {
 	public void testNamespaceVarBinding() throws Exception {
 		String content = readTaggedComment("namespace-var-test");
 		IFile file= createFile(fCProject.getProject(), "nsvar.cpp", content);
-		waitForIndexer(fPdom, file, WAIT_FOR_INDEXER);
+		waitForIndexer(fIndex, file, WAIT_FOR_INDEXER);
 		
-		IASTTranslationUnit astTU= createPDOMBasedAST(fCProject, file);
-		IASTName name= getSelectedName(astTU, content.indexOf("var"), 3);
-		IBinding binding= name.resolveBinding();
-		assertTrue(binding instanceof IVariable);
+		IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
+		index.acquireReadLock();
+		try {
+			IASTTranslationUnit astTU= createIndexBasedAST(index, fCProject, file);
+			IASTName name= getSelectedName(astTU, content.indexOf("var"), 3);
+			IBinding binding= name.resolveBinding();
+			assertTrue(binding instanceof IVariable);
 
-		name= getSelectedName(astTU, content.indexOf("var; // r1"), 3);
-		checkBinding(name, IVariable.class);
+			name= getSelectedName(astTU, content.indexOf("var; // r1"), 3);
+			checkBinding(name, IVariable.class);
 
-		name= getSelectedName(astTU, content.indexOf("var; // r2"), 3);
-		checkBinding(name, IVariable.class);
+			name= getSelectedName(astTU, content.indexOf("var; // r2"), 3);
+			checkBinding(name, IVariable.class);
+		}
+		finally {
+			index.releaseReadLock();
+		}			
 	}
 
 	public void _testNamespaceVarBinding_156519() throws Exception {
 		String content = readTaggedComment("namespace-var-test");
 		IFile file= createFile(fCProject.getProject(), "nsvar.cpp", content);
-		waitForIndexer(fPdom, file, WAIT_FOR_INDEXER);
+		waitForIndexer(fIndex, file, WAIT_FOR_INDEXER);
 		
-		IASTTranslationUnit astTU= createPDOMBasedAST(fCProject, file);
+		IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
+		index.acquireReadLock();
+		try {
+			IASTTranslationUnit astTU= createIndexBasedAST(index, fCProject, file);
 
-		IASTName name= getSelectedName(astTU, content.indexOf("var; // r1"), 3);
-		IBinding binding= name.resolveBinding();
-		checkBinding(name, IVariable.class);
+			IASTName name= getSelectedName(astTU, content.indexOf("var; // r1"), 3);
+			IBinding binding= name.resolveBinding();
+			checkBinding(name, IVariable.class);
 
-		name= getSelectedName(astTU, content.indexOf("var; // r2"), 3);
-		checkBinding(name, IVariable.class);
+			name= getSelectedName(astTU, content.indexOf("var; // r2"), 3);
+			checkBinding(name, IVariable.class);
+		}
+		finally {
+			index.releaseReadLock();
+		}
 	}
 	
 	// {testMethods.h}
@@ -141,22 +162,29 @@ public class ResolveBindingTests extends BaseTestCase  {
 		IFile hfile= createFile(fCProject.getProject(), "testMethods.h", content);
 		content = readTaggedComment("testMethods.cpp");
 		IFile cppfile= createFile(fCProject.getProject(), "testMethods.cpp", content);
-		waitForIndexer(fPdom, hfile, WAIT_FOR_INDEXER);
+		waitForIndexer(fIndex, hfile, WAIT_FOR_INDEXER);
 		
-		IASTTranslationUnit astTU= createPDOMBasedAST(fCProject, cppfile);
+		IIndex index= CCorePlugin.getIndexManager().getIndex(fCProject);
+		index.acquireReadLock();
+		try {
+			IASTTranslationUnit astTU= createIndexBasedAST(index, fCProject, cppfile);
 
-		IASTName name= getSelectedName(astTU, content.indexOf("method"), 6);
-		IBinding binding= name.resolveBinding();
-		checkBinding(name, ICPPMethod.class);
+			IASTName name= getSelectedName(astTU, content.indexOf("method"), 6);
+			IBinding binding= name.resolveBinding();
+			checkBinding(name, ICPPMethod.class);
 
-		name= getSelectedName(astTU, content.indexOf("method(); // r1"), 6);
-		checkBinding(name, ICPPMethod.class);
+			name= getSelectedName(astTU, content.indexOf("method(); // r1"), 6);
+			checkBinding(name, ICPPMethod.class);
 
-		name= getSelectedName(astTU, content.indexOf("method(); // r2"), 6);
-		checkBinding(name, ICPPMethod.class);
+			name= getSelectedName(astTU, content.indexOf("method(); // r2"), 6);
+			checkBinding(name, ICPPMethod.class);
 
-		name= getSelectedName(astTU, content.indexOf("method(); // r3"), 6);
-		checkBinding(name, ICPPMethod.class);
+			name= getSelectedName(astTU, content.indexOf("method(); // r3"), 6);
+			checkBinding(name, ICPPMethod.class);
+		}
+		finally {
+			index.releaseReadLock();
+		}
 	}
 
 }