diff --git a/core/org.eclipse.cdt.ui/ChangeLog b/core/org.eclipse.cdt.ui/ChangeLog
index 63695d7c7b5..de677c551e2 100644
--- a/core/org.eclipse.cdt.ui/ChangeLog
+++ b/core/org.eclipse.cdt.ui/ChangeLog
@@ -1,3 +1,17 @@
+2005-06-08 Alain Magloire
+	Move to the IContentTypeManager framework: PR 86645
+	* src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
+	* src/org/eclipse/cdt/internal/ui/editor/CEditor.java
+	+ src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java
+	* src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
+	* src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
+	* src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
+	* src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
+	* src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
+	* src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
+	* src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
+	* plugin.xml
+	
 2005-06-08 Vladimir Hirsl
 	Fix for NPE in CPElement.java
 	
diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml
index c2ded7d8bb2..916fc50db43 100644
--- a/core/org.eclipse.cdt.ui/plugin.xml
+++ b/core/org.eclipse.cdt.ui/plugin.xml
@@ -522,19 +522,23 @@
       <editor
             default="true"
             name="%CEditor.name"
-            extensions="c,C,cc,cpp,cxx,h,hh,hpp"
             icon="icons/obj16/c_file_obj.gif"
             class="org.eclipse.cdt.internal.ui.editor.CEditor"
             contributorClass="org.eclipse.cdt.internal.ui.editor.CEditorActionContributor"
             symbolicFontName="org.eclipse.cdt.ui.editors.textfont"
             id="org.eclipse.cdt.ui.editor.CEditor">
+            <contentTypeBinding contentTypeId="org.eclipse.cdt.core.cSource"/>
+            <contentTypeBinding contentTypeId="org.eclipse.cdt.core.cxxSource"/>
+            <contentTypeBinding contentTypeId="org.eclipse.cdt.core.cxxHeader"/>
+            <contentTypeBinding contentTypeId="org.eclipse.cdt.core.cHeader"/>
+            <contentTypeBinding contentTypeId="org.eclipse.cdt.core.cSource"/>
       </editor>
       <editor
             name="%AsmEditor.name"
-            extensions="s,asm,S"
             icon="icons/obj16/s_file_obj.gif"
             class="org.eclipse.cdt.internal.ui.editor.asm.AsmTextEditor"
             id="org.eclipse.cdt.ui.editor.asm.AsmEditor">
+            <contentTypeBinding contentTypeId="org.eclipse.cdt.core.asmSource"/>
       </editor>
       <editor
             symbolicFontName="org.eclipse.cdt.ui.editors.textfont"
@@ -738,7 +742,6 @@
    <extension
          point="org.eclipse.compare.structureCreators">
       <structureCreator
-            extensions="c,cc,cpp,cxx,h,hpp"
             class="org.eclipse.cdt.internal.ui.compare.CStructureCreator"
             id="org.eclipse.cdt.ui.compare.CStructureCreator">
       </structureCreator>
@@ -762,7 +765,6 @@
    <extension
          point="org.eclipse.compare.contentMergeViewers">
       <viewer
