diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AbstractAntSourceViewerConfiguration.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AbstractAntSourceViewerConfiguration.java
index 573a291..2347e8e 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AbstractAntSourceViewerConfiguration.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AbstractAntSourceViewerConfiguration.java
@@ -17,13 +17,19 @@
 import org.eclipse.ant.internal.ui.editor.text.IAntEditorColorConstants;
 import org.eclipse.ant.internal.ui.editor.text.MultilineDamagerRepairer;
 import org.eclipse.ant.internal.ui.model.AntUIPlugin;
-import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.ant.internal.ui.model.ColorManager;
+import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.StringConverter;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.TextAttribute;
 import org.eclipse.jface.text.presentation.IPresentationReconciler;
 import org.eclipse.jface.text.presentation.PresentationReconciler;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.RGB;
 import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
 
 public abstract class AbstractAntSourceViewerConfiguration extends SourceViewerConfiguration {
@@ -31,6 +37,7 @@
 	private AntEditorTagScanner tagScanner;
     private AntEditorProcInstrScanner instructionScanner;
 	private MultilineDamagerRepairer damageRepairer;
+	private TextAttribute xmlCommentAttribute;
 	
 	private AntEditorProcInstrScanner getDefaultScanner() {
 	    if (instructionScanner == null) {
@@ -57,8 +64,8 @@
 	    reconciler.setDamager(dr, AntEditorPartitionScanner.XML_TAG);
 	    reconciler.setRepairer(dr, AntEditorPartitionScanner.XML_TAG);
 	
-		damageRepairer= new MultilineDamagerRepairer(null,
-	            new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.XML_COMMENT_COLOR)));
+	    xmlCommentAttribute=  new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.XML_COMMENT_COLOR));
+		damageRepairer= new MultilineDamagerRepairer(null, xmlCommentAttribute);
 	    reconciler.setDamager(damageRepairer, AntEditorPartitionScanner.XML_COMMENT);
 	    reconciler.setRepairer(damageRepairer, AntEditorPartitionScanner.XML_COMMENT);
 	
@@ -69,15 +76,58 @@
 	 * Preference colors have changed.  
 	 * Update the default tokens of the scanners.
 	 */
-	public void updateScanners() {
+	public void adaptToPreferenceChange(PropertyChangeEvent event) {
 		if (tagScanner == null) {
 			return; //property change before the editor is fully created
 		}
-		tagScanner.adaptToColorChange();
-		instructionScanner.adaptToColorChange();
-				   
-		damageRepairer.setDefaultTextAttribute(new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.XML_COMMENT_COLOR)));				  
+		tagScanner.adaptToPreferenceChange(event);
+		instructionScanner.adaptToPreferenceChange(event);
+		String property= event.getProperty();
+		if (property.startsWith(IAntEditorColorConstants.XML_COMMENT_COLOR)) {
+			if (property.endsWith(AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX)) {
+				adaptToStyleChange(event, SWT.BOLD);
+			} else if (property.endsWith(AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)) {
+				adaptToStyleChange(event, SWT.ITALIC);
+			} else {
+				adaptToColorChange(event);
+			}
+			damageRepairer.setDefaultTextAttribute(xmlCommentAttribute);
+		} 
 	}
