*** empty log message ***
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java
index fb5fbf2..37339eb 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaHeuristicScanner.java
@@ -589,7 +589,7 @@
 	 * 
 	 * @param position the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &gt; <code>position</code>, or <code>UNBOUND</code>
-	 * @return the smallest position of a non-whitespace character in [<code>position</code>, <code>bound</code>) that resides in a Java partition, or <code>-1</code> if none can be found
+	 * @return the smallest position of a non-whitespace character in [<code>position</code>, <code>bound</code>) that resides in a Java partition, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int findNonWhitespaceForward(int position, int bound) {
 		return scanForward(position, bound, fNonWSDefaultPart);
@@ -601,7 +601,7 @@
 	 * 
 	 * @param position the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &gt; <code>position</code>, or <code>UNBOUND</code>
-	 * @return the smallest position of a non-whitespace character in [<code>position</code>, <code>bound</code>), or <code>-1</code> if none can be found
+	 * @return the smallest position of a non-whitespace character in [<code>position</code>, <code>bound</code>), or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int findNonWhitespaceForwardInAnyPartition(int position, int bound) {
 		return scanForward(position, bound, fNonWS);
@@ -614,7 +614,7 @@
 	 * 
 	 * @param position the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &lt; <code>position</code>, or <code>UNBOUND</code>
-	 * @return the highest position of a non-whitespace character in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>-1</code> if none can be found
+	 * @return the highest position of a non-whitespace character in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int findNonWhitespaceBackward(int position, int bound) {		
 		return scanBackward(position, bound, fNonWSDefaultPart);
@@ -627,7 +627,7 @@
 	 * @param start the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &gt; <code>start</code>, or <code>UNBOUND</code>
 	 * @param condition the <code>StopCondition</code> to check
-	 * @return the lowest position in [<code>start</code>, <code>bound</code>) for which <code>condition</code> holds, or <code>-1</code> if none can be found
+	 * @return the lowest position in [<code>start</code>, <code>bound</code>) for which <code>condition</code> holds, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int scanForward(int start, int bound, StopCondition condition) {
 		Assert.isTrue(start >= 0);
@@ -661,7 +661,7 @@
 	 * @param position the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &gt; <code>position</code>, or <code>UNBOUND</code>
 	 * @param ch the <code>char</code> to search for
-	 * @return the lowest position of <code>ch</code> in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>-1</code> if none can be found
+	 * @return the lowest position of <code>ch</code> in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int scanForward(int position, int bound, char ch) {
 		return scanForward(position, bound, new CharacterMatch(ch));
@@ -675,7 +675,7 @@
 	 * @param position the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &gt; <code>position</code>, or <code>UNBOUND</code>
 	 * @param chars an array of <code>char</code> to search for
-	 * @return the lowest position of a non-whitespace character in [<code>position</code>, <code>bound</code>) that resides in a Java partition, or <code>-1</code> if none can be found
+	 * @return the lowest position of a non-whitespace character in [<code>position</code>, <code>bound</code>) that resides in a Java partition, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int scanForward(int position, int bound, char[] chars) {
 		return scanForward(position, bound, new CharacterMatch(chars));
@@ -688,7 +688,7 @@
 	 * @param start the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &lt; <code>start</code>, or <code>UNBOUND</code>
 	 * @param condition the <code>StopCondition</code> to check
-	 * @return the highest position in (<code>bound</code>, <code>start</code> for which <code>condition</code> holds, or <code>-1</code> if none can be found
+	 * @return the highest position in (<code>bound</code>, <code>start</code> for which <code>condition</code> holds, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int scanBackward(int start, int bound, StopCondition condition) {
 		if (bound == UNBOUND)
@@ -720,7 +720,7 @@
 	 * @param position the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &lt; <code>position</code>, or <code>UNBOUND</code>
 	 * @param ch the <code>char</code> to search for
-	 * @return the highest position of one element in <code>chars</code> in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>-1</code> if none can be found
+	 * @return the highest position of one element in <code>chars</code> in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int scanBackward(int position, int bound, char ch) {
 		return scanBackward(position, bound, new CharacterMatch(ch));
@@ -734,7 +734,7 @@
 	 * @param position the first character position in <code>fDocument</code> to be considered
 	 * @param bound the first position in <code>fDocument</code> to not consider any more, with <code>bound</code> &lt; <code>position</code>, or <code>UNBOUND</code>
 	 * @param chars an array of <code>char</code> to search for
-	 * @return the highest position of one element in <code>chars</code> in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>-1</code> if none can be found
+	 * @return the highest position of one element in <code>chars</code> in (<code>bound</code>, <code>position</code>] that resides in a Java partition, or <code>NOT_FOUND</code> if none can be found
 	 */
 	public int scanBackward(int position, int bound, char[] chars) {
 		return scanBackward(position, bound, new CharacterMatch(chars));
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java
index 2d610de..f1e4636 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/JavaIndenter.java
@@ -37,14 +37,14 @@
 	 * (method defs, array initializers)
 	 */
 	private int fAlign;
-	/** Whether to add one space to the absolute indentation. */
-	private boolean fAlignPlusOne;
 	/** The stateful scanpositionf or the indentation methods. */
 	private int fPosition;
 	/** The previous position. */
 	private int fPreviousPos;
 	/** The most recent token. */
 	private int fToken;
+	/** The line of <code>fPosition</code>. */
+	private int fLine;
 	/** 
 	 * The scanner we will use to scan the document. It has to be installed on the same document
 	 * as the one we get.
@@ -79,6 +79,7 @@
 			
 			boolean danglingElse= false;
 			boolean matchBrace= false;
+			boolean matchParen= false;
 			
 			if (position < fDocument.getLength()) {
 				IRegion line= fDocument.getLineInformationOfOffset(position);
@@ -96,7 +97,7 @@
 			}
 			
 			// find the base position
-			int unit= findReferencePosition(position, danglingElse, matchBrace);
+			int unit= findReferencePosition(position, danglingElse, matchBrace, matchParen);
 			
 			// if we were unable to find anything, return null
 			if (unit == JavaHeuristicScanner.NOT_FOUND)
@@ -133,6 +134,7 @@
 			boolean danglingElse= false;
 			boolean unindent= false;
 			boolean matchBrace= false;
+			boolean matchParen= false;
 			
 			if (position < fDocument.getLength()) {
 				IRegion line= fDocument.getLineInformationOfOffset(position);
@@ -158,13 +160,16 @@
 						break;
 					case Symbols.TokenWHILE:
 						break;
+					case Symbols.TokenRPAREN:
+						matchParen= true;
+						break;
 				}
 			} else {
 				danglingElse= true; // assume an else could come - align with 'if' 
 			}
 			
 			// find the base position
-			int unit= findReferencePosition(position, danglingElse, matchBrace);
+			int unit= findReferencePosition(position, danglingElse, matchBrace, matchParen);
 			
 			// handle special alignment
 			if (fAlign != JavaHeuristicScanner.NOT_FOUND) {
@@ -247,9 +252,6 @@
 				
 				start++;
 			}
-			if (fAlignPlusOne)
-				spaces++;
-			
 			if (spaces == tabLen)
 				ret.append('\t');
 			else
@@ -293,7 +295,7 @@
 	 * @return the reference statement relative to which <code>position</code> should be indented, or {@link JavaHeuristicScanner#NOT_FOUND}
 	 */
 	public int findReferencePosition(int position) {
-		return findReferencePosition(position, false, false);
+		return findReferencePosition(position, false, false, false);
 	}
 	
 	/**
@@ -307,9 +309,10 @@
 	 * @param position the position for which the reference is computed
 	 * @param danglingElse whether a dangling else should be assumed at <code>position</code>
 	 * @param matchBrace whether the position of the matching brace should be returned instead of doing code analysis
+	 * @param matchBrace whether the position of the matching parenthesis should be returned instead of doing code analysis
 	 * @return the reference statement relative to which <code>position</code> should be indented, or {@link JavaHeuristicScanner#NOT_FOUND}
 	 */
-	private int findReferencePosition(int position, boolean danglingElse, boolean matchBrace) {
+	private int findReferencePosition(int position, boolean danglingElse, boolean matchBrace, boolean matchParen) {
 		fIndent= 0; // the indentation modification
 		fAlign= JavaHeuristicScanner.NOT_FOUND;
 		fPosition= position;
@@ -317,18 +320,38 @@
 		boolean indentBlockLess= true; // whether to indent after an if / while / for without block (set false by semicolons and braces)
 		boolean takeNextExit= true; // whether the next possible exit should be taken (instead of looking for the base; see blockless stuff)
 		boolean found= false; // whether we have found anything at all. If we have, we'll trace back to it once we have a hoist point
-		boolean hasBrace= false;
+		boolean hasBrace= false; // whether we have found a left brace
+		boolean longIndentSet= false; // whehter we have already added a deep indentation (to avoid multiple deep / double indents for multiple calls)
+		int listItemPos= JavaHeuristicScanner.NOT_FOUND; // position of the alignment element in a comma separated list
+		int listItemLine= -1; // line of listItemPos
 		
 		if (matchBrace) {
 			if (!skipScope(Symbols.TokenLBRACE, Symbols.TokenRBRACE)) {
 				fPosition= position;
-				fIndent= -1;
+				fIndent= -1; // handle alignment of closing braces
 			} else {
 				indentBlockLess= false;
 				hasBrace= true;
 			}
 		}
 		
+		if (matchParen) {
+			if (!skipScope(Symbols.TokenLPAREN, Symbols.TokenRPAREN)) {
+				fPosition= position;
+				fIndent= 0;
+			} else {
+				int pos= fPosition;
+				fPosition= position;
+				nextToken();
+				if (fToken != Symbols.TokenCOMMA)
+					return pos;
+				
+				fPosition= position;
+				fIndent= 0;
+			}
+		}
+		
+		
 		nextToken();
 		while (true) {
 			
@@ -401,7 +424,7 @@
 					break;
 					
 				case Symbols.TokenQUESTIONMARK: // ternary expressions
-					if (takeNextExit && prefTenaryDeepAlign())
+					if (fAlign == JavaHeuristicScanner.NOT_FOUND && takeNextExit && prefTenaryDeepAlign())
 						fAlign= fPosition;
 					nextToken();
 					break;
@@ -418,10 +441,21 @@
 					if (fToken == Symbols.TokenEQUAL || skipBrackets()) {
 						int first= fScanner.findNonWhitespaceForwardInAnyPartition(searchPos, position);
 						// ... with a first element already defined - take its offset
-						if (prefArrayDeepIndent() && first != JavaHeuristicScanner.NOT_FOUND) {
+						if (fAlign == JavaHeuristicScanner.NOT_FOUND && listItemLine > fLine) {
+							// there are more list items later on - adjust to current usage
+							int lineOffset;
+							try {
+								lineOffset= fDocument.getLineOffset(listItemLine);
+								fAlign= fScanner.findNonWhitespaceForwardInAnyPartition(lineOffset, listItemPos + 1);
+							} catch (BadLocationException e) {
+							}
+						}
+						if (fAlign == JavaHeuristicScanner.NOT_FOUND && prefArrayDeepIndent() && first != JavaHeuristicScanner.NOT_FOUND) {
 							fAlign= first;
-						} else
+						} else if (!longIndentSet) {
 							fIndent += prefArrayIndent();
+							longIndentSet= true;
+						}
 					}
 					
 					hasBrace= true;
@@ -448,6 +482,14 @@
 					nextToken();
 					break;
 				
+				case Symbols.TokenNEW:
+					if (hasBrace && takeNextExit && found) {
+						// we're probably in an array or anonymous class 
+						return fScanner.findNonWhitespaceForward(fPreviousPos, position);
+					}
+					nextToken();
+					break;
+				
 				case Symbols.TokenEOF:
 					if (found)
 						return fScanner.findNonWhitespaceForward(0, position);
@@ -472,30 +514,51 @@
 				// handle method definitions separately
 				case Symbols.TokenLPAREN:
 					// TODO differentiate between conditional continuation and calls
-					if (!hasBrace)
+					
+					// handle list items.
+					if (listItemLine > fLine && fAlign == JavaHeuristicScanner.NOT_FOUND) {
+						// there are more list items later on - adjust to current usage
+						int lineOffset;
+						try {
+							lineOffset= fDocument.getLineOffset(listItemLine);
+							fAlign= fScanner.findNonWhitespaceForwardInAnyPartition(lineOffset, listItemPos + 1);
+						} catch (BadLocationException e) {
+						}
+					}
+					
+					if (!hasBrace && !longIndentSet) {
 						fIndent += prefCallContinuationIndent();
+						longIndentSet= true;
+					}
 					
 					searchPos= fPreviousPos;
 					
-					if (prefMethodDeclDeepIndent() && looksLikeMethodDecl() && found) {
+					if (looksLikeMethodDecl() && found && fAlign == JavaHeuristicScanner.NOT_FOUND && prefMethodDeclDeepIndent()) {
 						fAlign= fScanner.findNonWhitespaceForward(searchPos, position);
 					}
-					
+				
 					break;
 
 				// array dimensions
 				case Symbols.TokenLBRACKET:
-					if (prefArrayDimensionsDeepIndent() && found)
+					if (fAlign == JavaHeuristicScanner.NOT_FOUND && prefArrayDimensionsDeepIndent() && found)
 						fAlign= fScanner.findNonWhitespaceForward(fPreviousPos, position);
 					
-					fIndent+= prefArrayDimensionIndent();
+					if (!longIndentSet) {
+						fIndent+= prefArrayDimensionIndent();
+						longIndentSet= true;
+					}
 						
 					nextToken();
 					break;
 				
 				case Symbols.TokenCOMMA:
-					if (found)
-						fScanner.findNonWhitespaceForward(fPreviousPos, position);
+					// align with comma list except for when in a method declaration
+					if (found && listItemPos == JavaHeuristicScanner.NOT_FOUND) {
+						listItemPos= fScanner.findNonWhitespaceForwardInAnyPartition(fPreviousPos, position);
+						listItemLine= fLine;
+					}
+					
 					nextToken();
 					break;
 
@@ -676,6 +739,11 @@
 		fToken= fScanner.previousToken(start - 1, JavaHeuristicScanner.UNBOUND);
 		fPreviousPos= start;
 		fPosition= fScanner.getPosition() + 1;
+		try {
+			fLine= fDocument.getLineOfOffset(fPosition);
+		} catch (BadLocationException e) {
+			fLine= -1;
+		}
 	}
 
 	/**