diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
index c135656..98dd204 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanExpansionQuery.java
@@ -8,174 +8,291 @@
 import org.apache.lucene.index.TermContext;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.Spans;
+import org.apache.lucene.search.spans.TermSpans;
 import org.apache.lucene.util.Bits;
 
-// Temporary:
 import de.ids_mannheim.korap.query.spans.ExpandedExclusionSpans;
 import de.ids_mannheim.korap.query.spans.ExpandedSpans;
 
-/** Query to make a span longer by stretching out the start or the end 
- * 	position of the span. The constraints of the expansion, such as how 
- * 	large the expansion should be (min and max position) and the 
- * 	direction of the expansion with respect to the "main" span, are 
- * 	specified in ExpansionConstraint.
+/**
+ * SpanExpansionQuery makes a span longer by stretching out the start or the end
+ * position of the span. The constraints of the expansion, such as how large the
+ * expansion should be (min and max position) and the direction of the expansion
+ * with respect to the original span, are specified in ExpansionConstraint.
  * 
- * 	The expansion can be specified to not contain any direct/immediate
- * 	/adjacent occurrence(s) of another span. Examples:
- * 		[orth=der][orth!=Baum] 		"der" cannot be followed by "Baum" 
- * 		[pos!=ADJ]{1,2}[orth=Baum]	one or two adjectives cannot precedes 
- * 									"Baum"
+ * <pre>
+ * SpanTermQuery stq = new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:lightning&quot;));
+ * SpanExpansionQuery seq = new SpanExpansionQuery(stq, 0, 2, -1, true);
+ * </pre>
  * 
- *  The offsets of the expansion parts can be collected by using a class 
- *  number. 
+ * In the example above, the SpanExpansionQuery describes that the
+ * {@link TermSpans} of "lightning" may be expanded up to two token positions to
+ * the left.
  * 
- * 	@author margaretha
+ * <pre>
+ * &quot;Trees are often struck by lightning because they are natural lightning conductors to the ground.&quot;
+ * </pre>
+ * 
+ * The matches for the sample text are:
+ * 
+ * <pre>
+ * [struck by lightning]
+ * [by lightning]
+ * [lightning]
+ * [are natural lightning]
+ * [natural lightning]
+ * [lightning]
+ * </pre>
+ * 
+ * The expansion can also be specified to <em>not</em> contain any
+ * direct/immediate /adjacent occurrence(s) of another span. Examples in
+ * Poliqarp:
+ * 
+ * <pre>
+ * 	[orth=the][orth!=lightning]         "the" must not be followed by "lightning" 
+ * 	[pos!=ADJ]{1,2}[orth=lightning]	    one or two adjectives cannot precedes "lightning"
+ * </pre>
+ * 
+ * The positions of the expansion parts can be stored in payloads by using a
+ * class number (optional).
+ * 
+ * @author margaretha
  * */
-public class SpanExpansionQuery extends SimpleSpanQuery{
-	 
-	private int min, max; // min, max expansion position
-	
-	// if > 0, collect expansion offsets using this label
-	private byte classNumber;
-	
-	// expansion direction with regard to the main span: 
-	// < 0 	to the left of main span 
-	// >= 0  to the right of main span
-	private int direction;	
-	
-	// if true, no occurrence of another span
-	final boolean isExclusion; 
-	
-	/** Simple expansion for any/empty token. Use 
-	 * 	{@link #SpanExpansionQuery(SpanQuery, SpanQuery, ExpansionConstraint, 
-	 * 	boolean)} for expansion with exclusions of a specific spanquery. 
-	 * */
-	public SpanExpansionQuery(SpanQuery firstClause, int min, int max, int direction, 
-			boolean collectPayloads) {
-		super(firstClause, collectPayloads);
-		if (max < min){
-			throw new IllegalArgumentException("The max position has to be " +
-					"bigger than or the same as min position.");
-		}
-		this.min = min;
-		this.max = max;
-		this.direction = direction;
-		this.isExclusion = false;
-	}
-	
-	public SpanExpansionQuery(SpanQuery firstClause, int min, int max, int direction, 
-			byte classNumber, boolean collectPayloads) {
-		this(firstClause, min, max, direction, collectPayloads);		
-		this.classNumber = classNumber;
-	}
-	
-	/** Expansion with exclusions of the spanquery specified as the second 
-	 * 	parameter.
-	 * */
-	public SpanExpansionQuery(SpanQuery firstClause, SpanQuery notClause, int min, 
-			int max, int direction, boolean collectPayloads) {
-		super(firstClause, notClause, collectPayloads);
-		if (max < min){
-			throw new IllegalArgumentException("The max position has to be " +
-					"bigger than or the same as min position.");
-		}
-		this.min = min;
-		this.max = max;
-		this.direction = direction;
-		this.isExclusion = true;
-	}
-	
-	public SpanExpansionQuery(SpanQuery firstClause, SpanQuery notClause, int min, 
-			int max, int direction, byte classNumber, boolean collectPayloads) {
-		this(firstClause, notClause, min, max, direction, collectPayloads);
-		this.classNumber = classNumber;
-	}
-	
-	
-	@Override
-	public SimpleSpanQuery clone() {
-		SpanExpansionQuery sq = null;
-		if (isExclusion){
-			sq = new SpanExpansionQuery(firstClause, secondClause, min, max, direction, 
-					classNumber, collectPayloads);
-		}
-		else{
-			sq = new SpanExpansionQuery(firstClause, min, max, direction, classNumber,
-					collectPayloads);
-		}
-		//sq.setBoost(sq.getBoost());
-		return sq;
-	}
+public class SpanExpansionQuery extends SimpleSpanQuery {
 
-	@Override
-	public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
-			Map<Term, TermContext> termContexts) throws IOException {		 
-	    
-//	      Temporary:
-		if (isExclusion)
-			return new ExpandedExclusionSpans(this, context, acceptDocs, termContexts);		
-		else
-	    
-			return new ExpandedSpans(this, context, acceptDocs, termContexts);
-	}
+    private int min, max; // min, max expansion position
 
-	@Override
-	public String toString(String field) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("spanExpansion(");
-		sb.append(firstClause.toString());
-		if (isExclusion && secondClause != null){
-			sb.append(", !");
-			sb.append(secondClause.toString());
-		}
-		else{
-			sb.append(", []");
-		}
-		sb.append("{");
-		sb.append(min);
-		sb.append(", ");
-		sb.append(max);
-		sb.append("}, ");		
-		if (direction < 0)
-			sb.append("left");
-		else sb.append("right");
-		if (classNumber > 0){
-			sb.append(", class:");
-			sb.append(classNumber);			
-		}
-		sb.append(")");
-		return sb.toString();
-	}
+    // if > 0, collect expansion offsets using this label
+    private byte classNumber;
 