+	
+	private void adaptToStyleChange(PropertyChangeEvent event, int styleAttribute) {
+		boolean eventValue= false;
+		Object value= event.getNewValue();
+		if (value instanceof Boolean) {
+			eventValue= ((Boolean) value).booleanValue();
+		} else if (IPreferenceStore.TRUE.equals(value)) {
+			eventValue= true;
+		}
+		
+		boolean activeValue= (xmlCommentAttribute.getStyle() & styleAttribute) == styleAttribute;
+		if (activeValue != eventValue) { 
+			xmlCommentAttribute= new TextAttribute(xmlCommentAttribute.getForeground(), xmlCommentAttribute.getBackground(), eventValue ? xmlCommentAttribute.getStyle() | styleAttribute : xmlCommentAttribute.getStyle() & ~styleAttribute);
+		}	
+	}
+	
+	 /**
+     * Update the text attributes associated with the tokens of this scanner as a color preference has been changed. 
+     */
+    private void adaptToColorChange(PropertyChangeEvent event) {
+    	RGB rgb= null;
+		
+		Object value= event.getNewValue();
+		if (value instanceof RGB) {
+			rgb= (RGB) value;
+		} else if (value instanceof String) {
+			rgb= StringConverter.asRGB((String) value);
+		}
+			
+		if (rgb != null) {
+			xmlCommentAttribute= new TextAttribute(ColorManager.getDefault().getColor(rgb), xmlCommentAttribute.getBackground(), xmlCommentAttribute.getStyle());
+		}
+    }
+	
 
 	public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
 	    return new String[] {
@@ -89,4 +139,13 @@
 	public int getTabWidth(ISourceViewer sourceViewer) {
 		return AntUIPlugin.getDefault().getPreferenceStore().getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
 	}
+	
+	public boolean affectsTextPresentation(PropertyChangeEvent event) {
+		String property= event.getProperty();
+		return property.startsWith(IAntEditorColorConstants.TEXT_COLOR) ||
+			property.startsWith(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR) ||
+			property.startsWith(IAntEditorColorConstants.STRING_COLOR) ||
+			property.startsWith(IAntEditorColorConstants.TAG_COLOR) ||
+			property.startsWith(IAntEditorColorConstants.XML_COMMENT_COLOR);
+	}
 }
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java
index 46a0ca6..c5462a8 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java
@@ -23,7 +23,6 @@
 import org.eclipse.ant.internal.ui.editor.outline.XMLCore;
 import org.eclipse.ant.internal.ui.editor.text.AnnotationAccess;
 import org.eclipse.ant.internal.ui.editor.text.AntEditorDocumentProvider;
-import org.eclipse.ant.internal.ui.editor.text.IAntEditorColorConstants;
 import org.eclipse.ant.internal.ui.editor.text.IReconcilingParticipant;
 import org.eclipse.ant.internal.ui.model.AntUIPlugin;
 import org.eclipse.ant.internal.ui.model.AntUtil;
@@ -451,12 +450,7 @@
 	 * @see org.eclipse.ui.texteditor.AbstractTextEditor#affectsTextPresentation(org.eclipse.jface.util.PropertyChangeEvent)
 	 */
 	protected boolean affectsTextPresentation(PropertyChangeEvent event) {
-		String property= event.getProperty();
-		return property.equals(IAntEditorColorConstants.TEXT_COLOR) ||
-		property.equals(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR) ||
-		property.equals(IAntEditorColorConstants.STRING_COLOR) ||
-		property.equals(IAntEditorColorConstants.TAG_COLOR) ||
-		property.equals(IAntEditorColorConstants.XML_COMMENT_COLOR);
+		return ((AntEditorSourceViewerConfiguration)getSourceViewerConfiguration()).affectsTextPresentation(event);
 	}
 	
 	/* (non-Javadoc)
@@ -487,7 +481,7 @@
 		
 		AntEditorSourceViewerConfiguration sourceViewerConfiguration= (AntEditorSourceViewerConfiguration)getSourceViewerConfiguration();
 		if (affectsTextPresentation(event)) {
-			sourceViewerConfiguration.updateScanners();
+			sourceViewerConfiguration.adaptToPreferenceChange(event);
 		}
 		
 		sourceViewerConfiguration.changeConfiguration(event);
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AbstractAntEditorScanner.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AbstractAntEditorScanner.java
new file mode 100644
index 0000000..d063cce
--- /dev/null
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AbstractAntEditorScanner.java
@@ -0,0 +1,76 @@
+/**********************************************************************
+Copyright (c) 2000, 2004 IBM Corp. 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:
+	IBM Corporation - Initial implementation
+**********************************************************************/
+
+package org.eclipse.ant.internal.ui.editor.text;
+
+import org.eclipse.ant.internal.ui.model.AntUIPlugin;
+import org.eclipse.ant.internal.ui.model.ColorManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.StringConverter;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+
+public abstract class AbstractAntEditorScanner extends RuleBasedScanner {
+
+	protected void adaptToColorChange(PropertyChangeEvent event, Token token) {
+		RGB rgb= null;
+		
+		Object value= event.getNewValue();
+		if (value instanceof RGB) {
+			rgb= (RGB) value;
+		} else if (value instanceof String) {
+			rgb= StringConverter.asRGB((String) value);
+		}
+			
+		if (rgb != null) {
+			TextAttribute attr= (TextAttribute) token.getData();
+			token.setData(new TextAttribute(ColorManager.getDefault().getColor(rgb), attr.getBackground(), attr.getStyle()));
+		}
+	}
+
+	protected void adaptToStyleChange(PropertyChangeEvent event, Token token, int styleAttribute) {
+	 	if (token == null) {
+			return;
+		}
+		boolean eventValue= false;
+		Object value= event.getNewValue();
+		if (value instanceof Boolean) {
+			eventValue= ((Boolean) value).booleanValue();
+		} else if (IPreferenceStore.TRUE.equals(value)) {
+			eventValue= true;
+		}
+		
+		TextAttribute attr= (TextAttribute) token.getData();
+		boolean activeValue= (attr.getStyle() & styleAttribute) == styleAttribute;
+		if (activeValue != eventValue) { 
+			token.setData(new TextAttribute(attr.getForeground(), attr.getBackground(), eventValue ? attr.getStyle() | styleAttribute : attr.getStyle() & ~styleAttribute));
+		}
+	}
+
+	protected TextAttribute createTextAttribute(String colorID, String boldKey, String italicKey) {
+		Color color= null;
+		if (colorID != null) {
+			color= AntUIPlugin.getPreferenceColor(colorID);
+		}
+		IPreferenceStore store= AntUIPlugin.getDefault().getPreferenceStore();
+		int style= store.getBoolean(boldKey) ? SWT.BOLD : SWT.NORMAL;
+		if (store.getBoolean(italicKey)) {
+			style |= SWT.ITALIC;
+		}
+		
+		return new TextAttribute(color, null, style);
+	}
+}
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorProcInstrScanner.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorProcInstrScanner.java
index 246131b..0e1f8fa 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorProcInstrScanner.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorProcInstrScanner.java
@@ -14,27 +14,27 @@
 
 package org.eclipse.ant.internal.ui.editor.text;
 
