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 633d4e6b032..89ff73a9e9e 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
@@ -19,6 +19,7 @@ import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 import org.eclipse.cdt.core.model.CModelException;
+import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IEnumeration;
@@ -33,6 +34,7 @@ import org.eclipse.cdt.core.model.IMethodDeclaration;
 import org.eclipse.cdt.core.model.INamespace;
 import org.eclipse.cdt.core.model.IParent;
 import org.eclipse.cdt.core.model.IStructure;
+import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.model.ITypeDef;
 import org.eclipse.cdt.core.model.IVariable;
 import org.eclipse.cdt.core.model.IVariableDeclaration;
@@ -41,7 +43,6 @@ import org.eclipse.cdt.internal.core.model.CElement;
 import org.eclipse.cdt.internal.core.model.FunctionTemplate;
 import org.eclipse.cdt.internal.core.model.MethodTemplate;
 import org.eclipse.cdt.internal.core.model.StructureTemplate;
-import org.eclipse.cdt.internal.core.model.TranslationUnit;
 import org.eclipse.cdt.testplugin.CProjectHelper;
 import org.eclipse.cdt.testplugin.CTestPlugin;
 import org.eclipse.core.resources.IFile;
@@ -92,8 +93,8 @@ public class CModelElementsTests extends TestCase {
 	}	
 			
 	public void testCModelElements() throws CModelException{
-		TranslationUnit tu = new TranslationUnit(fCProject, headerFile);
-		TranslationUnit included = new TranslationUnit(fCProject, includedFile);
+		ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(headerFile);
+		//ITranslationUnit included = (ITranslationUnit)CoreModel.getDefault().create(includedFile);
 
 		// parse the translation unit to get the elements tree		
 		tu.parse(); 
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java
index a5b7d085663..9a890b1f94e 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/ElementDeltaTests.java
@@ -241,8 +241,8 @@ public class ElementDeltaTests extends TestCase implements IElementChangedListen
 			addedElements.clear();
 			removedElements.clear();
 			changedElements.clear();
-			
-			processDelta(event.getDelta());
+			ICElementDelta delta = event.getDelta();
+			processDelta(delta);
 		} catch(CModelException e) {
 		}		
 	}
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 b9e1e037599..719c9633e7a 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
@@ -6,14 +6,13 @@ package org.eclipse.cdt.core.model.tests;
 
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
-import java.util.Map;
 
 import junit.framework.TestCase;
 
 import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.model.TranslationUnit;
 import org.eclipse.cdt.testplugin.CProjectHelper;
 import org.eclipse.cdt.testplugin.CTestPlugin;
 import org.eclipse.core.resources.IFile;