-	public int getMin() {
-		return min;
-	}
+    // expansion direction with regard to the main span: 
+    // < 0 	to the left of main span 
+    // >= 0  to the right of main span
+    private int direction;
 
-	public void setMin(int min) {
-		this.min = min;
-	}
+    // if true, no occurrence of another span
+    final boolean isExclusion;
 
-	public int getMax() {
-		return max;
-	}
+    /**
+     * Constructs a SpanExpansionQuery for simple expansion of the specified
+     * {@link SpanQuery}.
+     * 
+     * @param firstClause a {@link SpanQuery}
+     * @param min the minimum length of the expansion
+     * @param max the maximum length of the expansion
+     * @param direction the direction of the expansion
+     * @param collectPayloads a boolean flag representing the value
+     *        <code>true</code> if payloads are to be collected, otherwise
+     *        <code>false</code>.
+     */
+    public SpanExpansionQuery(SpanQuery firstClause, int min, int max,
+            int direction, boolean collectPayloads) {
+        super(firstClause, collectPayloads);
+        if (max < min) {
+            throw new IllegalArgumentException("The max position has to be "
+                    + "bigger than or the same as min position.");
+        }
+        this.min = min;
+        this.max = max;
+        this.direction = direction;
+        this.isExclusion = false;
+    }
 
-	public void setMax(int max) {
-		this.max = max;
-	}
+    /**
+     * Constructs a SpanExpansionQuery for simple expansion of the specified
+     * {@link SpanQuery} and stores expansion offsets in payloads associated
+     * with the given class number.
+     * 
+     * @param firstClause a {@link SpanQuery}
+     * @param min the minimum length of the expansion
+     * @param max the maximum length of the expansion
+     * @param direction the direction of the expansion
+     * @param classNumber the class number for storing expansion offsets in
+     *        payloads
+     * @param collectPayloads a boolean flag representing the value
+     *        <code>true</code> if payloads are to be collected, otherwise
+     *        <code>false</code>.
+     */
+    public SpanExpansionQuery(SpanQuery firstClause, int min, int max,
+            int direction, byte classNumber, boolean collectPayloads) {
+        this(firstClause, min, max, direction, collectPayloads);
+        this.classNumber = classNumber;
+    }
 
-	public byte getClassNumber() {
-		return classNumber;
-	}
+    /**
+     * Constructs a SpanExpansionQuery for expansion of the first
+     * {@link SpanQuery} with exclusions of the second {@link SpanQuery}.
+     * 
+     * @param firstClause the SpanQuery to be expanded
+     * @param notClause the SpanQuery to be excluded
+     * @param min the minimum length of the expansion
+     * @param max the maximum length of the expansion
+     * @param direction the direction of the expansion
+     * @param collectPayloads a boolean flag representing the value
+     *        <code>true</code> if payloads are to be collected, otherwise
+     *        <code>false</code>.
+     */
+    public SpanExpansionQuery(SpanQuery firstClause, SpanQuery notClause,
+            int min, int max, int direction, boolean collectPayloads) {
+        super(firstClause, notClause, collectPayloads);
+        if (max < min) {
+            throw new IllegalArgumentException("The max position has to be "
+                    + "bigger than or the same as min position.");
+        }
+        this.min = min;
+        this.max = max;
+        this.direction = direction;
+        this.isExclusion = true;
+    }
 
-	public void setClassNumber(byte classNumber) {
-		this.classNumber = classNumber;
-	}
+    /**
+     * Constructs a SpanExpansionQuery for expansion of the first
+     * {@link SpanQuery} with exclusions of the second {@link SpanQuery}, and
+     * stores expansion offsets in payloads associated with the given class
+     * number.
+     * 
+     * @param firstClause the SpanQuery to be expanded
+     * @param notClause the SpanQuery to be excluded
+     * @param min the minimum length of the expansion
+     * @param max the maximum length of the expansion
+     * @param direction the direction of the expansion
+     * @param classNumber the class number for storing expansion offsets in
+     *        payloads
+     * @param collectPayloads a boolean flag representing the value
+     *        <code>true</code> if payloads are to be collected, otherwise
+     *        <code>false</code>.
+     */
+    public SpanExpansionQuery(SpanQuery firstClause, SpanQuery notClause,
+            int min, int max, int direction, byte classNumber,
+            boolean collectPayloads) {
+        this(firstClause, notClause, min, max, direction, collectPayloads);
+        this.classNumber = classNumber;
+    }
 