-import org.eclipse.ant.internal.ui.model.AntUIPlugin;
-import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;
 import org.eclipse.jface.text.rules.IRule;
-import org.eclipse.jface.text.rules.RuleBasedScanner;
 import org.eclipse.jface.text.rules.SingleLineRule;
 import org.eclipse.jface.text.rules.Token;
 import org.eclipse.jface.text.rules.WhitespaceRule;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
 
 /**
  * The scanner to tokenize for XML processing instructions and text
  */
-public class AntEditorProcInstrScanner extends RuleBasedScanner {
+public class AntEditorProcInstrScanner extends AbstractAntEditorScanner {
 
 	Token fProcInstructionToken= null;
 	
     public AntEditorProcInstrScanner() {
 		IRule[] rules =new IRule[2];
         fProcInstructionToken =
-            new Token(
-                new TextAttribute(
-                    AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR)));
+            new Token(createTextAttribute(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR, 
+					IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR + AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX,
+					IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR + AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX));
 
         //Add rule for processing instructions
         rules[0]= new SingleLineRule("<?", "?>", fProcInstructionToken); //$NON-NLS-1$ //$NON-NLS-2$
@@ -44,15 +44,28 @@
 
         setRules(rules);
         
-        setDefaultReturnToken(new Token(
-        						new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.TEXT_COLOR))));
+        setDefaultReturnToken(new Token(createTextAttribute(IAntEditorColorConstants.TEXT_COLOR, 
+    							IAntEditorColorConstants.TEXT_COLOR + AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX,
+								IAntEditorColorConstants.TEXT_COLOR + AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)));
     }
 
-	/**
-	 * Update the text attributes associated with the tokens of this scanner as a color preference has been changed. 
-	 */
-	public void adaptToColorChange() {
-		((Token)fDefaultReturnToken).setData(new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.TEXT_COLOR)));
-		fProcInstructionToken.setData(new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR)));
-	}
+	private Token getTokenAffected(PropertyChangeEvent event) {
+    	if (event.getProperty().startsWith(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR)) {
+    		return fProcInstructionToken;
+    	}
+    	return (Token)fDefaultReturnToken;
+    }
+    
+    public void adaptToPreferenceChange(PropertyChangeEvent event) {
+    	String property= event.getProperty();
+    	if (property.startsWith(IAntEditorColorConstants.TEXT_COLOR) || property.startsWith(IAntEditorColorConstants.PROCESSING_INSTRUCTIONS_COLOR)) {    		
+    		if (property.endsWith(AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX)) {
+	    		adaptToStyleChange(event, getTokenAffected(event), SWT.BOLD);
+	    	} else if (property.endsWith(AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)) {
+	    		adaptToStyleChange(event, getTokenAffected(event), SWT.ITALIC);
+	    	} else {
+	    		adaptToColorChange(event, getTokenAffected(event));
+	    	}
+    	}
+    }
 }
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorTagScanner.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorTagScanner.java
index 67189ee..545cfcb 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorTagScanner.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/text/AntEditorTagScanner.java
@@ -14,26 +14,27 @@
 
 package org.eclipse.ant.internal.ui.editor.text;
 