@@ -79,12 +78,15 @@ public abstract class IntegratedCModelTest extends TestCase {
 	}	
 
 	protected ITranslationUnit getTU() {
-		TranslationUnit tu = new TranslationUnit(fCProject, sourceFile);
+		ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(sourceFile);
 		if(isStructuralParse()) {
 			CCorePlugin.getDefault().setStructuralParseMode(true);
+		} else {
+			CCorePlugin.getDefault().setStructuralParseMode(false);
 		}
 		// parse the translation unit to get the elements tree		
-		Map newElement = tu.parse();
+		// Force the parsing now to do this in the right ParseMode.
+		tu.parse();
 		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 ea0c3bcb3c9..95b51461631 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
@@ -20,6 +20,7 @@ import junit.framework.TestSuite;
 
 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.ICElement;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IEnumeration;
@@ -34,6 +35,7 @@ import org.eclipse.cdt.core.model.IMethodDeclaration;
 import org.eclipse.cdt.core.model.INamespace;
 import org.eclipse.cdt.core.model.IParent;
 import org.eclipse.cdt.core.model.IStructure;
+import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.model.ITypeDef;
 import org.eclipse.cdt.core.model.IVariable;
 import org.eclipse.cdt.core.model.IVariableDeclaration;
@@ -42,7 +44,6 @@ import org.eclipse.cdt.internal.core.model.CElement;
 import org.eclipse.cdt.internal.core.model.FunctionTemplate;
 import org.eclipse.cdt.internal.core.model.MethodTemplate;
 import org.eclipse.cdt.internal.core.model.StructureTemplate;
-import org.eclipse.cdt.internal.core.model.TranslationUnit;
 import org.eclipse.cdt.testplugin.CProjectHelper;
 import org.eclipse.cdt.testplugin.CTestPlugin;
 import org.eclipse.core.resources.IFile;
@@ -93,8 +94,8 @@ public class StructuralCModelElementsTests extends TestCase {
 	}	
 			
 	public void testCModelElements() throws CModelException{
-		TranslationUnit tu = new TranslationUnit(fCProject, headerFile);
-		TranslationUnit included = new TranslationUnit(fCProject, includedFile);
+		ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(headerFile);
+		//ITranslationUnit included = (ITranslationUnit)CoreModel.getDefault().create(includedFile);
 		// turn on the structural parse mode
 		CCorePlugin.getDefault().setStructuralParseMode(true);
 		
diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java
index fa7e073b49e..7765c3d1f03 100644
--- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java
+++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java
@@ -18,11 +18,11 @@ import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.IBuffer;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.ITranslationUnit;
 import org.eclipse.cdt.core.model.IWorkingCopy;
-import org.eclipse.cdt.internal.core.model.TranslationUnit;
 import org.eclipse.cdt.testplugin.CProjectHelper;
 import org.eclipse.cdt.testplugin.CTestPlugin;
 import org.eclipse.cdt.testplugin.TestPluginLauncher;
@@ -80,7 +80,7 @@ public class WorkingCopyTests extends TestCase {
 		
 		
 	public void testWorkingCopy() throws Exception {
-		ITranslationUnit tu = new TranslationUnit(fCProject, headerFile);		
+		ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(headerFile);
 		// CreateWorkingCopy		
 		assertNotNull (tu);
 		IWorkingCopy wc = tu.getWorkingCopy();
diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog
index e3770feb872..ae0d652fd7f 100644
--- a/core/org.eclipse.cdt.core/ChangeLog
+++ b/core/org.eclipse.cdt.core/ChangeLog
@@ -1,3 +1,18 @@
+2004-06-18 Alain Magloire
+
+	This was heavy and lots of files were change.  The problem: to create the CElementInfo we use
+	to synchronize of the CModelManager singleton instance, this was handy and allowed us to serialize
+	the creation of the proxy info and save in the LRU cache.  Then came Eclipse-3.0 with job spawning
+	everywhere, lots of deadlock since the CModelManager was lock and the singleton is the center
+	to get all the info.  We use the same scheme as the JDT by using a ThreadLocal class cache
+	to collect the information.  We fixed a couple of bug allong the way and probably introduce some.
+
+	The tests were doing something stupid, by creating directly the TranslationUnit:
+		new TranslationUnit(project, file);
+	This does not work since only the sourceRoot can be the parent
+	of a TranslationUnit, the tests are now fix bug we should restrict access of the class in the core model
+	after 2.0.
+
 2004-06-18 Andrew Niefer
 	- DeltaProcessor.updateIndexRemoveResource() : discard if removing a project, discard index jobs for that project.
 
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java
index 558e6574d4a..c2861639499 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Archive.java
@@ -53,16 +53,12 @@ public class Archive extends Openable implements IArchive {
 	protected ArchiveInfo getArchiveInfo() throws CModelException {
 		return (ArchiveInfo)getElementInfo();
 	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
-	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
+
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
 		throws CModelException {
-		CModelManager.getDefault().putInfo(this, info);
 		return computeChildren(info, underlyingResource);
 	}
 
-
 	public boolean computeChildren(OpenableInfo info, IResource res) {
 		IBinaryArchive ar = getBinaryArchive();
 		if (ar != null) {
@@ -100,4 +96,5 @@ public class Archive extends Openable implements IArchive {
 		}
 		super.closing(info);
 	}
+
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java
index ad98fa73c2a..6a334d5e7f4 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ArchiveContainer.java
@@ -33,13 +33,12 @@ public class ArchiveContainer extends Openable implements IArchiveContainer {
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
+	 * @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)
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
 		throws CModelException {
 		// this will bootstrap/start the runner for the project.
 		CModelManager.getDefault().getBinaryRunner(getCProject());
-		CModelManager.getDefault().putInfo(this, info);
 		return true;
 	}
 
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java
index ae839c623a0..35188337cb0 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Binary.java
@@ -210,15 +210,13 @@ public class Binary extends Openable implements IBinary {
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
+	 * @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)
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
 		throws CModelException {
-		CModelManager.getDefault().putInfo(this, info);
 		return computeChildren(info, underlyingResource);
 	}
 
-
 	boolean computeChildren(OpenableInfo info, IResource res) throws CModelException {
 		boolean ok = false;
 		if (isObject() || isExecutable() || isSharedLib()) {
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java
index 0112de9bdca..26afef108b1 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryContainer.java
@@ -43,13 +43,12 @@ public class BinaryContainer extends Openable implements IBinaryContainer {
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
+	 * @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)
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
 		throws CModelException {
 		// this will bootstrap/start the runner for the project.
 		CModelManager.getDefault().getBinaryRunner(getCProject());
-		CModelManager.getDefault().putInfo(this, info);
 		return true;
 	}
 
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java
index 7d3adad6607..4101adc58d1 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryElement.java
@@ -5,6 +5,7 @@
 package org.eclipse.cdt.internal.core.model;
 
 import java.io.IOException;
+import java.util.Map;
 
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.IBinary;
@@ -166,4 +167,10 @@ public class BinaryElement extends CElement implements IBinaryElement, ISourceMa
 		return null;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.model.CElement#generateInfos(java.lang.Object, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected void generateInfos(Object info, Map newElements, IProgressMonitor monitor) throws CModelException {
+	}
+
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java
index 5a90dd97c97..459ae797ff6 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryModule.java
@@ -5,6 +5,8 @@
 
 package org.eclipse.cdt.internal.core.model;
 
+import java.util.Map;
+
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.IBinary;
 import org.eclipse.cdt.core.model.IBinaryElement;
@@ -12,6 +14,7 @@ import org.eclipse.cdt.core.model.IBinaryModule;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
 
 /**
  */
@@ -76,4 +79,10 @@ public class BinaryModule extends Parent implements IBinaryModule {
 		return path;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.model.CElement#generateInfos(java.lang.Object, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected void generateInfos(Object info, Map newElements, IProgressMonitor monitor) throws CModelException {
+	}
+
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java
index b3285811160..87a24202710 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainer.java
@@ -159,14 +159,12 @@ public class CContainer extends Openable implements ICContainer {
 	/**
 	 * @see Openable
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource)
 			throws CModelException {
 		boolean validInfo = false;
 		try {
 			IResource res = getResource();
 			if (res != null && res.isAccessible()) {
-				// put the info now, because computing the roots requires it
-				CModelManager.getDefault().putInfo(this, info);
 				validInfo = computeChildren(info, res);
 			} else {
 				throw newNotPresentException();
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java
index 556f9ecbb86..1bc0e262d71 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java
@@ -4,6 +4,10 @@ package org.eclipse.cdt.internal.core.model;
  * All Rights Reserved.
  */
 
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICElementVisitor;
@@ -231,18 +235,20 @@ public abstract class CElement extends PlatformObject implements ICElement {
 		}
 		return false;
 	}
-	
-	public CElementInfo getElementInfo () throws CModelException {
+
+	public CElementInfo getElementInfo() throws CModelException {
+		return getElementInfo(null);
+	}
+
+	public CElementInfo getElementInfo (IProgressMonitor monitor) throws CModelException {
 		CModelManager manager = CModelManager.getDefault();
-		Object info = manager.getInfo(this);
-		if (info == null) {
-			openHierarchy();
-			info= manager.getInfo(this);
-			if (info == null) {
-				throw newNotPresentException();
-			}
+		CElementInfo info = (CElementInfo)manager.getInfo(this);
+		if (info != null) {
+			return info;
 		}
-		return (CElementInfo)info;
+		info = createElementInfo();
+		openWhenClosed(info, monitor);
+		return info;
 	}
 
 	public String toString() {
@@ -331,29 +337,54 @@ public abstract class CElement extends PlatformObject implements ICElement {
 		return null;
 	}
 
+	/**
+	 * Builds this element's structure and properties in the given
+	 * info object, based on this element's current contents (i.e. buffer
+	 * contents if this element has an open buffer, or resource contents
+	 * if this element does not have an open buffer). Children
+	 * are placed in the given newElements table (note, this element
+	 * has already been placed in the newElements table). Returns true
+	 * if successful, or false if an error is encountered while determining
+	 * the structure of this element.
+	 */
+	protected abstract void generateInfos(Object info, Map newElements, IProgressMonitor monitor) throws CModelException;
 
 	/**
-	 * Opens this element and all parents that are not already open.
-	 *
-	 * @exception CModelException this element is not present or accessible
+	 * Open a <code>IOpenable</code> that is known to be closed (no check for
+	 * <code>isOpen()</code>).
 	 */
-	protected void openHierarchy() throws CModelException {
-		if (this instanceof IOpenable) {
-			((Openable) this).openWhenClosed(null);
-		} else {
-			Openable openableParent = (Openable)getOpenableParent();
-			if (openableParent != null) {
-				CElementInfo openableParentInfo = (CElementInfo) CModelManager.getDefault().getInfo(openableParent);
-				if (openableParentInfo == null) {
-					openableParent.openWhenClosed(null);
-				} 
-				//else {
-					CModelManager.getDefault().putInfo( this, createElementInfo());
-				//}
+	protected void openWhenClosed(CElementInfo info, IProgressMonitor pm) throws CModelException {
+		CModelManager manager = CModelManager.getDefault();
+		boolean hadTemporaryCache = manager.hasTemporaryCache();
+		try {
+			HashMap newElements = manager.getTemporaryCache();
+			generateInfos(info, newElements, pm);
+			if (info == null) {
+				info = (CElementInfo)newElements.get(this);
+			}
+			if (info == null) { // a source ref element could not be opened
+				// close any buffer that was opened for the openable parent
+				Iterator iterator = newElements.keySet().iterator();
+				while (iterator.hasNext()) {
+					ICElement element = (ICElement)iterator.next();
+					if (element instanceof Openable) {
+						((Openable)element).closeBuffer();
+					}
+				}
+				throw newNotPresentException();
+			}
+			if (!hadTemporaryCache) {
+				manager.putInfos(this, newElements);
+			}
+
+		} finally {
+			if (!hadTemporaryCache) {
+				manager.resetTemporaryCache();
 			}
 		}
 	}
 
+
 	/**
 	 * @see ICElement
 	 */
@@ -386,27 +417,6 @@ public abstract class CElement extends PlatformObject implements ICElement {
 	protected CModelException newNotPresentException() {
 		return new CModelException(new CModelStatus(ICModelStatusConstants.ELEMENT_DOES_NOT_EXIST, this));
 	}
-	/**
-	 * Removes all cached info from the C Model, including all children,
-	 * but does not close this element.
-	 */
-	protected void removeInfo() {
-		Object info = CModelManager.getDefault().peekAtInfo(this);
-		if (info != null) {
-			if (this instanceof IParent) {
-				ICElement[] children = ((CElementInfo)info).getChildren();
-				for (int i = 0, size = children.length; i < size; ++i) {
-					CElement child = (CElement) children[i];
-					child.removeInfo();
-				}
-				// we have to remove children here 
-				// to clear the children list before 
-				// removing the entry from the cache.
-				((CElementInfo)info).removeChildren();
-			}
-			CModelManager.getDefault().removeInfo(this);
-		}
-	}
 	
 	/**
 	 * Returns the hash code for this Java element. By default,
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java
index 2b920e7f9c6..d02eb108015 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModel.java
@@ -174,15 +174,13 @@ public class CModel extends Openable implements ICModel {
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
+	 * @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)
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException {
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException {
 		boolean validInfo = false;
 		try {
 			IResource res = getResource();
 			if (res != null && (res instanceof IWorkspaceRoot || res.getProject().isOpen())) {
-				// put the info now, because computing the roots requires it
-				CModelManager.getDefault().putInfo(this, info);
 				validInfo = computeChildren(info, res);
 			}
 		} finally {
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java
index 323c9416690..813796c0946 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java
@@ -10,9 +10,7 @@
  ******************************************************************************/
 package org.eclipse.cdt.internal.core.model;
 
-import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 
 import org.eclipse.cdt.core.CCorePlugin;
@@ -95,9 +93,9 @@ public class CModelBuilder {
 		}
 	}
 
-	public CModelBuilder(org.eclipse.cdt.internal.core.model.TranslationUnit tu) {
+	public CModelBuilder(org.eclipse.cdt.internal.core.model.TranslationUnit tu, Map newElements) {
 		this.translationUnit = tu ;
-		this.newElements = new HashMap();
+		this.newElements = newElements;
 	}
 
 	private IASTCompilationUnit parse(boolean quickParseMode, boolean throwExceptionOnError) throws ParserException
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
index 41b2d4af180..f88774bc018 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelManager.java
@@ -1017,13 +1017,56 @@ public class CModelManager implements IResourceChangeListener, ICDescriptorListe
 		return this.cache.peekAtInfo(element);
 	}
 
-	/**
-	 * Puts the info for a C Model Element
+	/*
+	 * Puts the infos in the given map (keys are ICElements and values are CElementInfos)
+	 * in the C model cache in an atomic way.
+	 * First checks that the info for the opened element (or one of its ancestors) has not been 
+	 * added to the cache. If it is the case, another thread has opened the element (or one of
+	 * its ancestors). So returns without updating the cache.
 	 */
-	protected synchronized void putInfo(ICElement element, Object info) {
-		this.cache.putInfo(element, info);
-	}
+	protected synchronized void putInfos(ICElement openedElement, Map newElements) {
+		// remove children
+		Object existingInfo = this.cache.peekAtInfo(openedElement);
+		if (openedElement instanceof IParent && existingInfo instanceof CElementInfo) {
+			ICElement[] children = ((CElementInfo)existingInfo).getChildren();
+			for (int i = 0, size = children.length; i < size; ++i) {
+				CElement child = (CElement) children[i];
+				try {
+					child.close();
+				} catch (CModelException e) {
+					// ignore
+				}
+			}
+		}
 	
+		Iterator iterator = newElements.keySet().iterator();
+		while (iterator.hasNext()) {
+			ICElement element = (ICElement)iterator.next();
+			Object info = newElements.get(element);
+			this.cache.putInfo(element, info);
+		}
+	}
+
+	/**
+	 * Removes all cached info from the C Model, including all children,
+	 * but does not close this element.
+	 */
+	protected synchronized void removeChildrenInfo(ICElement openedElement) {
+		// remove children
+		Object existingInfo = this.cache.peekAtInfo(openedElement);
+		if (openedElement instanceof IParent && existingInfo instanceof CElementInfo) {
+			ICElement[] children = ((CElementInfo)existingInfo).getChildren();
+			for (int i = 0, size = children.length; i < size; ++i) {
+				CElement child = (CElement) children[i];
+				try {
+					child.close();
+				} catch (CModelException e) {
+					// ignore
+				}
+			}
+		}
+	}
+
 	/** 
 	 * Removes the info of this model element.
 	 */
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java
index 7a47c7ae283..e9f7c391975 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProject.java
@@ -464,7 +464,7 @@ public class CProject extends Openable implements ICProject {
 	}
 
 	public IOutputEntry[] getOutputEntries() throws CModelException {
-		CProjectInfo pinfo = (CProjectInfo)CModelManager.getDefault().peekAtInfo(this);
+		CProjectInfo pinfo = (CProjectInfo) CModelManager.getDefault().peekAtInfo(this);
 		IOutputEntry[] outs = null;
 		if (pinfo != null) {
 			if (pinfo.outputEntries != null) {
@@ -528,17 +528,15 @@ public class CProject extends Openable implements ICProject {
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
+	 * @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)
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm,
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm,
 			Map newElements, IResource underlyingResource)
 			throws CModelException {
 		boolean validInfo = false;
 		try {
 			IResource res = getResource();
 			if (res != null && res.isAccessible()) {
-				// put the info now, because computing the roots requires it
-				CModelManager.getDefault().putInfo(this, info);
 				validInfo = computeSourceRoots(info, res);
 			} else {
 				throw newNotPresentException();
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Include.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Include.java
index 91ef79fe688..dffe3cdfaa9 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Include.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Include.java
@@ -26,9 +26,6 @@ public class Include extends SourceManipulation implements IInclude {
 		return standard;
 	}
 
-	protected CElementInfo createElementInfo () {
-		return new SourceManipulationInfo(this);
-	}
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.IInclude#getFullFileName()
 	 */
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java
index 44eba2b4836..14be6c62b78 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/IncludeReference.java
@@ -72,10 +72,9 @@ public class IncludeReference extends Openable implements IIncludeReference {
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
+	 * @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)
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException {
-		CModelManager.getDefault().putInfo(this, info);
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException {
 		return computeChildren(info, underlyingResource);
 	}
 
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java
index 0d345cb9389..c5fd5d312dd 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/LibraryReference.java
@@ -6,11 +6,15 @@
  */
 package org.eclipse.cdt.internal.core.model;
 
+import java.util.Map;
+
+import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ILibraryEntry;
 import org.eclipse.cdt.core.model.ILibraryReference;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
 
 /**
  * @author alain
@@ -52,4 +56,10 @@ public class LibraryReference extends Parent implements ILibraryReference {
 		return entry;
 	}
 
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.model.CElement#generateInfos(java.lang.Object, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected void generateInfos(Object info, Map newElements, IProgressMonitor monitor) throws CModelException {
+	}
+
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java
index 48d5f9fda26..fd49f8682a7 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Openable.java
@@ -61,34 +61,23 @@ public abstract class Openable extends Parent implements IOpenable, IBufferChang
 			CModelManager.getDefault().getElementsOutOfSynchWithBuffers().put(this, this);
 		}
 	}	
-	/**
-	 * Updates the info objects for this element and all of its children by
-	 * removing the current infos, generating new infos, and then placing
-	 * the new infos into the C Model cache tables.
-	 */
-	protected void buildStructure(OpenableInfo info, HashMap newElements, IProgressMonitor monitor) throws CModelException {
 
-		if (monitor != null && monitor.isCanceled()) return;
-	
-		// remove existing (old) infos
-		removeInfo();
-		info.setIsStructureKnown(generateInfos(info, monitor, newElements, getResource()));
-		CModelManager.getDefault().getElementsOutOfSynchWithBuffers().remove(this);
-		for (Iterator iter = newElements.keySet().iterator(); iter.hasNext();) {
-			ICElement key = (ICElement) iter.next();
-			Object value = newElements.get(key);
-			CModelManager.getDefault().putInfo(key, value);
-		}
-		
-		// add the info for this at the end, to ensure that a getInfo cannot reply null in case the LRU cache needs
-		// to be flushed. Might lead to performance issues.
-		CModelManager.getDefault().putInfo(this, info);	
-	}
+	/**
+	 * Builds this element's structure and properties in the given
+	 * info object, based on this element's current contents (reuse buffer
+	 * contents if this element has an open buffer, or resource contents
+	 * if this element does not have an open buffer). Children
+	 * are placed in the given newElements table (note, this element
+	 * has already been placed in the newElements table). Returns true
+	 * if successful, or false if an error is encountered while determining
+	 * the structure of this element.
+	 */
+	protected abstract boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException;
 
 	/**
 	 * Close the buffer associated with this element, if any.
 	 */
-	protected void closeBuffer(OpenableInfo info) {
+	protected void closeBuffer() {
 		if (!hasBuffer()) return; // nothing to do
 		IBuffer buffer = null;
 		buffer = getBufferManager().getBuffer(this);
@@ -102,26 +91,9 @@ public abstract class Openable extends Parent implements IOpenable, IBufferChang
 	 * This element is being closed.  Do any necessary cleanup.
 	 */
 	protected void closing(Object info) throws CModelException {
-		if (info instanceof OpenableInfo) {
-			closeBuffer((OpenableInfo)info);
-		} else {
-			closeBuffer(null);
-		}
+		closeBuffer();
 	}
 
-
-	/**
-	 * Builds this element's structure and properties in the given
-	 * info object, based on this element's current contents (i.e. buffer
-	 * contents if this element has an open buffer, or resource contents
-	 * if this element does not have an open buffer). Children
-	 * are placed in the given newElements table (note, this element
-	 * has already been placed in the newElements table). Returns true
-	 * if successful, or false if an error is encountered while determining
-	 * the structure of this element.
-	 */
-	protected abstract boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException;
-
 	/**
 	 * @see org.eclipse.cdt.core.model.IOpenable#getBuffer()
 	 */
@@ -225,28 +197,46 @@ public abstract class Openable extends Parent implements IOpenable, IBufferChang
 		makeConsistent(pm, false);
 	}
 	
-	public void makeConsistent(IProgressMonitor pm, boolean forced) throws CModelException {
-		if (!isConsistent() || forced) {
-			CModelManager manager = CModelManager.getDefault();
-			boolean hadTemporaryCache = manager.hasTemporaryCache();
-			try {
-				HashMap newElements = manager.getTemporaryCache();
-				buildStructure((OpenableInfo)getElementInfo(), newElements, pm);
-			} finally {
-				if (!hadTemporaryCache) {
-					manager.resetTemporaryCache();
-				}				
+	public void makeConsistent(IProgressMonitor monitor, boolean forced) throws CModelException {
+		if (isConsistent()) {
+			return;
+		}
+		
+		// create a new info and make it the current info
+		// (this will remove the info and its children just before storing the new infos)
+		CModelManager manager = CModelManager.getDefault();
+		boolean hadTemporaryCache = manager.hasTemporaryCache();
+		try {
+			HashMap newElements = manager.getTemporaryCache();
+			CElementInfo info = createElementInfo();
+			openWhenClosed(info, monitor);
+			if (newElements.get(this) == null) {
+				// close any buffer that was opened for the new elements
+				Iterator iterator = newElements.keySet().iterator();
+				while (iterator.hasNext()) {
+					ICElement element = (ICElement)iterator.next();
+					if (element instanceof Openable) {
+						((Openable)element).closeBuffer();
+					}
+				}
+				throw newNotPresentException();
+			}
+			if (!hadTemporaryCache) {
+				manager.putInfos(this, newElements);
+			}
+		} finally {
+			if (!hadTemporaryCache) {
+				manager.resetTemporaryCache();
 			}
 		}
+
 	}
 
 	/**
 	 * @see org.eclipse.cdt.core.model.IOpenable#open(IProgressMonitor)
 	 */
 	public void open(IProgressMonitor pm) throws CModelException {
-		if (!isOpen()) {
-			this.openWhenClosed(pm);
-		}
+		getElementInfo(pm);
 	}
 
 	/**
@@ -260,56 +250,49 @@ public abstract class Openable extends Parent implements IOpenable, IBufferChang
 	}
 
 	/**
-	 * 	Open the parent element if necessary
-	 * 
+	 * Open the parent element if necessary.
 	 */
-	protected void openParent(IProgressMonitor pm) throws CModelException {
+	protected void openParent(Object childInfo, Map newElements, IProgressMonitor pm) throws CModelException {
 
 		Openable openableParent = (Openable)getOpenableParent();
-		if (openableParent != null) {
-			if (!openableParent.isOpen()){
-				openableParent.openWhenClosed(pm);
-			}
+		if (openableParent != null && !openableParent.isOpen()){
+			openableParent.generateInfos(openableParent.createElementInfo(), newElements, pm);
 		}
 	}
 
-	/**
-	 * Open a <code>IOpenable</code> that is known to be closed (no check for
-	 * <code>isOpen()</code>).
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.model.CElement#generateInfos(java.lang.Object, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
 	 */
-	protected void openWhenClosed(IProgressMonitor pm) throws CModelException {
-		CModelManager manager = CModelManager.getDefault();
-		boolean hadTemporaryCache = manager.hasTemporaryCache();
-		try {
-			HashMap newElements = manager.getTemporaryCache();
-			// 1) Parent must be open - open the parent if necessary
-			openParent(pm);
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.model.CElement#generateInfos(java.lang.Object, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected void generateInfos(Object info, Map newElements, IProgressMonitor monitor) throws CModelException {
 
-			// 2) create the new element info and open a buffer if needed
-			OpenableInfo info = (OpenableInfo) createElementInfo();
-			IResource resource = getResource();
-			if (resource != null && isSourceElement()) {
-				this.openBuffer(pm);
-			} 
-
-			// 3) build the structure of the openable
-			buildStructure(info, newElements, pm);
-
-			//if (!hadTemporaryCache) {
-			//	manager.putInfos(this, newElements);
-			//}
-
-			// if any problems occuring openning the element, ensure that it's info
-			// does not remain in the cache	(some elements, pre-cache their info
-			// as they are being opened).
-		} catch (CModelException e) {
-			CModelManager.getDefault().removeInfo(this);
-			throw e;
-		} finally {
-			if (!hadTemporaryCache) {
-				manager.resetTemporaryCache();
-			}
+		if (CModelManager.VERBOSE){
+			System.out.println("OPENING Element ("+ Thread.currentThread()+"): " + this); //$NON-NLS-1$//$NON-NLS-2$
 		}
+		
+		// open the parent if necessary
+		openParent(info, newElements, monitor);
+		if (monitor != null && monitor.isCanceled()) return;
+
+		 // puts the info before building the structure so that questions to the handle behave as if the element existed
+		 // (case of compilation units becoming working copies)
+		newElements.put(this, info);
+
+		// build the structure of the openable (this will open the buffer if needed)
+		try {
+			OpenableInfo openableInfo = (OpenableInfo)info;
+			boolean isStructureKnown = buildStructure(openableInfo, monitor, newElements, getResource());
+			openableInfo.setIsStructureKnown(isStructureKnown);
+		} catch (CModelException e) {
+			newElements.remove(this);
+			throw e;
+		}
+		
+		// remove out of sync buffer for this element
+		CModelManager.getDefault().getElementsOutOfSynchWithBuffers().remove(this);
+
 	}
 
 	/**
@@ -326,25 +309,4 @@ public abstract class Openable extends Parent implements IOpenable, IBufferChang
 		}
 	}
 		
-	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.CElement#createElementInfo()
-	 */
-	protected CElementInfo createElementInfo() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object o) {
-		if (o instanceof Openable) {
-			IResource otherRes = ((Openable)o).getResource();
-			IResource res = this.getResource();
-			if (otherRes != null && res != null) {
-				return otherRes.equals(res);
-			}
-		}
-		return super.equals(o);
-	}
 }
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java
index b6b608bdfe5..3f12010dd29 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ReconcileWorkingCopyOperation.java
@@ -48,7 +48,14 @@ public class ReconcileWorkingCopyOperation extends CModelOperation {
 				// update the element infos with the content of the working copy
 				workingCopy.makeConsistent(fMonitor);
 				deltaBuilder.buildDeltas();
-		
+
+				// register the deltas
+				if (deltaBuilder != null){
+					if ((deltaBuilder.delta != null) && (deltaBuilder.delta.getAffectedChildren().length > 0)) {
+						addReconcileDelta(workingCopy, deltaBuilder.delta);
+					}
+				}
+
 			}
 	
 			if (fMonitor != null) fMonitor.worked(2);
@@ -58,12 +65,6 @@ public class ReconcileWorkingCopyOperation extends CModelOperation {
 				if (fMonitor != null && fMonitor.isCanceled()) return;		
 			}
 			
-			// register the deltas
-			if (deltaBuilder != null){
-				if ((deltaBuilder.delta != null) && (deltaBuilder.delta.getAffectedChildren().length > 0)) {
-					addReconcileDelta(workingCopy, deltaBuilder.delta);
-				}
-			}
 		} finally {
 			if (fMonitor != null) fMonitor.done();
 		}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceManipulation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceManipulation.java
index 19080530a4c..bd96ed0d40e 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceManipulation.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/SourceManipulation.java
@@ -5,6 +5,8 @@ package org.eclipse.cdt.internal.core.model;
  * All Rights Reserved.
  */
  
+import java.util.Map;
+
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.IOpenable;
@@ -161,4 +163,21 @@ public class SourceManipulation extends Parent implements ISourceManipulation, I
 		return (this.equals(other) 
 		&& (this.getSourceManipulationInfo().hasSameContentsAs(other.getSourceManipulationInfo())));
 	}
+
+	/*
+	 * @see JavaElement#generateInfos
+	 */
+	protected void generateInfos(Object info, Map newElements, IProgressMonitor pm) throws CModelException {
+		Openable openableParent = (Openable)getOpenableParent();
+		if (openableParent == null) {
+			return;
+		}
+		
+		CElementInfo openableParentInfo = (CElementInfo) CModelManager.getDefault().getInfo(openableParent);
+		if (openableParentInfo == null) {
+			openableParent.generateInfos(openableParent.createElementInfo(), newElements, pm);
+		}
+		newElements.put(this, info);
+	}
+
 }
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 090dbce3480..8cf8c13e480 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
@@ -7,7 +7,6 @@ package org.eclipse.cdt.internal.core.model;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.Map;
 
 import org.eclipse.cdt.core.CCorePlugin;
@@ -237,41 +236,6 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	protected CElementInfo createElementInfo () {
 		return new TranslationUnitInfo(this);
 	}
-	
-	/**
-	 * @param info
-	 * @param monitor
-	 * @throws CModelException
-	 */
-	protected void buildStructure(OpenableInfo info, IProgressMonitor monitor) throws CModelException {
-		if (monitor != null && monitor.isCanceled()) return;
-
-		// remove existing (old) infos
-		removeInfo();
-
-		HashMap newElements = new HashMap(11);
-		info.setIsStructureKnown(generateInfos(info, monitor, newElements, getResource()));
-		CModelManager.getDefault().getElementsOutOfSynchWithBuffers().remove(this);
-		for (Iterator iter = newElements.keySet().iterator(); iter.hasNext();) {
-			ICElement key = (ICElement) iter.next();
-			Object value = newElements.get(key);
-			CModelManager.getDefault().putInfo(key, value);
-		}
-		// problem detection 
-		if (monitor != null && monitor.isCanceled()) return;
-
-		//IProblemRequestor problemRequestor = this.getProblemRequestor();
-		//if (problemRequestor != null && problemRequestor.isActive()){
-		//	problemRequestor.beginReporting();
-		//	CompilationUnitProblemFinder.process(this, problemRequestor, monitor);
-		//	problemRequestor.endReporting();
-		//}
-	
-		// add the info for this at the end, to ensure that a getInfo cannot reply null in case the LRU cache needs
-		// to be flushed. Might lead to performance issues.
-		CModelManager.getDefault().putInfo(this, info);	
-		
-	}
 
 	/**
 	 * Returns true if this handle represents the same Java element
@@ -309,7 +273,7 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 	 * @param newElements
 	 * @param element
 	 */
-	private void getNewElements(Map newElements, CElement element){
+	private void getNewElements(Map mapping, CElement element){
 		Object info = null;
 		try {
 			info = element.getElementInfo();
@@ -321,30 +285,27 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 				int size = children.length;
 				for (int i = 0; i < size; ++i) {
 					CElement child = (CElement) children[i];
-					getNewElements(newElements, child);		
+					getNewElements(mapping, child);		
 				}		
 			}
 		}
-		newElements.put(element, info);		
+		mapping.put(element, info);		
 	}
 	
 	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.internal.core.model.Openable#generateInfos(org.eclipse.cdt.internal.core.model.OpenableInfo, org.eclipse.core.runtime.IProgressMonitor, java.util.Map, org.eclipse.core.resources.IResource)
+	 * @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)
 	 */
-	protected boolean generateInfos(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException {
-		// put the info now, because getting the contents requires it
-		CModelManager.getDefault().putInfo(this, info);
+	protected boolean buildStructure(OpenableInfo info, IProgressMonitor pm, Map newElements, IResource underlyingResource) throws CModelException {
 		TranslationUnitInfo unitInfo = (TranslationUnitInfo) info;
-		
+
+		// We reuse the general info cache in the CModelBuilder, We should not do this
+		// and instead create the info explicitely(see JDT).
+		// So to get by we need to remove in the LRU all the info of this handle
+		CModelManager.getDefault().removeChildrenInfo(this);
+
 		// generate structure
-		Map mapping = this.parse(); 
+		this.parse(newElements); 
 		
-		// this is temporary until the New Model Builder is implemented
-		if(mapping == null) {
-			getNewElements(newElements, this);
-		} else {
-			newElements.putAll(mapping);
-		}
 		///////////////////////////////////////////////////////////////
 		
 		if (isWorkingCopy()) {
@@ -436,6 +397,20 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		return true;
 	}
 
+	/*
+	 * @see Openable#openParent
+	 */
+	protected void openParent(Object childInfo, Map newElements, IProgressMonitor pm) throws CModelException {
+		try {
+			super.openParent(childInfo, newElements, pm);
+		} catch(CModelException e){
+			// allow parent to not exist for working copies defined outside
+			if (!isWorkingCopy()){ 
+				throw e;
+			}
+		}
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.core.model.IOpenable#isConsistent()
 	 */
@@ -457,21 +432,6 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		return false;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.cdt.core.model.IOpenable#makeConsistent(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void makeConsistent(IProgressMonitor pm) throws CModelException {
-		makeConsistent(pm, false);
-	}
-
-	public void makeConsistent(IProgressMonitor pm, boolean forced) throws CModelException {
-		if (!isConsistent() || forced) {
-			// create a new info and make it the current info
-			OpenableInfo info = (OpenableInfo) createElementInfo();
-			buildStructure(info, pm);
-		}
-	}
-
 	/* (non-Javadoc)
 	 * @see org.eclipse.cdt.internal.core.model.Openable#openBuffer(org.eclipse.core.runtime.IProgressMonitor)
 	 */
@@ -500,33 +460,29 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 		return buffer;
 	}
 
+	public Map parse() {
+		Map map = new HashMap();
+		try {
+			getNewElements(map, this);
+		} catch (Exception e) {
+		}
+		return map;
+	}
+
 	/**
 	 * Parse the buffer contents of this element.
 	 */
-	public Map parse(){
+	private void parse(Map newElements){
 		try {
-			removeChildren(this);
-			CModelBuilder modelBuilder = new CModelBuilder(this);
+			CModelBuilder modelBuilder = new CModelBuilder(this, newElements);
 			boolean quickParseMode = ! (CCorePlugin.getDefault().useStructuralParseMode());
-			return modelBuilder.parse(quickParseMode);
+			modelBuilder.parse(quickParseMode);
 		} catch (Exception e) {
 			// use the debug log for this exception.
 			Util.debugLog( "Exception in CModelBuilder", IDebugLogConstants.MODEL);  //$NON-NLS-1$
-			return null;
 		}							
 	}
 	
-	public void removeChildren(ICElement element) throws CModelException{
-		if (element instanceof Parent){
-			Parent parent = (Parent) element;
-			ICElement[] children = parent.getChildren();
-			for(int i =0; i< children.length; ++i){
-				removeChildren(children[i]);
-			}
-			parent.removeChildren();
-		}
-	}
-
 	public IProblemRequestor getProblemRequestor() {
 		return problemRequestor;
 	}
@@ -587,6 +543,5 @@ public class TranslationUnit extends Openable implements ITranslationUnit {
 			return res.exists();
 		return super.exists();
 	}
-
 	
 }
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/CompletionProposalsBaseTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/CompletionProposalsBaseTest.java
index bb21e856c3e..3bb9ceb1194 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/CompletionProposalsBaseTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist/CompletionProposalsBaseTest.java
@@ -23,12 +23,13 @@ import junit.framework.TestCase;
 import org.eclipse.cdt.core.CCProjectNature;
 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;
 import org.eclipse.cdt.core.model.IWorkingCopy;
 import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
 import org.eclipse.cdt.core.parser.ast.IASTNode;
 import org.eclipse.cdt.core.parser.ast.IASTScope;
-import org.eclipse.cdt.internal.core.model.TranslationUnit;
 import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
 import org.eclipse.cdt.internal.ui.text.contentassist.CCompletionProcessor;
 import org.eclipse.cdt.testplugin.CProjectHelper;
@@ -51,7 +52,7 @@ public abstract class CompletionProposalsBaseTest  extends TestCase{
 	private IFile fCFile;
 	private IFile fHeaderFile;
 	private NullProgressMonitor monitor;
-	private TranslationUnit tu = null;
+	private ITranslationUnit tu = null;
 	private String buffer = EMPTY_STRING;
 	private Document document = null;
 	
@@ -120,8 +121,8 @@ public abstract class CompletionProposalsBaseTest  extends TestCase{
 	public void testCompletionProposals(){
 		try{
 			// setup the translation unit, the buffer and the document
-			TranslationUnit header = new TranslationUnit(fCProject, fHeaderFile);
-			tu = new TranslationUnit(fCProject, fCFile);
+			//ITranslationUnit header = (ITranslationUnit)CoreModel.getDefault().create(fHeaderFile);
+			ITranslationUnit tu = (ITranslationUnit)CoreModel.getDefault().create(fCFile);
 			buffer = tu.getBuffer().getContents();
 			document = new Document(buffer);
 			
@@ -200,7 +201,7 @@ public abstract class CompletionProposalsBaseTest  extends TestCase{
 	/**
 	 * @return Returns the tu.
 	 */
-	public TranslationUnit getTranslationUnit() {
+	public ITranslationUnit getTranslationUnit() {
 		return tu;
 	}