diff --git a/formatter/src/main/java/org/apache/royale/formatter/internal/ASTokenFormatter.java b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java
similarity index 95%
rename from formatter/src/main/java/org/apache/royale/formatter/internal/ASTokenFormatter.java
rename to formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java
index 97c0b18..b3848c2 100644
--- a/formatter/src/main/java/org/apache/royale/formatter/internal/ASTokenFormatter.java
+++ b/formatter/src/main/java/org/apache/royale/formatter/ASTokenFormatter.java
@@ -17,7 +17,7 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-package org.apache.royale.formatter.internal;
+package org.apache.royale.formatter;
 
 import java.io.StringReader;
 import java.util.ArrayList;
@@ -42,8 +42,8 @@
 import org.apache.royale.compiler.parsing.IASToken;
 import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.compiler.problems.UnexpectedExceptionProblem;
-import org.apache.royale.formatter.FORMATTER;
 import org.apache.royale.formatter.config.Semicolons;
+import org.apache.royale.formatter.internal.BaseTokenFormatter;
 
 public class ASTokenFormatter extends BaseTokenFormatter {
 	private static final int TOKEN_TYPE_EXTRA = 999999;
@@ -51,8 +51,8 @@
 	private static final String FORMATTER_TAG_OFF = "@formatter:off";
 	private static final String FORMATTER_TAG_ON = "@formatter:on";
 
-	public ASTokenFormatter(FORMATTER formatter) {
-		super(formatter);
+	public ASTokenFormatter(FormatterSettings settings) {
+		super(settings);
 	}
 
 	private int indent;
@@ -104,7 +104,7 @@
 			problems.addAll(tokenizer.getTokenizationProblems());
 		}
 
-		if (!formatter.ignoreProblems && hasErrors(problems)) {
+		if (!settings.ignoreProblems && hasErrors(problems)) {
 			return text;
 		}
 
@@ -142,7 +142,7 @@
 			problems.addAll(parser.getSyntaxProblems());
 		}
 
-		if (!formatter.ignoreProblems && hasErrors(problems)) {
+		if (!settings.ignoreProblems && hasErrors(problems)) {
 			return text;
 		}
 
@@ -229,7 +229,7 @@
 						}
 						boolean oneLineBlock = prevToken != null && prevToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN
 								&& nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
-						if (oneLineBlock && formatter.collapseEmptyBlocks) {
+						if (oneLineBlock && settings.collapseEmptyBlocks) {
 							newLinesInExtra = 0;
 						}
 						numRequiredNewLines = Math.max(numRequiredNewLines, newLinesInExtra);
@@ -291,11 +291,11 @@
 							}
 							boolean oneLineBlock = nextToken != null
 									&& nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
-							boolean needsNewLine = formatter.placeOpenBraceOnNewLine && (!formatter.collapseEmptyBlocks || !oneLineBlock);
+							boolean needsNewLine = settings.placeOpenBraceOnNewLine && (!settings.collapseEmptyBlocks || !oneLineBlock);
 							if (needsNewLine) {
 								numRequiredNewLines = Math.max(numRequiredNewLines, 1);
 							} else {
-								if (oneLineBlock && formatter.collapseEmptyBlocks) {
+								if (oneLineBlock && settings.collapseEmptyBlocks) {
 									numRequiredNewLines = 0;
 								}
 								requiredSpace = true;
@@ -315,7 +315,7 @@
 							if (stackItem.blockDepth <= 1) {
 								boolean oneLineBlock = prevToken != null
 										&& prevToken.getType() == ASTokenTypes.TOKEN_BLOCK_OPEN;
-								if (!formatter.collapseEmptyBlocks || !oneLineBlock) {
+								if (!settings.collapseEmptyBlocks || !oneLineBlock) {
 									indent = decreaseIndent(indent);
 								}
 								if (stackItem.token.getType() == ASTokenTypes.TOKEN_KEYWORD_CASE
@@ -402,7 +402,7 @@
 					case ASTokenTypes.TOKEN_OPERATOR_BITWISE_XOR_ASSIGNMENT:
 					case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_AND_ASSIGNMENT:
 					case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_OR_ASSIGNMENT: {
-						if (formatter.insertSpaceBeforeAndAfterBinaryOperators) {
+						if (settings.insertSpaceBeforeAndAfterBinaryOperators) {
 							requiredSpace = true;
 						}
 						break;
@@ -410,7 +410,7 @@
 					case ASTokenTypes.TOKEN_OPERATOR_STAR: {
 						boolean isAnyType = checkTokenBeforeAnyType(prevTokenNotComment);
 						boolean isAnyVectorType = checkTokensForAnyVectorType(prevTokenNotComment, nextTokenNotComment);
-						if (!isAnyType && !isAnyVectorType && formatter.insertSpaceBeforeAndAfterBinaryOperators
+						if (!isAnyType && !isAnyVectorType && settings.insertSpaceBeforeAndAfterBinaryOperators
 								&& !skipWhitespaceBeforeSemicolon) {
 							requiredSpace = true;
 						}
@@ -419,21 +419,21 @@
 					case ASTokenTypes.TOKEN_OPERATOR_PLUS:
 					case ASTokenTypes.TOKEN_OPERATOR_MINUS: {
 						boolean isUnary = checkTokenBeforeUnaryOperator(prevTokenNotComment);
-						if (!isUnary && formatter.insertSpaceBeforeAndAfterBinaryOperators) {
+						if (!isUnary && settings.insertSpaceBeforeAndAfterBinaryOperators) {
 							requiredSpace = true;
 						}
 						break;
 					}
 					case ASTokenTypes.TOKEN_OPERATOR_ASSIGNMENT: {
 						inVarOrConstDeclaration = false;
-						if (formatter.insertSpaceBeforeAndAfterBinaryOperators) {
+						if (settings.insertSpaceBeforeAndAfterBinaryOperators) {
 							requiredSpace = true;
 						}
 						break;
 					}
 					case ASTokenTypes.TOKEN_OPERATOR_TERNARY: {
 						ternaryStack++;
-						if (formatter.insertSpaceBeforeAndAfterBinaryOperators) {
+						if (settings.insertSpaceBeforeAndAfterBinaryOperators) {
 							requiredSpace = true;
 						}
 						break;
@@ -509,7 +509,7 @@
 					if (blockOpenPending) {
 						boolean oneLineBlock = nextToken != null
 								&& nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
-						if (formatter.placeOpenBraceOnNewLine && (!formatter.collapseEmptyBlocks || !oneLineBlock)) {
+						if (settings.placeOpenBraceOnNewLine && (!settings.collapseEmptyBlocks || !oneLineBlock)) {
 							indent = increaseIndent(indent);
 						}
 					}
@@ -540,7 +540,7 @@
 				switch (token.getType()) {
 					case ASTokenTypes.TOKEN_SEMICOLON: {
 						if (inControlFlowStatement && isInForStatement(blockStack)) {
-							if (formatter.insertSpaceAfterSemicolonInForStatements) {
+							if (settings.insertSpaceAfterSemicolonInForStatements) {
 								requiredSpace = true;
 							}
 							// else no space
@@ -582,8 +582,8 @@
 							}
 							boolean oneLineBlock = nextToken != null
 									&& nextToken.getType() == ASTokenTypes.TOKEN_BLOCK_CLOSE;
-							if (!formatter.collapseEmptyBlocks || !oneLineBlock) {
-								if (!formatter.placeOpenBraceOnNewLine) {
+							if (!settings.collapseEmptyBlocks || !oneLineBlock) {
+								if (!settings.placeOpenBraceOnNewLine) {
 									indent = increaseIndent(indent);
 								}
 								numRequiredNewLines = Math.max(numRequiredNewLines, 1);
@@ -683,7 +683,7 @@
 					case ASTokenTypes.TOKEN_KEYWORD_FUNCTION: {
 						blockStack.add(new BlockStackItem(token));
 						inFunctionDeclaration = true;
-						boolean skipSpace = !formatter.insertSpaceAfterFunctionKeywordForAnonymousFunctions
+						boolean skipSpace = !settings.insertSpaceAfterFunctionKeywordForAnonymousFunctions
 								&& (nextToken != null && nextToken.getType() == ASTokenTypes.TOKEN_PAREN_OPEN);
 						if (!skipSpace) {
 							requiredSpace = true;
@@ -704,7 +704,7 @@
 					case ASTokenTypes.TOKEN_KEYWORD_WITH: {
 						inControlFlowStatement = true;
 						blockStack.add(new BlockStackItem(token));
-						if (formatter.insertSpaceAfterKeywordsInControlFlowStatements && !skipWhitespaceBeforeSemicolon) {
+						if (settings.insertSpaceAfterKeywordsInControlFlowStatements && !skipWhitespaceBeforeSemicolon) {
 							requiredSpace = true;
 						}
 						break;
@@ -712,7 +712,7 @@
 					case ASTokenTypes.TOKEN_KEYWORD_SWITCH: {
 						inControlFlowStatement = true;
 						blockStack.add(new SwitchBlockStackItem(token));
-						if (formatter.insertSpaceAfterKeywordsInControlFlowStatements && !skipWhitespaceBeforeSemicolon) {
+						if (settings.insertSpaceAfterKeywordsInControlFlowStatements && !skipWhitespaceBeforeSemicolon) {
 							requiredSpace = true;
 						}
 						break;
@@ -876,7 +876,7 @@
 					case ASTokenTypes.TOKEN_OPERATOR_BITWISE_XOR_ASSIGNMENT:
 					case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_AND_ASSIGNMENT:
 					case ASTokenTypes.TOKEN_OPERATOR_LOGICAL_OR_ASSIGNMENT: {
-						if (formatter.insertSpaceBeforeAndAfterBinaryOperators && !skipWhitespaceBeforeSemicolon) {
+						if (settings.insertSpaceBeforeAndAfterBinaryOperators && !skipWhitespaceBeforeSemicolon) {
 							requiredSpace = true;
 						}
 						break;
@@ -884,7 +884,7 @@
 					case ASTokenTypes.TOKEN_OPERATOR_STAR: {
 						boolean isAnyType = checkTokenBeforeAnyType(prevTokenNotComment);
 						boolean isAnyVectorType = checkTokensForAnyVectorType(prevTokenNotComment, nextTokenNotComment);
-						if (!isAnyType && !isAnyVectorType && formatter.insertSpaceBeforeAndAfterBinaryOperators
+						if (!isAnyType && !isAnyVectorType && settings.insertSpaceBeforeAndAfterBinaryOperators
 								&& !skipWhitespaceBeforeSemicolon) {
 							requiredSpace = true;
 						}
@@ -893,7 +893,7 @@
 					case ASTokenTypes.TOKEN_OPERATOR_PLUS:
 					case ASTokenTypes.TOKEN_OPERATOR_MINUS: {
 						boolean isUnary = checkTokenBeforeUnaryOperator(prevTokenNotComment);
-						if (!isUnary && formatter.insertSpaceBeforeAndAfterBinaryOperators && !skipWhitespaceBeforeSemicolon) {
+						if (!isUnary && settings.insertSpaceBeforeAndAfterBinaryOperators && !skipWhitespaceBeforeSemicolon) {
 							requiredSpace = true;
 						}
 						break;
@@ -902,7 +902,7 @@
 						if (varOrConstChainLevel == blockStack.size()) {
 							inVarOrConstDeclaration = true;
 						}
-						if (formatter.insertSpaceAfterCommaDelimiter && !skipWhitespaceBeforeSemicolon) {
+						if (settings.insertSpaceAfterCommaDelimiter && !skipWhitespaceBeforeSemicolon) {
 							requiredSpace = true;
 						}
 						break;
@@ -1006,8 +1006,8 @@
 					if (skipFormatting) {
 						return token.isImplicit() ? "" : token.getText();
 					}
-					boolean skipSemicolon = Semicolons.REMOVE.equals(formatter.semicolons)
-							|| (Semicolons.IGNORE.equals(formatter.semicolons) && token.isImplicit());
+					boolean skipSemicolon = Semicolons.REMOVE.equals(settings.semicolons)
+							|| (Semicolons.IGNORE.equals(settings.semicolons) && token.isImplicit());
 					if (!skipSemicolon) {
 						return token.getText();
 					}
@@ -1047,7 +1047,7 @@
 				case MetadataTokenTypes.TOKEN_ATTR_OPERATOR_NS_QUALIFIER: {
 					if (needsComma) {
 						builder.append(",");
-						if (formatter.insertSpaceBetweenMetadataAttributes) {
+						if (settings.insertSpaceBetweenMetadataAttributes) {
 							builder.append(" ");
 						}
 					}
@@ -1066,7 +1066,7 @@
 				case MetadataTokenTypes.TOKEN_STRING: {
 					if (needsComma) {
 						builder.append(",");
-						if (formatter.insertSpaceBetweenMetadataAttributes) {
+						if (settings.insertSpaceBetweenMetadataAttributes) {
 							builder.append(" ");
 						}
 					}
@@ -1088,7 +1088,7 @@
 		comment = comment.substring(2).trim();
 		StringBuilder builder = new StringBuilder();
 		builder.append("//");
-		if (formatter.insertSpaceAtStartOfLineComment) {
+		if (settings.insertSpaceAtStartOfLineComment) {
 			builder.append(" ");
 		}
 		builder.append(comment);
diff --git a/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java b/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java
index 469b08b..e6ad9be 100644
--- a/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java
+++ b/formatter/src/main/java/org/apache/royale/formatter/FORMATTER.java
@@ -49,8 +49,6 @@
 import org.apache.royale.formatter.config.ConfigurationValue;
 import org.apache.royale.formatter.config.Configurator;
 import org.apache.royale.formatter.config.Semicolons;
-import org.apache.royale.formatter.internal.ASTokenFormatter;
-import org.apache.royale.formatter.internal.MXMLTokenFormatter;
 import org.apache.royale.utils.FilenameNormalization;
 
 /**
@@ -199,11 +197,9 @@
 		filePath = FilenameNormalization.normalize(filePath);
 		String result = null;
 		if (filePath.endsWith(".mxml")) {
-			MXMLTokenFormatter mxmlFormatter = new MXMLTokenFormatter(this);
-			result = mxmlFormatter.format(filePath, text, problems);
+			result = formatMXMLTokens(filePath, text, problems);
 		} else {
-			ASTokenFormatter asFormatter = new ASTokenFormatter(this);
-			result = asFormatter.format(filePath, text, problems);
+			result = formatASTokens(filePath, text, problems);
 		}
 		if (insertFinalNewLine && result.charAt(result.length() - 1) != '\n') {
 			return result + '\n';
@@ -217,8 +213,7 @@
 
 	public String formatActionScriptText(String text, Collection<ICompilerProblem> problems) {
 		String filePath = FilenameNormalization.normalize("stdin.as");
-		ASTokenFormatter asFormatter = new ASTokenFormatter(this);
-		return asFormatter.format(filePath, text, problems);
+		return formatASTokens(filePath, text, problems);
 	}
 
 	public String formatActionScriptText(String text) {
@@ -227,14 +222,45 @@
 
 	public String formatMXMLText(String text, Collection<ICompilerProblem> problems) {
 		String filePath = FilenameNormalization.normalize("stdin.mxml");
-		MXMLTokenFormatter mxmlFormatter = new MXMLTokenFormatter(this);
-		return mxmlFormatter.format(filePath, text, problems);
+		return formatMXMLTokens(filePath, text, problems);
 	}
 
 	public String formatMXMLText(String text) {
 		return formatMXMLText(text, null);
 	}
 
+	private String formatASTokens(String filePath, String text, Collection<ICompilerProblem> problems) {
+		ASTokenFormatter asFormatter = new ASTokenFormatter(getFormatterSettings());
+		return asFormatter.format(filePath, text, problems);
+	}
+
+	private String formatMXMLTokens(String filePath, String text, Collection<ICompilerProblem> problems) {
+		MXMLTokenFormatter mxmlFormatter = new MXMLTokenFormatter(getFormatterSettings());
+		return mxmlFormatter.format(filePath, text, problems);
+	}
+
+	private FormatterSettings getFormatterSettings() {
+		FormatterSettings result = new FormatterSettings();
+		result.tabSize = tabSize;
+		result.insertSpaces = insertSpaces;
+		result.insertFinalNewLine = insertFinalNewLine;
+		result.placeOpenBraceOnNewLine = placeOpenBraceOnNewLine;
+		result.insertSpaceAfterSemicolonInForStatements = insertSpaceAfterSemicolonInForStatements;
+		result.insertSpaceAfterKeywordsInControlFlowStatements = insertSpaceAfterKeywordsInControlFlowStatements;
+		result.insertSpaceAfterFunctionKeywordForAnonymousFunctions = insertSpaceAfterFunctionKeywordForAnonymousFunctions;
+		result.insertSpaceBeforeAndAfterBinaryOperators = insertSpaceBeforeAndAfterBinaryOperators;
+		result.insertSpaceAfterCommaDelimiter = insertSpaceAfterCommaDelimiter;
+		result.insertSpaceBetweenMetadataAttributes = insertSpaceBetweenMetadataAttributes;
+		result.insertSpaceAtStartOfLineComment = insertSpaceAtStartOfLineComment;
+		result.maxPreserveNewLines = maxPreserveNewLines;
+		result.semicolons = semicolons;
+		result.ignoreProblems = ignoreProblems;
+		result.collapseEmptyBlocks = collapseEmptyBlocks;
+		result.mxmlAlignAttributes = mxmlAlignAttributes;
+		result.mxmlInsertNewLineBetweenAttributes = mxmlInsertNewLineBetweenAttributes;
+		return result;
+	}
+
 	/**
 	 * Get the start up message that contains the program name with the copyright
 	 * notice.
diff --git a/formatter/src/main/java/org/apache/royale/formatter/FormatterSettings.java b/formatter/src/main/java/org/apache/royale/formatter/FormatterSettings.java
new file mode 100644
index 0000000..c083f01
--- /dev/null
+++ b/formatter/src/main/java/org/apache/royale/formatter/FormatterSettings.java
@@ -0,0 +1,42 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package org.apache.royale.formatter;
+
+import org.apache.royale.formatter.config.Semicolons;
+
+public class FormatterSettings {
+	public int tabSize = 4;
+	public boolean insertSpaces = false;
+	public boolean insertFinalNewLine = false;
+	public boolean placeOpenBraceOnNewLine = true;
+	public boolean insertSpaceAfterSemicolonInForStatements = true;
+	public boolean insertSpaceAfterKeywordsInControlFlowStatements = true;
+	public boolean insertSpaceAfterFunctionKeywordForAnonymousFunctions = false;
+	public boolean insertSpaceBeforeAndAfterBinaryOperators = true;
+	public boolean insertSpaceAfterCommaDelimiter = true;
+	public boolean insertSpaceBetweenMetadataAttributes = true;
+	public boolean insertSpaceAtStartOfLineComment = true;
+	public int maxPreserveNewLines = 2;
+	public Semicolons semicolons = Semicolons.INSERT;
+	public boolean ignoreProblems = false;
+	public boolean collapseEmptyBlocks = false;
+	public boolean mxmlAlignAttributes = false;
+	public boolean mxmlInsertNewLineBetweenAttributes = false;
+}
diff --git a/formatter/src/main/java/org/apache/royale/formatter/internal/MXMLTokenFormatter.java b/formatter/src/main/java/org/apache/royale/formatter/MXMLTokenFormatter.java
similarity index 96%
rename from formatter/src/main/java/org/apache/royale/formatter/internal/MXMLTokenFormatter.java
rename to formatter/src/main/java/org/apache/royale/formatter/MXMLTokenFormatter.java
index 662a3b7..a0b5dcc 100644
--- a/formatter/src/main/java/org/apache/royale/formatter/internal/MXMLTokenFormatter.java
+++ b/formatter/src/main/java/org/apache/royale/formatter/MXMLTokenFormatter.java
@@ -17,7 +17,7 @@
 //
 ////////////////////////////////////////////////////////////////////////////////
 
-package org.apache.royale.formatter.internal;
+package org.apache.royale.formatter;
 
 import java.io.StringReader;
 import java.util.ArrayList;
@@ -33,7 +33,7 @@
 import org.apache.royale.compiler.parsing.MXMLTokenTypes;
 import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.compiler.problems.UnexpectedExceptionProblem;
-import org.apache.royale.formatter.FORMATTER;
+import org.apache.royale.formatter.internal.BaseTokenFormatter;
 
 public class MXMLTokenFormatter extends BaseTokenFormatter {
 	private static final int TOKEN_TYPE_EXTRA = 999999;
@@ -41,8 +41,8 @@
 	private static final String FORMATTER_TAG_OFF = "@formatter:off";
 	private static final String FORMATTER_TAG_ON = "@formatter:on";
 
-	public MXMLTokenFormatter(FORMATTER formatter) {
-		super(formatter);
+	public MXMLTokenFormatter(FormatterSettings settings) {
+		super(settings);
 	}
 
 	private int indent;
@@ -77,7 +77,7 @@
 			problems.addAll(mxmlTokenizer.getTokenizationProblems());
 		}
 
-		if (!formatter.ignoreProblems && hasErrors(problems)) {
+		if (!settings.ignoreProblems && hasErrors(problems)) {
 			return text;
 		}
 
@@ -302,7 +302,7 @@
 					break;
 				}
 				case MXMLTokenTypes.TOKEN_STRING: {
-					if (inOpenTag && formatter.mxmlInsertNewLineBetweenAttributes && nextToken != null
+					if (inOpenTag && settings.mxmlInsertNewLineBetweenAttributes && nextToken != null
 							&& nextToken.getType() != MXMLTokenTypes.TOKEN_TAG_END
 							&& nextToken.getType() != MXMLTokenTypes.TOKEN_EMPTY_TAG_END) {
 						numRequiredNewLines = Math.max(numRequiredNewLines, 1);
@@ -331,9 +331,9 @@
 	private String formatMXMLScriptElement(String filePath, int line, String text,
 			Collection<ICompilerProblem> problems) {
 		String indent = "\t";
-		if (formatter.insertSpaces) {
+		if (settings.insertSpaces) {
 			indent = "";
-			for (int i = 0; i < formatter.tabSize; i++) {
+			for (int i = 0; i < settings.tabSize; i++) {
 				indent += " ";
 			}
 		}
@@ -354,9 +354,9 @@
 		String cdataText = scriptMatcher.group(3);
 		String scriptText = scriptMatcher.group(4);
 		boolean requireCdata = cdataText != null || "Script".equals(scriptTagName);
-		ASTokenFormatter asFormatter = new ASTokenFormatter(formatter);
+		ASTokenFormatter asFormatter = new ASTokenFormatter(settings);
 		String formattedScriptText = asFormatter.format(filePath + "@Script[" + line + "]", scriptText, problems);
-		if (!formatter.ignoreProblems && hasErrors(problems)) {
+		if (!settings.ignoreProblems && hasErrors(problems)) {
 			return text;
 		}
 		if (formattedScriptText.length() > 0) {
@@ -443,14 +443,14 @@
 	}
 
 	private String getAttributeIndent(IMXMLToken openTagToken) {
-		if (!formatter.mxmlAlignAttributes) {
+		if (!settings.mxmlAlignAttributes) {
 			return getIndent();
 		}
 		int indentSize = openTagToken.getText().length() + 1;
 		String result = "";
-		while (indentSize >= formatter.tabSize) {
+		while (indentSize >= settings.tabSize) {
 			result += getIndent();
-			indentSize -= formatter.tabSize;
+			indentSize -= settings.tabSize;
 		}
 		for (int i = 0; i < indentSize; i++) {
 			result += " ";
diff --git a/formatter/src/main/java/org/apache/royale/formatter/internal/BaseTokenFormatter.java b/formatter/src/main/java/org/apache/royale/formatter/internal/BaseTokenFormatter.java
index 158f642..1ad662c 100644
--- a/formatter/src/main/java/org/apache/royale/formatter/internal/BaseTokenFormatter.java
+++ b/formatter/src/main/java/org/apache/royale/formatter/internal/BaseTokenFormatter.java
@@ -24,13 +24,13 @@
 import org.apache.royale.compiler.clients.problems.CompilerProblemCategorizer;
 import org.apache.royale.compiler.problems.CompilerProblemSeverity;
 import org.apache.royale.compiler.problems.ICompilerProblem;
-import org.apache.royale.formatter.FORMATTER;
+import org.apache.royale.formatter.FormatterSettings;
 
 public abstract class BaseTokenFormatter {
-	protected FORMATTER formatter;
+	protected FormatterSettings settings;
 
-	protected BaseTokenFormatter(FORMATTER formatter) {
-		this.formatter = formatter;
+	protected BaseTokenFormatter(FormatterSettings settings) {
+		this.settings = settings;
 	}
 
 	protected boolean hasErrors(Collection<ICompilerProblem> problems) {
@@ -53,9 +53,9 @@
 	}
 
 	protected String getIndent() {
-		if (formatter.insertSpaces) {
+		if (settings.insertSpaces) {
 			String result = "";
-			for (int j = 0; j < formatter.tabSize; j++) {
+			for (int j = 0; j < settings.tabSize; j++) {
 				result += " ";
 			}
 			return result;
@@ -71,8 +71,8 @@
 	}
 
 	protected void appendNewLines(StringBuilder builder, int numRequiredNewLines) {
-		if (formatter.maxPreserveNewLines != 0) {
-			numRequiredNewLines = Math.min(formatter.maxPreserveNewLines, numRequiredNewLines);
+		if (settings.maxPreserveNewLines != 0) {
+			numRequiredNewLines = Math.min(settings.maxPreserveNewLines, numRequiredNewLines);
 		}
 		for (int j = 0; j < numRequiredNewLines; j++) {
 			builder.append('\n');