-import org.eclipse.ant.internal.ui.model.AntUIPlugin;
-import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;
 import org.eclipse.jface.text.rules.IRule;
 import org.eclipse.jface.text.rules.MultiLineRule;
-import org.eclipse.jface.text.rules.RuleBasedScanner;
 import org.eclipse.jface.text.rules.SingleLineRule;
 import org.eclipse.jface.text.rules.Token;
 import org.eclipse.jface.text.rules.WhitespaceRule;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
 
 /**
  * The scanner to tokenize for strings and tags
  */
-public class AntEditorTagScanner extends RuleBasedScanner {
+public class AntEditorTagScanner extends AbstractAntEditorScanner {
 
 	private Token fStringToken;
 	
     public AntEditorTagScanner() {
     	fStringToken= new Token(
-                			new TextAttribute(
-                				AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.STRING_COLOR)));
+    			createTextAttribute(IAntEditorColorConstants.STRING_COLOR, 
+    					IAntEditorColorConstants.STRING_COLOR + AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX,
+						IAntEditorColorConstants.STRING_COLOR + AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX));
                     
 		IRule[] rules= new IRule[3];
 
@@ -47,14 +48,30 @@
         setRules(rules);
         
         setDefaultReturnToken(
-        		new Token(new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.TAG_COLOR))));
+        		new Token(createTextAttribute(IAntEditorColorConstants.TAG_COLOR, 
+    					IAntEditorColorConstants.TAG_COLOR + AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX,
+						IAntEditorColorConstants.TAG_COLOR + AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)));
     }
     
-    /**
-     * Update the text attributes associated with the tokens of this scanner as a color preference has been changed. 
-     */
-    public void adaptToColorChange() {
-    	((Token)fDefaultReturnToken).setData(new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.TAG_COLOR)));
-    	fStringToken.setData(new TextAttribute(AntUIPlugin.getPreferenceColor(IAntEditorColorConstants.STRING_COLOR)));
+    public void adaptToPreferenceChange(PropertyChangeEvent event) {
+    	String property= event.getProperty();
+    	if (property.startsWith(IAntEditorColorConstants.TAG_COLOR) || property.startsWith(IAntEditorColorConstants.STRING_COLOR)) {
+    		if (property.endsWith(AntEditorPreferenceConstants.EDITOR_BOLD_SUFFIX)) {
+    			adaptToStyleChange(event, getTokenAffected(event), SWT.BOLD);
+    		} else if (property.endsWith(AntEditorPreferenceConstants.EDITOR_ITALIC_SUFFIX)) {
+    			adaptToStyleChange(event, getTokenAffected(event), SWT.ITALIC);
+    		} else {
+    			adaptToColorChange(event, getTokenAffected(event));
+    		}
+    	}
+    }
+    
+    private Token getTokenAffected(PropertyChangeEvent event) {
+    	String property= event.getProperty();
+    	if (property.startsWith(IAntEditorColorConstants.STRING_COLOR)) {
+    		return fStringToken;
+    	}// else if (property.startsWith(IAntEditorColorConstants.TAG_COLOR)) {
+    		return (Token)fDefaultReturnToken;
+    	//}
     }
 }
diff --git a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties
index 13070db..41c173f 100644
--- a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties
+++ b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties
@@ -118,7 +118,7 @@
 AntEditorPreferencePage.showLineNumbers=Show lin&e numbers
 AntEditorPreferencePage.highlightCurrentLine=Hi&ghlight current line
 AntEditorPreferencePage.showPrintMargin=Sho&w print margin