-	public int getDirection() {
-		return direction;
-	}
+    @Override
+    public SimpleSpanQuery clone() {
+        SpanExpansionQuery sq = null;
+        if (isExclusion) {
+            sq = new SpanExpansionQuery(firstClause, secondClause, min, max,
+                    direction, classNumber, collectPayloads);
+        } else {
+            sq = new SpanExpansionQuery(firstClause, min, max, direction,
+                    classNumber, collectPayloads);
+        }
+        //sq.setBoost(sq.getBoost());
+        return sq;
+    }
 
-	public void setDirection(int direction) {
-		this.direction = direction;
-	}
+    @Override
+    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+
+        //	      Temporary:
+        if (isExclusion)
+            return new ExpandedExclusionSpans(this, context, acceptDocs,
+                    termContexts);
+        else
+
+            return new ExpandedSpans(this, context, acceptDocs, termContexts);
+    }
+
+    @Override
+    public String toString(String field) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("spanExpansion(");
+        sb.append(firstClause.toString());
+        if (isExclusion && secondClause != null) {
+            sb.append(", !");
+            sb.append(secondClause.toString());
+        } else {
+            sb.append(", []");
+        }
+        sb.append("{");
+        sb.append(min);
+        sb.append(", ");
+        sb.append(max);
+        sb.append("}, ");
+        if (direction < 0)
+            sb.append("left");
+        else
+            sb.append("right");
+        if (classNumber > 0) {
+            sb.append(", class:");
+            sb.append(classNumber);
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+
+    /**
+     * Returns the minimum length of the expansion.
+     * 
+     * @return the minimum length of the expansion
+     */
+    public int getMin() {
+        return min;
+    }
+
+    /**
+     * Sets the minimum length of the expansion.
+     * 
+     * @param min the minimum length of the expansion
+     */
+    public void setMin(int min) {
+        this.min = min;
+    }
+
+    /**
+     * Returns the maximum length of the expansion.
+     * 
+     * @return the maximum length of the expansion
+     */
+    public int getMax() {
+        return max;
+    }
+
+    /**
+     * Sets the maximum length of the expansion.
+     * 
+     * @param max the maximum length of the expansion
+     */
+    public void setMax(int max) {
+        this.max = max;
+    }
+
+    /**
+     * Returns the class number associated with the expansion offsets
+     * 
+     * @return the class number associated with the expansion offsets
+     */
+    public byte getClassNumber() {
+        return classNumber;
+    }
+
+    /**
+     * Sets the class number associated with the expansion offsets
+     * 
+     * @param classNumber the class number associated with the expansion offsets
+     */
+    public void setClassNumber(byte classNumber) {
+        this.classNumber = classNumber;
+    }
+
+    /**
+     * Returns the direction of the expansion
+     * 
+     * @return the direction of the expansion
+     */
+    public int getDirection() {
+        return direction;
+    }
+
+    /**
+     * Sets the direction of the expansion
+     * 
+     * @param direction the direction of the expansion
+     */
+    public void setDirection(int direction) {
+        this.direction = direction;
+    }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
index 122a65b..d77a4bb 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanNextQuery.java
@@ -3,133 +3,160 @@
 // Based on SpanNearQuery
 
 /*
-  Todo: Make one Spanarray and switch between the results of A and B.
-*/
+ * Todo: Make one Spanarray and switch between the results of A and B.
+ */
 
 import java.io.IOException;
 import java.util.Map;
 
 import org.apache.lucene.index.AtomicReaderContext;
 import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.search.Query;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermContext;
+import org.apache.lucene.search.Query;
 import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.search.spans.Spans;
+import org.apache.lucene.search.spans.TermSpans;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.ToStringUtils;
 
-
 import de.ids_mannheim.korap.query.spans.NextSpans;
 
 /**
- * Matches spans which are directly next to each other. 
- *  this is identical to a phrase query with exactly two clauses. 
+ * SpanNextQuery matches two spans which are directly next to each other. It is
+ * identical to a phrase query with exactly two clauses.
+ * 
+ * In the example below, the SpanNextQuery retrieves {@link NextSpans} starting
+ * from the start position of {@link TermSpans} "turn" and ending at the end
+ * position of {@link TermSpans} "off" occurring immediately after the
+ * {@link TermSpans} "turn".
+ * 
+ * <pre>
+ * SpanNextQuery sq = new SpanNextQuery(
+ *      new SpanTermQuery(new Term(&quot;tokens&quot;,&quot;s:turn&quot;)), 
+ *      new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:off&quot;)));
+ * </pre>
+ * 
+ * @author diewald, margaretha
+ * 
  */
 public class SpanNextQuery extends SimpleSpanQuery implements Cloneable {
 
-	// Constructor
+    /**
+     * Constructs a SpanNextQuery for the two specified {@link SpanQuery
+     * SpanQueries} whose payloads are to be collected for the resulting
+     * {@link NextSpans}. The first SpanQuery is immediately followed by the
+     * second SpanQuery.
+     * 
+     * @param firstClause the first SpanQuery
+     * @param secondClause the second SpanQuery
+     */
     public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause) {
-    	this(firstClause, secondClause, true);
+        this(firstClause, secondClause, true);
     };
 
-    // Constructor  
+    /**
+     * Constructs a SpanNextQuery for the two specified {@link SpanQuery
+     * SpanQueries} where the first SpanQuery is immediately followed by the
+     * second SpanQuery.
+     * 
+     * @param firstClause the first SpanQuery
+     * @param secondClause the second SpanQuery
+     * @param collectPayloads a boolean flag representing the value
+     *        <code>true</code> if payloads are to be collected, otherwise
+     *        <code>false</code>.
+     */
     public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause,
-		boolean collectPayloads) {   
-    	super(firstClause, secondClause, collectPayloads);
+            boolean collectPayloads) {
+        super(firstClause, secondClause, collectPayloads);
     };
 