-            extensions="c,cc,cpp,cxx,h,c2,hpp"
             class="org.eclipse.cdt.internal.ui.compare.CContentViewerCreator"
             id="org.eclipse.cdt.ui.compare.CContentViewerCreator">
       </viewer>
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
index e85b743069f..729f4c4f2dc 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CFileElementWorkingCopy.java
@@ -20,7 +20,7 @@ public class CFileElementWorkingCopy extends WorkingCopy {
 	 * Creates a working copy of this element
 	 */
 	public CFileElementWorkingCopy(ITranslationUnit unit) throws CoreException {
-		super(unit.getParent(), unit.getPath(), null);
+		super(unit.getParent(), unit.getPath(), unit.getContentTypeId(), null);
 		this.unit = unit;
 	}
 
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
index 108ae3367c0..328e3cc5798 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CEditor.java
@@ -11,7 +11,6 @@ import java.util.Iterator;
 
 import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.CCorePreferenceConstants;
-import org.eclipse.cdt.core.filetype.ICFileType;
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.ICElement;
@@ -44,6 +43,7 @@ import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.content.IContentType;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IStatusLineManager;
@@ -606,8 +606,10 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
 		if (originalElement instanceof IFileEditorInput) {
 			IFile file= ((IFileEditorInput) originalElement).getFile();
 			if (file != null) {
-				ICFileType type = CCorePlugin.getDefault().getFileType(file.getProject(), file.getName());
-				oldLanguage = type.getLanguage().getId();
+				IContentType type = CCorePlugin.getContentType(file.getProject(), file.getName());
+				if (type != null) {
+					oldLanguage = type.getId();
+				}
 				if (oldLanguage == null) {
 					return false;
 				}
@@ -618,8 +620,10 @@ public class CEditor extends TextEditor implements ISelectionChangedListener, IS
 		if (movedElement instanceof IFileEditorInput) {
 			IFile file = ((IFileEditorInput) movedElement).getFile();
 			if (file != null) {
-				ICFileType type = CCorePlugin.getDefault().getFileType(file.getProject(), file.getName());
-				newLanguage = type.getLanguage().getId();
+				IContentType type = CCorePlugin.getContentType(file.getProject(), file.getName());
+				if (type != null) {
+					newLanguage = type.getId();
+				}
 				if (newLanguage == null) {
 					return false;
 				}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java
new file mode 100644
index 00000000000..81bdb0b77b0
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeAssociation.java
@@ -0,0 +1,92 @@
+/**********************************************************************
+ * Copyright (c) 2005 QNX Software System and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors: 
+ * QNX Software System - Initial implementation
+***********************************************************************/
+
+package org.eclipse.cdt.internal.ui.preferences;
+
+import org.eclipse.core.runtime.content.IContentType;
+
+public class CFileTypeAssociation {
+
+	private String fSpec;
+	private int fType;
+	private IContentType fContentType;
+
+	/**
+	 * @param spec
+	 * @param type
+	 * @param settings
+	 */
+	public CFileTypeAssociation(String spec, int type, IContentType contentType) {
+		super();
+		fSpec = spec;
+		fType = type;
+		fContentType = contentType;
+	}
+
+	/**
+	 * @return Returns the fSettings.
+	 */
+	public IContentType getContentType() {
+		return fContentType;
+	}
+
+	/**
+	 * @return Returns the fSpec.
+	 */
+	public String getSpec() {
+		return fSpec;
+	}
+
+	public String getPattern() {
+		String pattern = getSpec();
+		if (isExtSpec()) {
+			return "*." + pattern; //$NON-NLS-1$
+		}
+		return pattern;
+		
+	}
+
+	/**
+	 * @return
+	 */
+	public boolean isFileSpec() {
+		return (fType & IContentType.FILE_NAME_SPEC) != 0;
+	}
+
+	/**
+	 * @return
+	 */
+	public boolean isExtSpec() {
+		return (fType & IContentType.FILE_EXTENSION_SPEC) != 0;
+	}
+
+	/**
+	 * @return
+	 */
+	public boolean isPredefined() {
+		return (fType & IContentType.IGNORE_USER_DEFINED) != 0;
+	}
+
+	/**
+	 * @return
+	 */
+	public boolean isUserDefined() {
+		return (fType & IContentType.IGNORE_PRE_DEFINED) != 0;
+	}
+
+	/**
+	 * @return Returns the description.
+	 */
+	public String getDescription() {
+		return fContentType.getName();
+	}
+
+}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
index ac64224553d..70f3dd035ff 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypeDialog.java
@@ -10,9 +10,12 @@
 ***********************************************************************/
 package org.eclipse.cdt.internal.ui.preferences;
 
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileType;
-import org.eclipse.cdt.core.filetype.IResolverModel;
+import java.util.ArrayList;
+
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.swt.SWT;
@@ -29,7 +32,7 @@ import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 
 public class CFileTypeDialog extends Dialog {
-
+	
 	public CFileTypeDialog(Shell parentShell) {
 		super(parentShell);
 	}
@@ -38,7 +41,7 @@ public class CFileTypeDialog extends Dialog {
 	private Combo		fComboType;
 
 	private String		fPattern;
-	private ICFileType	fType;
+	private IContentType fType;
 	
 	protected void configureShell(Shell newShell) {
 		super.configureShell(newShell);
@@ -99,23 +102,30 @@ public class CFileTypeDialog extends Dialog {
 		return fPattern;
 	}
 	
-	public void setType(ICFileType type) {
-		fType = type;
-	}
-
-	public ICFileType getType() {
+	public IContentType getContentType() {
 		return fType;
 	}
 
 	private void populateTypesCombo() {
-		ICFileType[]	types = getResolverModel().getFileTypes();
-		int				index = -1;
+		IContentTypeManager manager = Platform.getContentTypeManager();
+		String[]	ids = CoreModel.getRegistedContentTypeIds();
+		ArrayList list = new ArrayList(ids.length);
+		for (int i = 0; i < ids.length; i++) {
+			IContentType ctype = manager.getContentType(ids[i]);
+			if (ctype != null) {
+				list.add(ctype);
+			}
+		}
 
-		for (int i = 0; i < types.length; i++) {
-			fComboType.add(types[i].getName());
+		IContentType[] ctypes = new IContentType[list.size()];
+		list.toArray(ctypes);
+		int	index = -1;
+
+		for (int i = 0; i < ctypes.length; i++) {
+			fComboType.add(ctypes[i].getName());
 		}
 		
-		fComboType.setData(types);
+		fComboType.setData(ctypes);
 
 		if (null != fType) {
 			index = fComboType.indexOf(fType.getName());
@@ -124,10 +134,6 @@ public class CFileTypeDialog extends Dialog {
 		fComboType.select((index < 0) ? 0 : index);
 	}
 
-	private IResolverModel getResolverModel() {
-		return CCorePlugin.getDefault().getResolverModel();
-	}
-	
 	Button getOkayButton() {
 		return getButton(IDialogConstants.OK_ID);
 	}
@@ -136,21 +142,20 @@ public class CFileTypeDialog extends Dialog {
 		return fTextPattern.getText().trim();
 	}
 	
-	private ICFileType getTypeFromControl() {
-		String	typeId	= null;
+	private IContentType getTypeFromControl() {
+		IContentType type	= null;
 		int		index	= fComboType.getSelectionIndex();
 		
 		if (-1 != index) {
 			String			name	= fComboType.getItem(index);
-			ICFileType[]	types	= (ICFileType[]) fComboType.getData();
+			IContentType[]	types	= (IContentType[]) fComboType.getData();
 			for (int i = 0; i < types.length; i++) {
 				if (name.equals(types[i].getName())) {
-					typeId = types[i].getId();
+					type = types[i];
 				}
 			}
 		}
-		
-		return getResolverModel().getFileTypeById(typeId); 
+		return type;
 	}
 	
 	protected void okPressed() {
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
index f3d092bec78..e068fb9ff93 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferenceBlock.java
@@ -12,13 +12,19 @@ package org.eclipse.cdt.internal.ui.preferences;
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileTypeAssociation;
-import org.eclipse.cdt.core.filetype.ICFileTypeResolver;
-import org.eclipse.cdt.core.filetype.IResolverModel;
+import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.internal.ui.util.PixelConverter;
 import org.eclipse.cdt.internal.ui.util.SWTUtil;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.core.runtime.content.IContentTypeSettings;
+import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.jface.util.ListenerList;
 import org.eclipse.jface.viewers.ColumnWeightData;
 import org.eclipse.jface.viewers.ILabelProvider;
@@ -53,22 +59,23 @@ public class CFileTypesPreferenceBlock {
 
 	private static final int 	COL_PATTERN		= 0;
 	private static final int 	COL_DESCRIPTION	= 1;
-	private static final int 	COL_LANGUAGE	= 2;
-	
-	private ICFileTypeResolver	fResolverWorkingCopy;
-	private ArrayList			fAddAssoc;
-	private ArrayList			fRemoveAssoc;
-	private boolean				fDirty = false;
+	private static final int 	COL_STATUS	= 2;
 	
+	private ArrayList	fAddAssoc;
+	private ArrayList	fRemoveAssoc;
+	private boolean		fDirty = false;
+	private IProject	fInput;
+	private IContentType[] fContentTypes;
+
 	private TableViewer 		fAssocViewer;
 	private Button				fBtnNew;
 	private Button				fBtnRemove;
-	
+
 	private class AssocSorter extends ViewerSorter {
 		public int category(Object element) {
-			if (element instanceof ICFileTypeAssociation) {
-				ICFileTypeAssociation assoc = (ICFileTypeAssociation) element;
-				if (-1 != assoc.getPattern().indexOf('*')) {
+			if (element instanceof CFileTypeAssociation) {
+				CFileTypeAssociation assoc = (CFileTypeAssociation) element;
+				if (assoc.isExtSpec()) {
 					return 10;
 				}
 				return 20;
@@ -78,7 +85,7 @@ public class CFileTypesPreferenceBlock {
 	}
 	
 	private class AssocContentProvider implements IStructuredContentProvider {
-		ICFileTypeAssociation[] assocs;
+		CFileTypeAssociation[] assocs;
 		
 		public Object[] getElements(Object inputElement) {
 			return assocs;
@@ -89,8 +96,8 @@ public class CFileTypesPreferenceBlock {
 		}
 
 		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput instanceof ICFileTypeAssociation[]) {	
-				assocs = (ICFileTypeAssociation[]) newInput;
+			if (newInput instanceof CFileTypeAssociation[]) {	
+				assocs = (CFileTypeAssociation[]) newInput;
 			}
 		}
 	}
@@ -99,9 +106,8 @@ public class CFileTypesPreferenceBlock {
 		private ListenerList listeners = new ListenerList();
 		
 		public Image getColumnImage(Object element, int columnIndex) {
-			if (element instanceof ICFileTypeAssociation) {
+			if (element instanceof CFileTypeAssociation) {
 				if (COL_PATTERN == columnIndex) {
-					// TODO: add image support to table
 					return null;
 				}
 			}
@@ -109,17 +115,22 @@ public class CFileTypesPreferenceBlock {
 		}
 
 		public String getColumnText(Object element, int columnIndex) {
-			if (element instanceof ICFileTypeAssociation) {
-				ICFileTypeAssociation assoc = (ICFileTypeAssociation) element;
+			if (element instanceof CFileTypeAssociation) {
+				CFileTypeAssociation assoc = (CFileTypeAssociation) element;
 				switch (columnIndex) {
 					case COL_PATTERN:
 						return assoc.getPattern();
 					
 					case COL_DESCRIPTION:
-						return assoc.getType().getName();
+						return assoc.getDescription();
 						
-					case COL_LANGUAGE:
-						return assoc.getType().getLanguage().getName();
+					case COL_STATUS:
+						if (assoc.isUserDefined()) {
+							return PreferencesMessages.getString("CFileTypesPreferencePage.userDefined"); //$NON-NLS-1$
+						} else if (assoc.isPredefined()) {
+							return PreferencesMessages.getString("CFileTypesPreferencePage.preDefined"); //$NON-NLS-1$
+						}
+						return new String();
 				}
 			}
 			return element.toString();
@@ -151,11 +162,15 @@ public class CFileTypesPreferenceBlock {
 		}
 
 	}
-	
-	public CFileTypesPreferenceBlock(ICFileTypeResolver input) {
+
+	public CFileTypesPreferenceBlock() {
+		this(null);
+	}
+
+	public CFileTypesPreferenceBlock(IProject input) {
 		fAddAssoc = new ArrayList();
 		fRemoveAssoc = new ArrayList();
-		setResolver(input);
+		fInput = input;
 		setDirty(false);
 	}
 
@@ -208,7 +223,7 @@ public class CFileTypesPreferenceBlock {
 		col.setText(PreferencesMessages.getString("CFileTypesPreferencePage.colTitleDescription")); //$NON-NLS-1$
 		
 		col = new TableColumn(table, SWT.LEFT);
-		col.setText(PreferencesMessages.getString("CFileTypesPreferencePage.colTitleLanguage")); //$NON-NLS-1$
+		col.setText(PreferencesMessages.getString("CFileTypesPreferencePage.colTitleStatus")); //$NON-NLS-1$
 
 		// Create the button pane
 
@@ -260,7 +275,7 @@ public class CFileTypesPreferenceBlock {
 		fAssocViewer.setSorter(new AssocSorter());
 		fAssocViewer.setContentProvider(new AssocContentProvider());
 		fAssocViewer.setLabelProvider(new AssocLabelProvider());
-		fAssocViewer.setInput(getResolverWorkingCopy().getFileTypeAssociations());
+		fAssocViewer.setInput(getCFileTypeAssociations());
 
 		fAssocViewer.addSelectionChangedListener(new ISelectionChangedListener() {
 			public void selectionChanged(SelectionChangedEvent event) {
@@ -280,25 +295,32 @@ public class CFileTypesPreferenceBlock {
 		setDirty(enabled);
 	}
 	
-	public void setResolver(ICFileTypeResolver resolver) {
+	public void setInput(IProject input) {
 		fAddAssoc.clear();
 		fRemoveAssoc.clear();
-		fResolverWorkingCopy = resolver.createWorkingCopy();
+		fInput = input;
 		if (null != fAssocViewer) {
-			fAssocViewer.setInput(fResolverWorkingCopy.getFileTypeAssociations());
+			fAssocViewer.setInput(getCFileTypeAssociations());
 		}
 		setDirty(true);
 	}
 
-	public ICFileTypeResolver getResolverWorkingCopy() {
-		return fResolverWorkingCopy;
+	public void setInputWithCopy(IProject input) {
+		fAddAssoc.clear();
+		fRemoveAssoc.clear();
+		fInput = null;
+		if (null != fAssocViewer) {
+			fAssocViewer.setInput(getCFileTypeAssociations());
+		}
+		fInput = input;
+		setDirty(true);
 	}
-	
-	public void setDirty(boolean dirty) {
+
+	private void setDirty(boolean dirty) {
 		fDirty = dirty;
 	}
 	
-	public boolean isDirty() {
+	private boolean isDirty() {
 		return fDirty;
 	}
 
@@ -306,36 +328,165 @@ public class CFileTypesPreferenceBlock {
 		boolean changed = fDirty;
 		
 		if (fDirty) {
-			ICFileTypeAssociation[] add = (ICFileTypeAssociation[]) fAddAssoc.toArray(new ICFileTypeAssociation[fAddAssoc.size()]);
-			ICFileTypeAssociation[] rem = (ICFileTypeAssociation[]) fRemoveAssoc.toArray(new ICFileTypeAssociation[fRemoveAssoc.size()]);
+			CFileTypeAssociation[] add = (CFileTypeAssociation[]) fAddAssoc.toArray(new CFileTypeAssociation[fAddAssoc.size()]);
+			CFileTypeAssociation[] rem = (CFileTypeAssociation[]) fRemoveAssoc.toArray(new CFileTypeAssociation[fRemoveAssoc.size()]);
 			
-			fResolverWorkingCopy.adjustAssociations(add, rem);
+			adjustAssociations(add, rem);
 	
 			fAddAssoc.clear();
 			fRemoveAssoc.clear();
 
 			setDirty(false);
-		}
-		
+		}		
 		return changed;
 	}
 	
-	protected void handleSelectionChanged() {
-		IStructuredSelection sel = getSelection();
-		fBtnRemove.setEnabled(!sel.isEmpty());
+	private CFileTypeAssociation[] getCFileTypeAssociations() {
+		ArrayList list = new ArrayList();
+		if (fInput == null) {
+			fillWithUserDefinedCFileTypeAssociations(list);
+			fillWithPredefinedCFileTypeAssociations(list);
+		} else {
+			fillWithProjectCFileTypeAssociations(list, fInput);
+		}
+		CFileTypeAssociation[] assocs = new CFileTypeAssociation[list.size()];
+		list.toArray(assocs);
+		return assocs;
 	}
 
-	private IResolverModel getResolverModel() {
-		return CCorePlugin.getDefault().getResolverModel();
+	private void adjustAssociations(CFileTypeAssociation[] add, CFileTypeAssociation[] rem) {
+		IScopeContext context = null;
+		if (fInput != null) {
+			context = new ProjectScope(fInput);
+		}
+		addAssociations(add, context);
+		removeAssociations(rem, context);
 	}
-	
+
+	private void addAssociations(CFileTypeAssociation[] add, IScopeContext context) {
+		for (int i = 0; i < add.length; ++i) {
+			CFileTypeAssociation assoc = add[i];
+			String spec = assoc.getSpec();
+			IContentType contentType = assoc.getContentType();
+			int type = IContentType.FILE_NAME_SPEC;
+			if (assoc.isExtSpec()) {
+				type = IContentType.FILE_EXTENSION_SPEC;
+			}			
+			addAssociation(context, contentType, spec, type);
+		}
+	}
+
+	protected void addAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+		try {
+			IContentTypeSettings settings = contentType.getSettings(context);
+			settings.addFileSpec(spec, type);
+		} catch (CoreException e) {
+			// ignore ??
+		}
+	}
+
+	private void removeAssociations(CFileTypeAssociation[] rem, IScopeContext context) {
+		for (int i = 0; i < rem.length; ++i) {
+			CFileTypeAssociation assoc = rem[i];
+			IContentType contentType = assoc.getContentType();
+			String spec = assoc.getSpec();
+			int type = IContentType.FILE_NAME_SPEC;
+			if (assoc.isExtSpec()) {
+				type = IContentType.FILE_EXTENSION_SPEC;
+			}
+			removeAssociation(context, contentType, spec, type);
+		}
+	}
+
+	protected void removeAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+		try {
+			IContentTypeSettings settings = contentType.getSettings(context);
+			settings.removeFileSpec(spec, type);
+		} catch (CoreException e) {
+			// ignore ??
+		}
+	}
+
+	private IContentType[] getRegistedContentTypes() {
+		if (fContentTypes == null) {
+			String [] ids = CoreModel.getRegistedContentTypeIds();
+			IContentTypeManager manager = Platform.getContentTypeManager();
+			IContentType [] ctypes = new IContentType[ids.length];
+			for (int i = 0; i < ids.length; i++) {
+				ctypes[i] = manager.getContentType(ids[i]);
+			}
+			fContentTypes = ctypes;
+		}
+		return fContentTypes;
+	}
+
+	private void fillWithUserDefinedCFileTypeAssociations(ArrayList list) {
+		IContentType[] ctypes = getRegistedContentTypes();
+		fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_EXTENSION_SPEC, list);
+		fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_NAME_SPEC, list);
+	}
+
+	private void fillWithPredefinedCFileTypeAssociations(ArrayList list) {
+		IContentType[] ctypes = getRegistedContentTypes();
+		fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_USER_DEFINED | IContentType.FILE_EXTENSION_SPEC, list);
+		fillWithCFileTypeAssociations(ctypes, null, IContentType.IGNORE_USER_DEFINED | IContentType.FILE_NAME_SPEC, list);
+	}
+
+	private void fillWithProjectCFileTypeAssociations(ArrayList list, IProject project) {
+		IContentType[] ctypes = getRegistedContentTypes();
+		IScopeContext context = new ProjectScope(project);
+		fillWithCFileTypeAssociations(ctypes, context, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_EXTENSION_SPEC, list);
+		fillWithCFileTypeAssociations(ctypes, context, IContentType.IGNORE_PRE_DEFINED | IContentType.FILE_NAME_SPEC, list);
+	}
+
+	private void fillWithCFileTypeAssociations(IContentType[] ctypes, IScopeContext context, int type, ArrayList list) {
+		for (int i = 0; i < ctypes.length; i++) {
+			try {
+				IContentType ctype = ctypes[i];
+				IContentTypeSettings setting = ctype.getSettings(context);
+				String[] specs = setting.getFileSpecs(type);
+				for (int j = 0; j < specs.length; j++) {
+					CFileTypeAssociation assoc = new CFileTypeAssociation(specs[j], type, ctype);
+					list.add(assoc);
+				}
+			} catch (CoreException e) {
+				// skip over it.
+			}
+		}
+	}
+
+	private CFileTypeAssociation createAssociation(String pattern, IContentType contentType) {
+		int type = IContentType.FILE_NAME_SPEC;
+		if (pattern.startsWith("*.")) { //$NON-NLS-1$
+			pattern = pattern.substring(2);
+			type = IContentType.FILE_EXTENSION_SPEC;
+		}
+		return new CFileTypeAssociation(pattern, type, contentType);
+	}
+
+	protected void handleSelectionChanged() {
+		IStructuredSelection sel = getSelection();
+		if (sel.isEmpty()) {
+			fBtnRemove.setEnabled(false);
+		} else {
+			boolean enabled = true;
+			List elements = sel.toList();
+			for (Iterator i = elements.iterator(); i.hasNext();) {
+				CFileTypeAssociation assoc = (CFileTypeAssociation) i.next();
+				if (assoc.isPredefined())
+					enabled = false;
+			}
+			fBtnRemove.setEnabled(enabled);
+		}
+	}
+
 	protected void handleAdd() {
-		ICFileTypeAssociation assoc = null;
+		CFileTypeAssociation assoc = null;
 
 		CFileTypeDialog dlg = new CFileTypeDialog(fBtnNew.getParent().getShell());
 		
 		if (Window.OK == dlg.open()) {
-			assoc = getResolverModel().createAssocation(dlg.getPattern(), dlg.getType());
+			assoc = createAssociation(dlg.getPattern(), dlg.getContentType());
 			if (null != assoc) {
 				fAssocViewer.add(assoc);
 				fAddAssoc.add(assoc);
@@ -349,7 +500,7 @@ public class CFileTypesPreferenceBlock {
 		IStructuredSelection sel = getSelection();
 		if ((null != sel) && (!sel.isEmpty())) {
 			for (Iterator iter = sel.iterator(); iter.hasNext();) {
-				ICFileTypeAssociation assoc = (ICFileTypeAssociation) iter.next();
+				CFileTypeAssociation assoc = (CFileTypeAssociation) iter.next();
 				fAssocViewer.remove(assoc);
 				fAddAssoc.remove(assoc);
 				fRemoveAssoc.add(assoc);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
index c76b300e9e0..4d8e8f4e291 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPreferencePage.java
@@ -16,10 +16,6 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileTypeAssociation;
-import org.eclipse.cdt.core.filetype.ICFileTypeResolver;
-import org.eclipse.cdt.core.filetype.IResolverModel;
-import org.eclipse.cdt.core.internal.filetype.WorkspaceResolver;
 import org.eclipse.cdt.internal.ui.ICHelpContextIds;
 import org.eclipse.cdt.ui.CUIPlugin;
 import org.eclipse.core.runtime.Preferences;
@@ -40,11 +36,11 @@ import org.eclipse.ui.PlatformUI;
 public class CFileTypesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
 
 	private CFileTypesPreferenceBlock fPrefsBlock;
-	private ICFileTypeResolver fResolver;
 
 	public CFileTypesPreferencePage() {
 		setDescription(PreferencesMessages.getString("CFileTypesPreferencePage.description")); //$NON-NLS-1$
-		setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
+		//setPreferenceStore(CUIPlugin.getDefault().getPreferenceStore());
+		noDefaultAndApplyButton();
 	}
 
 	/* (non-Javadoc)
@@ -56,8 +52,9 @@ public class CFileTypesPreferencePage extends PreferencePage implements IWorkben
 		topPane.setLayout(new GridLayout());
 		topPane.setLayoutData(new GridData(GridData.FILL_BOTH));
 
-		fResolver = getResolverModel().getResolver(); 
-		fPrefsBlock = new CFileTypesPreferenceBlock(fResolver);
+		//fResolver = getResolverModel().getResolver(); 
+//		fPrefsBlock = new CFileTypesPreferenceBlock(fResolver);
+		fPrefsBlock = new CFileTypesPreferenceBlock(null);
 
 		PlatformUI.getWorkbench().getHelpSystem().setHelp( topPane, ICHelpContextIds.FILE_TYPES_PREF_PAGE );
 		return fPrefsBlock.createControl(topPane);
@@ -73,11 +70,10 @@ public class CFileTypesPreferencePage extends PreferencePage implements IWorkben
 	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
 	 */
 	protected void performDefaults() {
-		Preferences prefs = CCorePlugin.getDefault().getPluginPreferences();
-		prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_EXCLUSION);
-		prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_INCLUSION);
-		fPrefsBlock.setResolver(getResolverModel().getResolver());
-
+//		Preferences prefs = CCorePlugin.getDefault().getPluginPreferences();
+//		prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_EXCLUSION);
+//		prefs.setToDefault(WorkspaceResolver.PREFS_ASSOCIATIONS_INCLUSION);
+//		fPrefsBlock.setResolver(getResolverModel().getResolver());
 		super.performDefaults();
 	}
 
@@ -87,36 +83,36 @@ public class CFileTypesPreferencePage extends PreferencePage implements IWorkben
 	public boolean performOk() {
 		
 		if (fPrefsBlock.performOk()) {
-			ICFileTypeAssociation[] oldAssocs = fResolver.getFileTypeAssociations();
-
-			ICFileTypeResolver workingCopy = fPrefsBlock.getResolverWorkingCopy();
-			ICFileTypeAssociation[] newAssocs = workingCopy.getFileTypeAssociations();
-
-			// compare
-			List delList = new ArrayList();
-			List addList = new ArrayList();
-
-			for (int i = 0; i < oldAssocs.length; i++) {
-				if (Arrays.binarySearch(newAssocs, oldAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
-					delList.add(oldAssocs[i]);
-				}
-			}
-			
-			for (int i = 0; i < newAssocs.length; i++) {
-				if (Arrays.binarySearch(oldAssocs, newAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
-					addList.add(newAssocs[i]);
-				}
-			}
-
-			ICFileTypeAssociation[] addAssocs = (ICFileTypeAssociation[]) addList.toArray(new ICFileTypeAssociation[addList.size()]);
-			ICFileTypeAssociation[] delAssocs = (ICFileTypeAssociation[]) delList.toArray(new ICFileTypeAssociation[delList.size()]);
-			fResolver.adjustAssociations(addAssocs, delAssocs);
+//			ICFileTypeAssociation[] oldAssocs = fResolver.getFileTypeAssociations();
+//
+//			ICFileTypeResolver workingCopy = fPrefsBlock.getResolverWorkingCopy();
+//			ICFileTypeAssociation[] newAssocs = workingCopy.getFileTypeAssociations();
+//
+//			// compare
+//			List delList = new ArrayList();
+//			List addList = new ArrayList();
+//
+//			for (int i = 0; i < oldAssocs.length; i++) {
+//				if (Arrays.binarySearch(newAssocs, oldAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
+//					delList.add(oldAssocs[i]);
+//				}
+//			}
+//			
+//			for (int i = 0; i < newAssocs.length; i++) {
+//				if (Arrays.binarySearch(oldAssocs, newAssocs[i], ICFileTypeAssociation.Comparator) < 0) {
+//					addList.add(newAssocs[i]);
+//				}
+//			}
+//
+//			ICFileTypeAssociation[] addAssocs = (ICFileTypeAssociation[]) addList.toArray(new ICFileTypeAssociation[addList.size()]);
+//			ICFileTypeAssociation[] delAssocs = (ICFileTypeAssociation[]) delList.toArray(new ICFileTypeAssociation[delList.size()]);
+//			fResolver.adjustAssociations(addAssocs, delAssocs);
 		}
 		
 		return super.performOk();
 	}
 
-	private IResolverModel getResolverModel() {
-		return CCorePlugin.getDefault().getResolverModel();
-	}
+//	private IResolverModel getResolverModel() {
+//		return CCorePlugin.getDefault().getResolverModel();
+//	}
 }
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
index 6a33e1befdd..e6c0f950dc4 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/CFileTypesPropertyPage.java
@@ -11,11 +11,22 @@
 package org.eclipse.cdt.internal.ui.preferences;
 
 
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileTypeResolver;
-import org.eclipse.cdt.core.filetype.IResolverModel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.cdt.internal.core.model.CModelManager;
 import org.eclipse.cdt.internal.ui.ICHelpContextIds;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+import org.eclipse.core.runtime.content.IContentTypeSettings;
+import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -26,20 +37,128 @@ import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.PropertyPage;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
 
 /*
  * The preference page used for displaying/editing CDT file
  * type associations for a project
  */
 public class CFileTypesPropertyPage extends PropertyPage {
+
+	/**
+	 * FIXME: This class should be remove when PR #99060
+	 * Since ContentTypeSettings.removeFileSpec() is buggy.
+	 */
+	class FixCFileTypesPreferenceBlock extends CFileTypesPreferenceBlock {
+
+		public FixCFileTypesPreferenceBlock() {
+			super();
+		}
+
+		public FixCFileTypesPreferenceBlock(IProject input) {
+			super(input);
+		}
+
+		String toListString(Object[] list, String separator) {
+			if (list == null || list.length == 0) {
+				return null;
+			}
+
+			StringBuffer result = new StringBuffer();
+			for (int i = 0; i < list.length; i++) {
+				if (i != 0) {
+					result.append(separator);
+				}
+				result.append(list[i]);
+			}
+			// ignore last comma
+			return result.toString();
+		}
+
+		List parseItemsIntoList(String string, String separator) {
+			ArrayList list = new ArrayList();
+			if (string != null) {
+				String[] items = string.split(separator);
+				list.addAll(Arrays.asList(items));
+			}
+			return list;
+		}
+
+		String getPreferenceKey(int type) {
+			if ((type & IContentType.FILE_EXTENSION_SPEC) != 0)
+				return PREF_FILE_EXTENSIONS;
+			if ((type & IContentType.FILE_NAME_SPEC) != 0)
+				return PREF_FILE_NAMES;
+			throw new IllegalArgumentException("Unknown type: "); //$NON-NLS-1$
+		}
+
+		private IContentTypeManager.ContentTypeChangeEvent newContentTypeChangeEvent(IContentType source, IScopeContext context) {
+			return new IContentTypeManager.ContentTypeChangeEvent(source, context);
+		}
 	
-	private Button fUseWorkspace;
-	private Button fUseProject;
-	protected ICFileTypeResolver fResolver;
+		/* (non-Javadoc)
+		 * @see org.eclipse.cdt.internal.ui.preferences.CFileTypesPreferenceBlock#addAssociation(org.eclipse.core.runtime.preferences.IScopeContext, org.eclipse.core.runtime.content.IContentType, java.lang.String, int)
+		 */
+		protected void addAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+			super.addAssociation(context, contentType, spec, type);
+			// We do not call flush here it will be call in the perform OK.
+			//contentTypeNode.flush();
+			CModelManager.getDefault().contentTypeChanged(newContentTypeChangeEvent(contentType, context));
+		}
+
+		/* (non-Javadoc)
+		 * @see org.eclipse.cdt.internal.ui.preferences.CFileTypesPreferenceBlock#removeAssociation(org.eclipse.core.runtime.preferences.IScopeContext, org.eclipse.core.runtime.content.IContentType, java.lang.String, int)
+		 */
+		protected void removeAssociation(IScopeContext context, IContentType contentType, String spec, int type) {
+			String contentTypeId = contentType.getId();
+			
+			Preferences contentTypeNode = context.getNode(FULLPATH_CONTENT_TYPE_PREF_NODE).node(contentTypeId);
+			String key = getPreferenceKey(type);
+			String existing = contentTypeNode.get(key, null);
+			if (existing == null)
+				// content type has no settings - nothing to do
+				return;
+			List existingValues = parseItemsIntoList(contentTypeNode.get(key, null), PREF_SEPARATOR); //$NON-NLS-1$
+			int index = -1;
+			for (int j = 0; j < existingValues.size(); j++)
+				if (((String) existingValues.get(j)).equalsIgnoreCase(spec))
+					index = j;
+			if (index == -1)
+				// did not find the file spec to be removed - nothing to do
+				return;
+			existingValues.remove(index);
+			// set new preference value
+			String newValue = toListString(existingValues.toArray(), PREF_SEPARATOR);
+			if (newValue == null) {
+				contentTypeNode.remove(key);
+			} else {
+				contentTypeNode.put(key, newValue);
+			}
+			// We do not call flush here it will be call in the perform OK.
+			//contentTypeNode.flush();
+			CModelManager.getDefault().contentTypeChanged(newContentTypeChangeEvent(contentType, context));
+		}
+		
+	}
+
+	private static final String CONTENT_TYPE_PREF_NODE = "content-types"; //$NON-NLS-1$
+	private static final String FULLPATH_CONTENT_TYPE_PREF_NODE = Platform.PI_RUNTIME + IPath.SEPARATOR + CONTENT_TYPE_PREF_NODE;
+	private static final String PREF_LOCAL_CONTENT_TYPE_SETTINGS = "enabled"; //$NON-NLS-1$
+	private final static String PREF_FILE_EXTENSIONS = "file-extensions"; //$NON-NLS-1$
+	private final static String PREF_FILE_NAMES = "file-names"; //$NON-NLS-1$
+	private final static String PREF_SEPARATOR = ","; //$NON-NLS-1$
+	private static final Preferences PROJECT_SCOPE = Platform.getPreferencesService().getRootNode().node(ProjectScope.SCOPE);
+	//private static final InstanceScope INSTANCE_SCOPE = new InstanceScope();
+
+
+	protected Button fUseWorkspace;
+	protected Button fUseProject;
 	protected CFileTypesPreferenceBlock fPrefsBlock;
 	
 	public CFileTypesPropertyPage(){
 		super();
+		noDefaultAndApplyButton();
 	}
 	
 	/* (non-Javadoc)
@@ -62,33 +181,41 @@ public class CFileTypesPropertyPage extends PropertyPage {
 		fUseWorkspace.setText(PreferencesMessages.getString("CFileTypesPropertyPage.useWorkspaceSettings")); //$NON-NLS-1$
 		fUseWorkspace.addListener(SWT.Selection, new Listener() {
 			public void handleEvent(Event e) {
-				fPrefsBlock.setResolver(getResolverModel().getResolver());
-				fPrefsBlock.setEnabled(false);
+				if (fUseWorkspace.getSelection()) {
+					fPrefsBlock.setInput(null);
+					fPrefsBlock.setEnabled(false);
+				}
 			}
 		});
 		
+		final IProject project = getProject(); 
+		boolean custom = isProjectSpecificContentType(project.getName());
+
 		fUseProject = new Button(radioPane, SWT.RADIO);
 		fUseProject.setText(PreferencesMessages.getString("CFileTypesPropertyPage.useProjectSettings")); //$NON-NLS-1$
 		fUseProject.addListener(SWT.Selection, new Listener() {
 			public void handleEvent(Event e) {
-				fPrefsBlock.setResolver(fResolver);
-				fPrefsBlock.setEnabled(true);
+				if (fUseProject.getSelection()) {
+					if (isProjectSpecificContentType(project.getName())) {
+						fPrefsBlock.setInput(project);
+					} else {
+						fPrefsBlock.setInputWithCopy(project);
+					}
+					fPrefsBlock.setEnabled(true);
+				}
 			}
 		});
 		
-		// Resolver block
-
-		IProject			project		= getProject(); 
-		IResolverModel		model		= getResolverModel();
-		fResolver	= model.getResolver(project); 
-		boolean				custom		= model.hasCustomResolver(project);
-		
 		Composite blockPane = new Composite(topPane, SWT.NONE);
 
 		blockPane.setLayout(new GridLayout());
 		blockPane.setLayoutData(new GridData(GridData.FILL_BOTH));
 
-		fPrefsBlock = new CFileTypesPreferenceBlock(fResolver);
+		if (custom) {
+			fPrefsBlock = new FixCFileTypesPreferenceBlock(project);
+		} else {
+			fPrefsBlock = new FixCFileTypesPreferenceBlock();
+		}
 
 		fPrefsBlock.createControl(blockPane);
 		
@@ -106,7 +233,7 @@ public class CFileTypesPropertyPage extends PropertyPage {
 	protected void performDefaults() {
 		fUseWorkspace.setSelection(true);
 		fUseProject.setSelection(false);
-		fPrefsBlock.setResolver(getResolverModel().getResolver());
+		fPrefsBlock.setInput(null);
 		fPrefsBlock.setEnabled(false);
 		super.performDefaults();
 	}
@@ -118,16 +245,34 @@ public class CFileTypesPropertyPage extends PropertyPage {
 		
 		if (fUseProject.getSelection()) {
 			IProject project = getProject();
-			IResolverModel model = getResolverModel();
-			ICFileTypeResolver workingCopy = fPrefsBlock.getResolverWorkingCopy();
-			if (fPrefsBlock.performOk()) {
-				model.createCustomResolver(project, workingCopy);
+			ProjectScope projectScope = new ProjectScope(project);
+			Preferences contentTypePrefs = projectScope.getNode(FULLPATH_CONTENT_TYPE_PREF_NODE);
+			if (! isProjectSpecificContentType(project.getName())) {
+				// enable project-specific settings for this project
+				contentTypePrefs.putBoolean(PREF_LOCAL_CONTENT_TYPE_SETTINGS, true);
+
+				// Copy the InstanceScope information to the projectScope
+				copyInstanceToProjectScope(project);
+			}
+			fPrefsBlock.performOk();
+			try {
+				contentTypePrefs.flush();
+			} catch (BackingStoreException e) {
+				// ignore ??
 			}
 		} else if (fUseWorkspace.getSelection()) {
 			IProject project = getProject();
-			IResolverModel model = getResolverModel();
-			if (model.hasCustomResolver(project)) {
-				model.removeCustomResolver(project);
+			if (isProjectSpecificContentType(project.getName())) {
+//				ProjectScope projectScope = new ProjectScope(project);
+//				Preferences contentTypePrefs = projectScope.getNode(FULLPATN_CONTENT_TYPE_PREF_NODE);
+//				// enable project-specific settings for this project
+//				contentTypePrefs.putBoolean(PREF_LOCAL_CONTENT_TYPE_SETTINGS, false);
+//				try {
+//				contentTypePrefs.flush();
+//			} catch (BackingStoreException e) {
+//				// ignore ??
+//			}
+				clearSpecs(project);
 			}
 		}
 		return super.performOk();
@@ -137,15 +282,124 @@ public class CFileTypesPropertyPage extends PropertyPage {
 		Object		element	= getElement();
 		IProject 	project	= null;
 		
-		if ((null != element) && (element instanceof IProject)) {
+		if (element instanceof IProject) {
 			project = (IProject) element;
+		} else if (element instanceof IAdaptable) {
+			project= (IProject) ((IAdaptable)element).getAdapter(IProject.class);
 		}
-		
 		return project;
 	}
 
-	protected IResolverModel getResolverModel() {
-		return CCorePlugin.getDefault().getResolverModel();
+	protected static boolean isProjectSpecificContentType(String projectName) {
+		try {
+			// be careful looking up for our node so not to create any nodes as side effect
+			Preferences node = PROJECT_SCOPE;
+			//TODO once bug 90500 is fixed, should be simpler
+			// for now, take the long way
+			if (!node.nodeExists(projectName))
+				return false;
+			node = node.node(projectName);
+			if (!node.nodeExists(Platform.PI_RUNTIME))
+				return false;
+			node = node.node(Platform.PI_RUNTIME);
+			if (!node.nodeExists(CONTENT_TYPE_PREF_NODE))
+				return false;
+			node = node.node(CONTENT_TYPE_PREF_NODE);
+			return node.getBoolean(PREF_LOCAL_CONTENT_TYPE_SETTINGS, false);
+		} catch (BackingStoreException e) {
+			// exception treated when retrieving the project preferences
+		}
+		return false;
 	}
-	
+
+	void clearSpecs(IProject project) {
+		IScopeContext projectScope = new ProjectScope(project);
+
+		// Calculate the events to tell the clients of changes
+		IContentTypeManager manager = Platform.getContentTypeManager();
+		IContentType[] ctypes = manager.getAllContentTypes();
+		ArrayList list = new ArrayList(ctypes.length);
+		for (int i = 0; i < ctypes.length; i++) {
+			IContentType ctype = ctypes[i];
+			try {
+				IContentTypeSettings projectSettings = ctype.getSettings(projectScope);
+				String[] globalSpecs = ctypes[i].getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
+				String[] projectSpecs = projectSettings.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
+				if (isSpecsChanged(globalSpecs, projectSpecs)) {
+					list.add(ctype);
+				} else {
+					globalSpecs = ctypes[i].getFileSpecs(IContentType.FILE_NAME_SPEC);
+					projectSpecs = projectSettings.getFileSpecs(IContentType.FILE_NAME_SPEC);
+					if (isSpecsChanged(globalSpecs, projectSpecs)) {
+						list.add(ctype);
+					}
+				}
+			} catch (CoreException e) {
+				// ignore ?
+			}
+		}
+
+		// Delete the "content-type" node.
+		Preferences contentTypePrefs = projectScope.getNode(FULLPATH_CONTENT_TYPE_PREF_NODE);
+		try {
+			Preferences parent = contentTypePrefs.parent();
+			contentTypePrefs.removeNode();
+			parent.flush();
+		} catch (BackingStoreException e) {
+			// ignore ??
+		} catch (IllegalStateException e) {
+			e.printStackTrace();
+		}
+
+		// fire the events
+		for (int i = 0; i < list.size(); ++i) {
+			IContentType source = (IContentType)list.get(i);
+			IContentTypeManager.ContentTypeChangeEvent event =  new IContentTypeManager.ContentTypeChangeEvent(source, projectScope);
+			CModelManager.getDefault().contentTypeChanged(event);
+		}
+	}
+
+	boolean isSpecsChanged(String[] newSpecs, String[] oldSpecs) {
+		if (newSpecs.length != oldSpecs.length) {
+			return true;
+		}
+		for (int i = 0; i < newSpecs.length; ++i) {
+			String newSpec = newSpecs[i];
+			boolean found = false;
+			for (int j = 0; j < oldSpecs.length; ++j) {
+				String oldSpec = oldSpecs[j];
+				if (newSpec.equalsIgnoreCase(oldSpec)) {
+					found = true;
+					break;
+				}
+			}
+			if (!found) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	void copyInstanceToProjectScope(IProject project) {
+		IScopeContext projectScope = new ProjectScope(project);
+		IContentTypeManager manager = Platform.getContentTypeManager();
+		IContentType[] globalTypes = manager.getAllContentTypes();
+		for (int i = 0; i < globalTypes.length; i++) {
+			IContentType globalType = globalTypes[i];
+			try {
+				IContentTypeSettings settings = globalType.getSettings(projectScope);
+				String[] specs = globalType.getFileSpecs(IContentType.FILE_EXTENSION_SPEC);
+				for (int j = 0; j < specs.length; j++) {
+					settings.addFileSpec(specs[j], IContentType.FILE_EXTENSION_SPEC);
+				}
+				specs = globalType.getFileSpecs(IContentType.FILE_NAME_SPEC);
+				for (int j = 0; j < specs.length; j++) {
+					settings.addFileSpec(specs[j], IContentType.FILE_NAME_SPEC);
+				}				
+			} catch (CoreException e) {
+				// ignore ?
+			}
+		}
+	}
+
 }
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
index 2430dd9bb72..6f14f7ec877 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/PreferencesMessages.properties
@@ -143,7 +143,9 @@ CFileTypesPreferenceBlock.New...=New...
 CFileTypesPreferenceBlock.Remove=Remove
 CFileTypesPreferencePage.colTitlePattern=Filename
 CFileTypesPreferencePage.colTitleDescription=Description
-CFileTypesPreferencePage.colTitleLanguage=Language
+CFileTypesPreferencePage.colTitleStatus=Status
+CFileTypesPreferencePage.userDefined=User Defined
+CFileTypesPreferencePage.preDefined=Locked
 
 CFileTypesPropertyPage.useWorkspaceSettings=Use workspace settings
 CFileTypesPropertyPage.useProjectSettings=Use project settings
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
index 26ea961237e..2e28edbe05e 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CFormattingStrategy.java
@@ -18,8 +18,6 @@ import java.util.LinkedList;
 import java.util.Map;
 
 import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.filetype.ICFileType;
-import org.eclipse.cdt.core.filetype.ICFileTypeConstants;
 import org.eclipse.cdt.core.formatter.CodeFormatter;
 import org.eclipse.cdt.core.formatter.CodeFormatterConstants;
 import org.eclipse.cdt.core.model.CoreModel;
@@ -134,16 +132,14 @@ public class CFormattingStrategy extends ContextBasedFormattingStrategy {
 		if(null != activeFile) {
 			IProject currentProject = activeFile.getProject();
 			Assert.isNotNull(currentProject);
+			String filename = activeFile.getFullPath().lastSegment();
 			// pick the language
-			if (CoreModel.hasCCNature(currentProject)) {
+			if (CoreModel.isValidCXXHeaderUnitName(currentProject, filename) 
+					|| CoreModel.isValidCXXSourceUnitName(currentProject, filename)) {
 				language = ParserLanguage.CPP;
 			} else {
 				// for C project try to guess.
-				ICFileType type = CCorePlugin.getDefault().getFileType(currentProject, 
-						activeFile.getFullPath().lastSegment());
-				String lid = type.getLanguage().getId();
-				if(lid != null && lid.equals(ICFileTypeConstants.LANG_C))
-					language = ParserLanguage.C;
+				language = ParserLanguage.C;
 			}
 	        preferences= new HashMap(CoreModel.getDefault().create(
 	                activeFile.getProject()).getOptions(true));
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
index 1513934f591..9c3184fe6e0 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/SearchCompletionContributor.java
@@ -15,8 +15,6 @@ import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
 import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
 import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.filetype.ICFileType;
-import org.eclipse.cdt.core.filetype.ICFileTypeConstants;
 import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.IWorkingCopy;
 import org.eclipse.cdt.core.search.BasicSearchMatch;
@@ -37,11 +35,10 @@ public class SearchCompletionContributor implements ICompletionContributor {
 			IWorkingCopy workingCopy, ASTCompletionNode completionNode,
 			List proposals)
 	{
-		ICFileType fileType = CCorePlugin.getDefault().getFileType(workingCopy.getCProject().getProject(), workingCopy.getElementName());
 		// and only for C source files
-        if (fileType.isHeader() || ! fileType.getLanguage().getId().equals(ICFileTypeConstants.LANG_C))
-            return;
-		
+        if (workingCopy.isHeaderUnit() || !workingCopy.isCLanguage()) {
+        	return;
+        }
 		if (completionNode != null) {
 			IASTName[] names = completionNode.getNames();
 			for (int i = 0; i < names.length; i++) {