-AntEditorPreferencePage.color=C&olor:
+AntEditorPreferencePage.6=C&olor:
 AntEditorPreferencePage.appearanceOptions=Appearance co&lor options:
 AntEditorPreferencePage.lineNumberForegroundColor=Line number foreground
 AntEditorPreferencePage.currentLineHighlighColor=Current line highlight
@@ -128,11 +128,21 @@
 AntEditorPreferencePage.Ant_editor_constant_strings_3=Constant strings
 AntEditorPreferencePage.Ant_editor_tags_4=Tags
 AntEditorPreferencePage.Ant_editor_comments_5=Comments
-AntEditorPreferencePage.Col&or__6=Col&or:
 AntEditorPreferencePage.37=Displayed &tab width:
 AntEditorPreferencePage.38=No tab width specified
 AntEditorPreferencePage.39=Invalid tab width specified
+AntEditorPreferencePage.3=System de&fault
 AntEditorPreferencePage.40=&Insert spaces for tabs when typing
+AntEditorPreferencePage.41= Selection foreground color
+AntEditorPreferencePage.42= Selection background color
+AntEditorPreferencePage.0=System De&fault
+AntEditorPreferencePage.1=Synta&x
+AntEditorPreferencePage.2=Background color
+AntEditorPreferencePage.4=C&ustom:
+AntEditorPreferencePage.5=Fore&ground:
+AntEditorPreferencePage.7=&Bold
+AntEditorPreferencePage.8=I&talic
+AntEditorPreferencePage.9=&Preview:
 
 ClasspathModel.2=Ant Home Entries
 ClasspathModel.3=Global Entries
@@ -148,7 +158,3 @@
 AntCodeFormatterPreferencePage.8=No maximum line width specified
 AntCodeFormatterPreferencePage.9=Invalid maximum line width specified
 AntCodeFormatterPreferencePage.10=&Wrap long element tags