-    public SpanNextQuery(SpanQuery firstClause, SpanQuery secondClause, 
-    		boolean isFirstNegated, boolean collectPayloads) {   
-    	super(firstClause, secondClause, collectPayloads);
-    }
-    
-    
     @Override
-    public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs,
-		   Map<Term,TermContext> termContexts) throws IOException {	
-		return (Spans) new NextSpans (this, context, acceptDocs, termContexts);
+    public Spans getSpans(final AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+        return (Spans) new NextSpans(this, context, acceptDocs, termContexts);
     };
 
     @Override
     public SpanNextQuery clone() {
-	SpanNextQuery spanNextQuery = new SpanNextQuery(
-	    (SpanQuery) firstClause.clone(),
-	    (SpanQuery) secondClause.clone(),
-	    collectPayloads
-        );
-	spanNextQuery.setBoost(getBoost());
-	return spanNextQuery;
+        SpanNextQuery spanNextQuery = new SpanNextQuery(
+                (SpanQuery) firstClause.clone(),
+                (SpanQuery) secondClause.clone(), collectPayloads);
+        spanNextQuery.setBoost(getBoost());
+        return spanNextQuery;
     };
-   
 
     /*
      * Rewrite query in case it includes regular expressions or wildcards
      */
     @Override
-    public Query rewrite (IndexReader reader) throws IOException {
-	SpanNextQuery clone = null;
+    public Query rewrite(IndexReader reader) throws IOException {
+        SpanNextQuery clone = null;
 
-	// Does the first clause needs a rewrite?
-	SpanQuery query = (SpanQuery) firstClause.rewrite(reader);
-	if (query != firstClause) {
-	    if (clone == null)
-		clone = this.clone();
-	    clone.firstClause = query;
-	};
+        // Does the first clause needs a rewrite?
+        SpanQuery query = (SpanQuery) firstClause.rewrite(reader);
+        if (query != firstClause) {
+            if (clone == null)
+                clone = this.clone();
+            clone.firstClause = query;
+        }
+        ;
 
-	// Does the second clause needs a rewrite?
-	query = (SpanQuery) secondClause.rewrite(reader);
-	if (query != secondClause) {
-	    if (clone == null)
-		clone = this.clone();
-	    clone.secondClause = query;
-	};
+        // Does the second clause needs a rewrite?
+        query = (SpanQuery) secondClause.rewrite(reader);
+        if (query != secondClause) {
+            if (clone == null)
+                clone = this.clone();
+            clone.secondClause = query;
+        }
+        ;
 
-	// There is a clone and it is important
-	if (clone != null)
-	    return clone;
+        // There is a clone and it is important
+        if (clone != null)
+            return clone;
 
-	return this;
+        return this;
     };
 
- 
     @Override
-	public String toString(String field) {
-		StringBuilder sb = new StringBuilder();
-		sb.append("spanNext(");
-		sb.append(firstClause.toString(field));
-	        sb.append(", ");
-		sb.append(secondClause.toString(field));
-		sb.append(")");
-		sb.append(ToStringUtils.boost(getBoost()));
-		return sb.toString();	
+    public String toString(String field) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("spanNext(");
+        sb.append(firstClause.toString(field));
+        sb.append(", ");
+        sb.append(secondClause.toString(field));
+        sb.append(")");
+        sb.append(ToStringUtils.boost(getBoost()));
+        return sb.toString();
     }
 
-
     /** Returns true iff <code>o</code> is equal to this. */
     @Override
     public boolean equals(Object o) {
-	if (this == o) return true;
-	if (!(o instanceof SpanNextQuery)) return false;
-	
-	final SpanNextQuery spanNextQuery = (SpanNextQuery) o;
-	
-	if (collectPayloads != spanNextQuery.collectPayloads) return false;
-	if (!firstClause.equals(spanNextQuery.firstClause)) return false;
-	if (!secondClause.equals(spanNextQuery.secondClause)) return false;
+        if (this == o)
+            return true;
+        if (!(o instanceof SpanNextQuery))
+            return false;
 
-	return getBoost() == spanNextQuery.getBoost();
+        final SpanNextQuery spanNextQuery = (SpanNextQuery) o;
+
+        if (collectPayloads != spanNextQuery.collectPayloads)
+            return false;
+        if (!firstClause.equals(spanNextQuery.firstClause))
+            return false;
+        if (!secondClause.equals(spanNextQuery.secondClause))
+            return false;
+
+        return getBoost() == spanNextQuery.getBoost();
     };
 
-
     // I don't know what I am doing here
     @Override
     public int hashCode() {
-	int result;
-	result = firstClause.hashCode() + secondClause.hashCode();
-	result ^= (result << 31) | (result >>> 2);  // reversible
-	result += Float.floatToRawIntBits(getBoost());
-	return result;
+        int result;
+        result = firstClause.hashCode() + secondClause.hashCode();
+        result ^= (result << 31) | (result >>> 2); // reversible
+        result += Float.floatToRawIntBits(getBoost());
+        return result;
     };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
index 94b273b..9ea420f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanRepetitionQuery.java
@@ -13,68 +13,119 @@
 
 import de.ids_mannheim.korap.query.spans.RepetitionSpans;
 
-/** SpanRepetitionQuery means that the given query can appears 
- * 	multiple times specified by the minimum and the maximum number 
- * 	of repetitions parameters.
+/**
+ * SpanRepetitionQuery means that the given SpanQuery must appears multiple
+ * times in a sequence. The number of repetition depends on the minimum and the
+ * maximum number parameters. <br />
+ * <br />
+ * 
+ * In the example below, SpanRepetitionQuery retrieves {@link RepetitionSpans}
+ * consisting of the TermSpans "tt:p/ADJ" that must appear at least once or
+ * consecutively two times. What appears after the RepetitionSpans is not
+ * considered, so it is possible that it is another "tt:p/ADJ". <br />
+ * <br />
+ * 
+ * <pre>
+ * SpanRepetitionQuery sq = new SpanRepetitionQuery(new SpanTermQuery(new Term(
+ *         &quot;tokens&quot;, &quot;tt:p/ADJ&quot;)), 1, 2, true);
+ * </pre>
+ * 
+ * For instance, "a large black leather jacket" contains the following matches.
+ * 
+ * <pre>
+ *  [large]
+ *  [large black]
+ *  [black]
+ *  [black leather]
+ *  [leather]
+ * </pre>
  * 
  * @author margaretha
  * */
-public class SpanRepetitionQuery extends SimpleSpanQuery{
-	
-	private int min, max;
-	
-	public SpanRepetitionQuery(SpanQuery sq, int min, int max,
-			boolean collectPayloads) {
-		super(sq, collectPayloads);
-		this.min = min;
-		this.max = max;
-	}
+public class SpanRepetitionQuery extends SimpleSpanQuery {
 
-	@Override
-	public SimpleSpanQuery clone() {
-		SpanRepetitionQuery sq = new SpanRepetitionQuery(
-				(SpanQuery) this.firstClause.clone(), 
-				this.min, 
-				this.max, 
-				this.collectPayloads);
-		sq.setBoost(getBoost());
-		return sq;
-	}
+    private int min, max;
 
-	@Override
-	public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
-			Map<Term, TermContext> termContexts) throws IOException {
-		return new RepetitionSpans(this, context, acceptDocs, termContexts);
-	}
+    /**
+     * Constructs a SpanRepetitionQuery for the given {@link SpanQuery}.
+     * 
+     * @param sq a SpanQuery
+     * @param min the minimum number of the required repetition
+     * @param max the maximum number of the required repetition
+     * @param collectPayloads a boolean flag representing the value
+     *        <code>true</code> if payloads are to be collected, otherwise
+     *        <code>false</code>.
+     */
+    public SpanRepetitionQuery(SpanQuery sq, int min, int max,
+            boolean collectPayloads) {
+        super(sq, collectPayloads);
+        this.min = min;
+        this.max = max;
+    }
 
-	@Override
-	public String toString(String field) {
-		StringBuilder sb = new StringBuilder();		
-		sb.append("spanRepetition(");
-		sb.append(firstClause.toString(field));
-		sb.append("{");
-		sb.append(min);
-		sb.append(",");
-		sb.append(max);
-		sb.append("})");
-		sb.append(ToStringUtils.boost(getBoost()));
-		return sb.toString();
-	}
+    @Override
+    public SimpleSpanQuery clone() {
+        SpanRepetitionQuery sq = new SpanRepetitionQuery(
+                (SpanQuery) this.firstClause.clone(), this.min, this.max,
+                this.collectPayloads);
+        sq.setBoost(getBoost());
+        return sq;
+    }
 
-	public int getMin() {
-		return min;
-	}
+    @Override
+    public Spans getSpans(AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+        return new RepetitionSpans(this, context, acceptDocs, termContexts);
+    }
 
-	public void setMin(int min) {
-		this.min = min;
-	}
+    @Override
+    public String toString(String field) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("spanRepetition(");
+        sb.append(firstClause.toString(field));
+        sb.append("{");
+        sb.append(min);
+        sb.append(",");
+        sb.append(max);
+        sb.append("})");
+        sb.append(ToStringUtils.boost(getBoost()));
+        return sb.toString();
+    }
 
-	public int getMax() {
-		return max;
-	}
+    /**
+     * Returns the minimum number of required repetitions.
+     * 
+     * @return the minimum number of required repetitions
+     */
+    public int getMin() {
+        return min;
+    }
 
-	public void setMax(int max) {
-		this.max = max;
-	}
-	
+    /**
+     * Sets the minimum number of required repetitions.
+     * 
+     * @param min the minimum number of required repetitions
+     */
+    public void setMin(int min) {
+        this.min = min;
+    }
+
+    /**
+     * Returns the maximum number of required repetitions.
+     * 
+     * @return the maximum number of required repetitions
+     */
+    public int getMax() {
+        return max;
+    }
+
+    /**
+     * Sets the maximum number of required repetitions.
+     * 
+     * @param max the maximum number of required repetitions
+     */
+    public void setMax(int max) {
+        this.max = max;
+    }
+
 }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
index 286e239..57d3b76 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanSegmentQuery.java
@@ -18,17 +18,16 @@
  * positions, for instance:
  * 
  * <pre>
- * sq = new SpanSegmentQuery(
-            new SpanTermQuery(new Term("tokens","s:Hund")),
-            new SpanTermQuery(new Term("tokens","tt/p:NN"))
-       );
+ * sq = new SpanSegmentQuery(new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;s:Hund&quot;)),
+ *         new SpanTermQuery(new Term(&quot;tokens&quot;, &quot;tt/p:NN&quot;)));
  * </pre>
+ * 
  * @author margaretha
  * */
 public class SpanSegmentQuery extends SimpleSpanQuery {
 
     /**
-     * Creates a SpanSegmentQuery from the two given SpanQueries, by default
+     * Constructs a SpanSegmentQuery from the two given SpanQueries, by default
      * payloads are to be collected.
      * 
      * @param firstClause a {@link SpanQuery}
@@ -39,6 +38,8 @@
     }
 
     /**
+     * Constructs a SpanSegmentQuery from the two given SpanQueries.
+     * 
      * @param firstClause a {@link SpanQuery}
      * @param secondClause a {@link SpanQuery}
      * @param collectPayloads a boolean flag representing the value
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
index 182942a..2d79132 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/NextSpans.java
@@ -35,7 +35,7 @@
     /**
      * Constructs NextSpans for the given {@link SpanNextQuery}.
      * 
-     * @param spanNextQuery
+     * @param spanNextQuery a SpanNextQuery
      * @param context
      * @param acceptDocs
      * @param termContexts
@@ -75,11 +75,6 @@
                 matchEndPosition = matchList.get(0).getEnd();
                 if (collectPayloads)
                     matchPayload.addAll(matchList.get(0).getPayloads());
-                //System.out.println(this.toString());
-                /*
-                 * System.out.println("Match positions "+
-                 * matchStartPosition+","+ matchEndPosition);
-                 */
                 matchList.remove(0);
                 return true;
             }