-AntCodeFormatterPreferencePage.11=White Space
-AntCodeFormatterPreferencePage.12=Delete &blank lines (work in progress)
-AntCodeFormatterPreferencePage.13=Comments
-AntCodeFormatterPreferencePage.14=&Format comments (work in progress)
diff --git a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreviewerUpdater.java b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreviewerUpdater.java
new file mode 100644
index 0000000..abed0bd
--- /dev/null
+++ b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreviewerUpdater.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ant.internal.ui.preferences;
+
+import org.eclipse.ant.internal.ui.editor.AbstractAntSourceViewerConfiguration;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+/**
+ * Handles Java editor font changes for Java source preview viewers.
+ * 
+ * @since 3.0
+ */
+class AntPreviewerUpdater {
+	
+	private Color fForegroundColor= null;
+	private Color fBackgroundColor= null;
+	private Color fSelectionBackgroundColor= null;
+	private Color fSelectionForegroundColor= null;
+	
+	
+	/**
+	 * Creates a source preview updater for the given viewer, configuration and preference store.
+	 *
+	 * @param viewer the viewer
+	 * @param configuration the configuration
+	 * @param preferenceStore the preference store
+	 */
+	AntPreviewerUpdater(final SourceViewer viewer, final AbstractAntSourceViewerConfiguration configuration, final IPreferenceStore preferenceStore) {
+		
+		initializeViewerColors(viewer, preferenceStore);
+		
+		final IPropertyChangeListener fontChangeListener= new IPropertyChangeListener() {
+			/*
+			 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+			 */
+			public void propertyChange(PropertyChangeEvent event) {
+				if (event.getProperty().equals(JFaceResources.TEXT_FONT)) {
+					Font font= JFaceResources.getFont(JFaceResources.TEXT_FONT);
+					viewer.getTextWidget().setFont(font);
+				}
+			}
+		};
+		final IPropertyChangeListener propertyChangeListener= new IPropertyChangeListener() {
+			/*
+			 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
+			 */
+			public void propertyChange(PropertyChangeEvent event) {
+				
+					String property= event.getProperty();
+					
+				if (AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND.equals(property) || AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT.equals(property) ||
+						AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND.equals(property) ||	AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT.equals(property) ||
+						AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND.equals(property) || AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT.equals(property) ||
+						AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND.equals(property) ||	AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT.equals(property))
+					{
+						initializeViewerColors(viewer, preferenceStore);
+					} 
+				
+				if (configuration.affectsTextPresentation(event)) {
+					configuration.adaptToPreferenceChange(event);
+					viewer.invalidateTextPresentation();
+				}
+			}
+		};
+		viewer.getTextWidget().addDisposeListener(new DisposeListener() {
+			/*
+			 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
+			 */
+			public void widgetDisposed(DisposeEvent e) {
+				preferenceStore.removePropertyChangeListener(propertyChangeListener);
+				JFaceResources.getFontRegistry().removeListener(fontChangeListener);
+			}
+		});
+		JFaceResources.getFontRegistry().addListener(fontChangeListener);
+		preferenceStore.addPropertyChangeListener(propertyChangeListener);
+	}
+	
+	/**
+	 * Initializes the given viewer's colors.
+	 * 
+	 * @param viewer the viewer to be initialized
+	 * @since 2.0
+	 */
+	protected void initializeViewerColors(ISourceViewer viewer, IPreferenceStore store) {
+			
+		StyledText styledText= viewer.getTextWidget();
+		
+		// ----------- foreground color --------------------
+		Color color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND_SYSTEM_DEFAULT)
+			? null
+			: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_FOREGROUND, styledText.getDisplay());
+		styledText.setForeground(color);
+			
+		if (fForegroundColor != null) {
+			fForegroundColor.dispose();
+		}
+		
+		fForegroundColor= color;
+		
+		// ---------- background color ----------------------
+		color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)
+			? null
+			: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND, styledText.getDisplay());
+		styledText.setBackground(color);
+			
+		if (fBackgroundColor != null) {
+			fBackgroundColor.dispose();
+		}
+			
+		fBackgroundColor= color;
+		
+		// ----------- selection foreground color --------------------
+		color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND_SYSTEM_DEFAULT)
+			? null
+			: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_SELECTION_FOREGROUND, styledText.getDisplay());
+		styledText.setSelectionForeground(color);
+			
+		if (fSelectionForegroundColor != null) {
+			fSelectionForegroundColor.dispose();
+		}
+		
+		fSelectionForegroundColor= color;
+		
+		// ---------- selection background color ----------------------
+		color= store.getBoolean(AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND_SYSTEM_DEFAULT)
+			? null
+			: createColor(store, AbstractTextEditor.PREFERENCE_COLOR_SELECTION_BACKGROUND, styledText.getDisplay());
+		styledText.setSelectionBackground(color);
+			
+		if (fSelectionBackgroundColor != null) {
+			fSelectionBackgroundColor.dispose();
+		}
+			
+		fSelectionBackgroundColor= color;
+	}
+	
+	/**
+	 * Creates a color from the information stored in the given preference store.
+	 * Returns <code>null</code> if there is no such information available.
+	 * 
+	 * @param store the store to read from
+	 * @param key the key used for the lookup in the preference store
+	 * @param display the display used create the color
+	 * @return the created color according to the specification in the preference store
+	 * @since 2.0
+	 */
+	private Color createColor(IPreferenceStore store, String key, Display display) {
+	
+		RGB rgb= null;		
+		
+		if (store.contains(key)) {
+			
+			if (store.isDefault(key))
+				rgb= PreferenceConverter.getDefaultColor(store, key);
+			else
+				rgb= PreferenceConverter.getColor(store, key);
+		
+			if (rgb != null)
+				return new Color(display, rgb);
+		}
+		
+		return null;
+	}
+
+	public void dispose() {
+		if (fForegroundColor != null) {
+			fForegroundColor.dispose();
+			fForegroundColor= null;
+		}
+		
+		if (fBackgroundColor != null) {
+			fBackgroundColor.dispose();
+			fBackgroundColor= null;
+		}
+		
+		if (fSelectionForegroundColor != null) {
+			fSelectionForegroundColor.dispose();
+			fSelectionForegroundColor= null;
+		}
+		
+		if (fSelectionBackgroundColor != null) {
+			fSelectionBackgroundColor.dispose();
+			fSelectionBackgroundColor= null;
+		}
+	}
+}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/SyntaxPreviewCode.txt b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/SyntaxPreviewCode.txt
new file mode 100644
index 0000000..44a3352
--- /dev/null
+++ b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/SyntaxPreviewCode.txt
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project default="greetings">
+    <target name="greetings">
+    <!--Saying HI
+    to the world-->
+        <echo>
+             Eclipse!
+        </echo>		  
+    </target>
+</project>
\ No newline at end of file