@@ -115,8 +110,9 @@
     }
 
     /**
-     * Finds all candidates whose start position is the same as the firstspan's
-     * end position.
+     * Removes all second span candidates whose start position is not the same
+     * as the firstspan's end position, otherwise creates a match and add it to
+     * the matchlist.
      * 
      * @throws IOException
      */
@@ -128,13 +124,17 @@
             if (cs.getStart() == firstSpans.end()) {
                 addMatch(cs);
             } else {
-                //System.out.println(cs.getStart() + " " +firstSpans.end());
                 i.remove();
             }
         }
     }
 
     /**
+     * Finds all secondspans whose start position is the same as the end
+     * position of the firstspans, until the secondspans' start position is
+     * bigger than the firstspans' end position. Adds those secondspans to the
+     * candidateList and creates matches.
+     * 
      * @throws IOException
      */
     private void searchMatches() throws IOException {
@@ -151,6 +151,14 @@
         }
     }
 
+    /**
+     * Creates a match from the given CandidateSpan representing a secondspan
+     * state whose start position is identical to the end position of the
+     * current firstspan, and adds it to the matchlist.
+     * 
+     * @param cs a CandidateSpan
+     * @throws IOException
+     */
     private void addMatch(CandidateSpan cs) throws IOException {
 
         int start = firstSpans.start();
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
index 6019125..f66d78c 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/RepetitionSpans.java
@@ -11,184 +11,208 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermContext;
 import org.apache.lucene.util.Bits;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import de.ids_mannheim.korap.query.SpanRepetitionQuery;
 
-/**	Enumeration of spans occurring multiple times in a sequence.
- * 	The number of min and max repetition can be set. 
- *   
- * 	@author margaretha
+/**
+ * Enumeration of spans occurring multiple times in a sequence. The number of
+ * repetition depends on the min and max parameters.
+ * 
+ * @author margaretha
  * */
-public class RepetitionSpans extends SimpleSpans{
-	
-	private int min,max;
-	private long matchCost;
-	private List<CandidateSpan> matchList;
-	private Logger log = LoggerFactory.getLogger(RepetitionSpans.class);
-    // This advices the java compiler to ignore all loggings
-    public static final boolean DEBUG = false;
+public class RepetitionSpans extends SimpleSpans {
 
+    private int min, max;
+    private long matchCost;
+    private List<CandidateSpan> matchList;
 
-	public RepetitionSpans(SpanRepetitionQuery query,
-			AtomicReaderContext context, Bits acceptDocs,
-			Map<Term, TermContext> termContexts) 
-			throws IOException {
-		super(query, context, acceptDocs, termContexts);
-		this.min = query.getMin();
-		this.max = query.getMax();
-		matchList = new ArrayList<CandidateSpan>();
-		hasMoreSpans = firstSpans.next();
-	}
+    /**
+     * Constructs RepetitionSpans from the given {@link SpanRepetitionQuery}.
+     * 
+     * @param query a SpanRepetitionQuery
+     * @param context
+     * @param acceptDocs
+     * @param termContexts
+     * @throws IOException
+     */
+    public RepetitionSpans(SpanRepetitionQuery query,
+            AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+        super(query, context, acceptDocs, termContexts);
+        this.min = query.getMin();
+        this.max = query.getMax();
+        matchList = new ArrayList<CandidateSpan>();
+        hasMoreSpans = firstSpans.next();
+    }
 
-	@Override
-	public boolean next() throws IOException {
-		isStartEnumeration = false;
-		matchPayload.clear();
-		return advance();
-	}
+    @Override
+    public boolean next() throws IOException {
+        isStartEnumeration = false;
+        matchPayload.clear();
+        return advance();
+    }
 
-	/** Get the next span from the candidate match list, or set it first when
-	 * 	it is empty.
-	 * */
-	private boolean advance() throws IOException {
+    /**
+     * Advances the RepetitionSpans to the next match by setting the first
+     * element in the matchlist as the current match. When the matchlist is
+     * empty, it has to be set first.
+     * 
+     * @return <code>true</code> if a match is found, <code>false</code>
+     *         otherwise.
+     * @throws IOException
+     */
+    private boolean advance() throws IOException {
 
-		while (hasMoreSpans  || !matchList.isEmpty()){
-			if (!matchList.isEmpty()){			
-				setMatchProperties(matchList.get(0));
-				matchList.remove(0);
-				return true;
-			}			
-			matchCost = 0;
-			
-			List<CandidateSpan> adjacentSpans = collectAdjacentSpans();
-			setMatchList(adjacentSpans);
-		}	
-		return false;
-	}
-	
-	/** Collect all adjacent spans occurring in a sequence.
-	 * 	@return a list of the adjacent spans 
-	 * */
-	private List<CandidateSpan> collectAdjacentSpans() throws IOException {
-		
-		CandidateSpan startSpan = new CandidateSpan(firstSpans);
-		
-		List<CandidateSpan> adjacentSpans = new ArrayList<CandidateSpan>();
-		adjacentSpans.add(startSpan);
-		
-		CandidateSpan prevSpan = startSpan;
-		
-		while ((hasMoreSpans = firstSpans.next()) &&
-			startSpan.getDoc() == firstSpans.doc() ){
-			
-			if (firstSpans.start() > prevSpan.getEnd()){
-				break;
-			}
-			else if (firstSpans.start() == prevSpan.getEnd()){
-				prevSpan = new CandidateSpan(firstSpans);
-				adjacentSpans.add(prevSpan);
-			}
-		}		
-		return 	adjacentSpans;	
-	}
-	
-	/** Generate all possible repetition candidate spans from the adjacent spans 
-	 * 	and add them to the match list. 
-	 * */
-	private void setMatchList(List<CandidateSpan> adjacentSpans){
-		CandidateSpan startSpan, endSpan, matchSpan;
-		for (int i=min; i<max+1; i++){
-			//System.out.println("num: "+i);			
-			int j=0; 
-			int endIndex;
-			while ((endIndex = j+i-1) < adjacentSpans.size()){
-				startSpan = adjacentSpans.get(j);
-				if (i == 1){					
-					try {
-						matchSpan = startSpan.clone();
-						matchSpan.setPayloads(computeMatchPayload(adjacentSpans, 0, endIndex-1));
-						matchList.add(matchSpan);		
-					} catch (CloneNotSupportedException e) {
-						e.printStackTrace();
-					}
-				}
-				else {
-					endSpan = adjacentSpans.get(endIndex);														
-					matchSpan = new CandidateSpan(
-							startSpan.getStart(), 
-							endSpan.getEnd(), 
-							startSpan.getDoc(), 
-							computeMatchCost(adjacentSpans, 0, endIndex), 
-							computeMatchPayload(adjacentSpans, 0, endIndex));
-					
-					//System.out.println("c:"+matchSpan.getCost() +" p:"+ matchSpan.getPayloads().size());
-					//System.out.println(startSpan.getStart() +","+endSpan.getEnd());
-					
-					matchList.add(matchSpan);
-				}
-				j++;
-			}			
-		}
-		
-		Collections.sort(matchList);
-	}
-	
-	/** Add all the payloads of a candidate span
-	 * */
-	private Collection<byte[]> computeMatchPayload(
-			List<CandidateSpan> adjacentSpans, int start, int end) {
-		Collection<byte[]> payload = new ArrayList<byte[]>();
-		for (int i=start; i<= end; i++){
-			payload.addAll(adjacentSpans.get(i).getPayloads());
-		}
-		return payload;
-	}
+        while (hasMoreSpans || !matchList.isEmpty()) {
+            if (!matchList.isEmpty()) {
+                setMatchProperties(matchList.get(0));
+                matchList.remove(0);
+                return true;
+            }
+            matchCost = 0;
 
-	/** Add all the cost of a candidate span
-	 * */
-	private long computeMatchCost(List<CandidateSpan> adjacentSpans, 
-			int start, int end){		
-		long matchCost = 0;
-		for (int i=start; i<= end; i++){
-			CandidateSpan c = adjacentSpans.get(i);
-			matchCost += adjacentSpans.get(i).getCost();
-		}		
-		return matchCost;
-	}
-	
-	
-	/** Setting match properties from the candidate span
-	 * */	
-	private void setMatchProperties(CandidateSpan candidateSpan) 
-			throws IOException {
-	    matchDocNumber = candidateSpan.getDoc();
-	    matchStartPosition = candidateSpan.getStart();
-	    matchEndPosition = candidateSpan.getEnd();		
-		if (collectPayloads && candidateSpan.getPayloads() != null) {  		    	
-	    	matchPayload.addAll(candidateSpan.getPayloads());  		    	
-	    }
-		
-		if (DEBUG)
-		    log.trace("doc# {}, start {}, end {}",matchDocNumber,matchStartPosition,
-			      matchEndPosition);		
-	}
+            List<CandidateSpan> adjacentSpans = collectAdjacentSpans();
+            setMatchList(adjacentSpans);
+        }
+        return false;
+    }
 
-	@Override
-	public boolean skipTo(int target) throws IOException {
-		if (hasMoreSpans && firstSpans.doc() < target){
-			if (!firstSpans.skipTo(target)){
-				hasMoreSpans = false;
-				return false;
-			}
-		}		
-		matchList.clear();
-		return advance();
-	}
+    /**
+     * Collects all adjacent firstspans occurring in a sequence.
+     * 
+     * @return a list of the adjacent spans
+     * @throws IOException
+     */
+    private List<CandidateSpan> collectAdjacentSpans() throws IOException {
 
-	@Override
-	public long cost() {
-		return matchCost;
-	}	
+        CandidateSpan startSpan = new CandidateSpan(firstSpans);
+
+        List<CandidateSpan> adjacentSpans = new ArrayList<CandidateSpan>();
+        adjacentSpans.add(startSpan);
+
+        CandidateSpan prevSpan = startSpan;
+
+        while ((hasMoreSpans = firstSpans.next())
+                && startSpan.getDoc() == firstSpans.doc()) {
+
+            if (firstSpans.start() > prevSpan.getEnd()) {
+                break;
+            } else if (firstSpans.start() == prevSpan.getEnd()) {
+                prevSpan = new CandidateSpan(firstSpans);
+                adjacentSpans.add(prevSpan);
+            }
+        }
+        return adjacentSpans;
+    }
+
+    /**
+     * Generates all possible repetition match spans from the given list of
+     * adjacent spans and add them to the match list.
+     * 
+     * @param adjacentSpans
+     */
+    private void setMatchList(List<CandidateSpan> adjacentSpans) {
+        CandidateSpan startSpan, endSpan, matchSpan;
+        for (int i = min; i < max + 1; i++) {
+            int j = 0;
+            int endIndex;
+            while ((endIndex = j + i - 1) < adjacentSpans.size()) {
+                startSpan = adjacentSpans.get(j);
+                if (i == 1) {
+                    try {
+                        matchSpan = startSpan.clone();
+                        matchSpan.setPayloads(computeMatchPayload(
+                                adjacentSpans, 0, endIndex - 1));
+                        matchList.add(matchSpan);
+                    } catch (CloneNotSupportedException e) {
+                        e.printStackTrace();
+                    }
+                } else {
+                    endSpan = adjacentSpans.get(endIndex);
+                    matchSpan = new CandidateSpan(startSpan.getStart(),
+                            endSpan.getEnd(), startSpan.getDoc(),
+                            computeMatchCost(adjacentSpans, 0, endIndex),
+                            computeMatchPayload(adjacentSpans, 0, endIndex));
+                    //System.out.println("c:"+matchSpan.getCost() +" p:"+ matchSpan.getPayloads().size());
+                    //System.out.println(startSpan.getStart() +","+endSpan.getEnd());
+                    matchList.add(matchSpan);
+                }
+                j++;
+            }
+        }
+
+        Collections.sort(matchList);
+    }
+
+    /**
+     * Creates payloads by adding all the payloads of some adjacent spans, that
+     * are all spans in the given list whose index is between the start and end
+     * index (including those with these indexes).
+     * 
+     * @param adjacentSpans a list of adjacentSpans
+     * @param start the start index representing the first adjacent span in the
+     *        list to be computed
+     * @param end the end index representing the last adjacent span in the list
+     *        to be computed
+     * @return payloads
+     */
+    private Collection<byte[]> computeMatchPayload(
+            List<CandidateSpan> adjacentSpans, int start, int end) {
+        Collection<byte[]> payload = new ArrayList<byte[]>();
+        for (int i = start; i <= end; i++) {
+            payload.addAll(adjacentSpans.get(i).getPayloads());
+        }
+        return payload;
+    }
+
+    /**
+     * Computes the matchcost by adding all the cost of the adjacent spans
+     * between the start and end index in the given list.
+     * 
+     * @param adjacentSpans a list of adjacent spans
+     * @param start the start index
+     * @param end the end index
+     * @return
+     */
+    private long computeMatchCost(List<CandidateSpan> adjacentSpans, int start,
+            int end) {
+        long matchCost = 0;
+        for (int i = start; i <= end; i++) {
+            matchCost += adjacentSpans.get(i).getCost();
+        }
+        return matchCost;
+    }
+
+    /**
+     * Sets properties for the current match from the given candidate span.
+     * 
+     * @param candidateSpan the match candidate span
+     * @throws IOException
+     */
+    private void setMatchProperties(CandidateSpan candidateSpan)
+            throws IOException {
+        matchDocNumber = candidateSpan.getDoc();
+        matchStartPosition = candidateSpan.getStart();
+        matchEndPosition = candidateSpan.getEnd();
+        if (collectPayloads && candidateSpan.getPayloads() != null) {
+            matchPayload.addAll(candidateSpan.getPayloads());
+        }
+    }
+
+    @Override
+    public boolean skipTo(int target) throws IOException {
+        if (hasMoreSpans && firstSpans.doc() < target) {
+            if (!firstSpans.skipTo(target)) {
+                hasMoreSpans = false;
+                return false;
+            }
+        }
+        matchList.clear();
+        return advance();
+    }
+
+    @Override
+    public long cost() {
+        return matchCost;
+    }
 }
