diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
index bf7ce85..49e3cb6 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanAttributeQuery.java
@@ -14,17 +14,17 @@
 import de.ids_mannheim.korap.query.spans.AttributeSpans;
 
 /**
- * SpanAttributeQuery retrieves attribute spans, that are tokens annotated with
- * prefix @, for example {@literal @}:class=header. SpanAttributeQueries are
- * commonly used to search for elements or relations having some specific
- * attribute(s).
+ * SpanAttributeQuery retrieves {@link AttributeSpans}, that are tokens
+ * annotated with prefix @, for example {@literal @}:class=header.
+ * SpanAttributeQueries are commonly used to search for elements or relations
+ * having some specific attribute(s).
  * 
  * Example: <br/>
  * <br/>
  * 
  * <pre>
  * SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(new Term(
- *         &quot;base&quot;, &quot;@:class=title&quot;)), true);
+ *         &quot;tokens&quot;, &quot;@:class=title&quot;)), true);
  * </pre>
  * 
  * Negation enables searching for elements <em>without</em> some attribute(s).
@@ -32,7 +32,7 @@
  * 
  * <pre>
  * SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(new Term(
- *         &quot;base&quot;, &quot;@:class=title&quot;)), true, true);
+ *         &quot;token&quot;, &quot;@:class=title&quot;)), true, true);
  * </pre>
  * 
  * @author margaretha
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
index 74aafc7..abf00a4 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/AttributeSpans.java
@@ -16,188 +16,266 @@
 import org.slf4j.LoggerFactory;
 
 import de.ids_mannheim.korap.query.SpanAttributeQuery;
+import org.apache.lucene.search.spans.TermSpans;
 
-/** Span enumeration of attributes which are treated as a normal term with 
- * 	special payload assignment referring to to which element it belongs.  
- * 	The class is basically a wrapper of the TermSpan with additional 
- * 	functionality regarding element reference. Element reference is 
- * 	annotated ascendingly starting from the left side.
+/**
+ * Span enumeration of attributes which are term spans with special payload
+ * assignment referring to another span (e.g. element/relation span) to which an
+ * attribute span belongs.
  * 
- * 	The enumeration is ordered firstly by the start position of the attribute 
- * 	and secondly by the element reference descendingly with respect to the 
- * 	nature of the order of the element enumeration. 
- *  
- *  @author margaretha
+ * The class is basically a wrapper of Lucene {@link TermSpans} with additional
+ * functionality regarding element/relation reference. Element/relation id is
+ * annotated ascendingly starting from the left side.
+ * 
+ * The enumeration is ordered firstly by the start position of the attribute and
+ * secondly by the element/relation id descendingly. This order helps to match
+ * element and attributes faster. 
+ * 
+ * @author margaretha
  * */
-public class AttributeSpans extends SimpleSpans{
-	
-	private List<CandidateAttributeSpan> candidateList;
-	private int currentDoc, currentPosition;
-	private short spanId;
-	private boolean isFinish;
-	private int elementEnd;
-	
-	protected Logger logger = LoggerFactory.getLogger(AttributeSpans.class);
+public class AttributeSpans extends SimpleSpans {
 
-	public AttributeSpans(SpanAttributeQuery simpleSpanQuery,
-			AtomicReaderContext context, Bits acceptDocs,
-			Map<Term, TermContext> termContexts) throws IOException {
-		super(simpleSpanQuery, context, acceptDocs, termContexts);		
-		candidateList = new ArrayList<>();
-		hasMoreSpans = firstSpans.next();
-		if (hasMoreSpans) {
-			currentDoc = firstSpans.doc();
-			currentPosition = firstSpans.start();
-		}		
-	}
+    private List<CandidateAttributeSpan> candidateList;
+    private int currentDoc, currentPosition;
+    private short spanId;
+    private boolean isFinish;
+    private int elementEnd;
 
-	@Override
-	public boolean next() throws IOException {		
-		isStartEnumeration=false;
-		matchPayload.clear();
-		return advance();
-	}
+    protected Logger logger = LoggerFactory.getLogger(AttributeSpans.class);
 
+    /**
+     * Constructs Attributespans based on the specified SpanAttributeQuery.
+     * 
+     * @param spanAttributeQuery a spanAttributeQuery
+     * @param context
+     * @param acceptDocs
+     * @param termContexts
+     * @throws IOException
+     */
+    public AttributeSpans(SpanAttributeQuery spanAttributeQuery,
+            AtomicReaderContext context, Bits acceptDocs,
+            Map<Term, TermContext> termContexts) throws IOException {
+        super(spanAttributeQuery, context, acceptDocs, termContexts);
+        candidateList = new ArrayList<>();
+        hasMoreSpans = firstSpans.next();
+        if (hasMoreSpans) {
+            currentDoc = firstSpans.doc();
+            currentPosition = firstSpans.start();
+        }
+    }
 
-	/**	Get the next match by first checking the candidate match list
-	 * 	and setting the list when it is empty.
-	 * */
-	private boolean advance() throws IOException {		
-		while(hasMoreSpans || !candidateList.isEmpty()){
-			if (!candidateList.isEmpty()){
-				// set AttributeSpan from 
-				CandidateAttributeSpan cs = candidateList.get(0);
-				this.matchDocNumber = cs.getDoc();
-				this.matchStartPosition = cs.getStart();
-				this.matchEndPosition = cs.getEnd();
-				this.setSpanId(cs.getSpanId());
-				this.setElementEnd(cs.getElementEnd());
-				candidateList.remove(0);
-				return true;
-			}
-			else{
-			    //logger.info("Setting candidate list");
-				setCandidateList();
-//				for (CandidateAttributeSpan cs: candidateList){
-//					logger.info("cs ref "+cs.getElementRef());
-//				}
-				currentDoc = firstSpans.doc();
-				currentPosition = firstSpans.start();
-			}
-		}
-		return false;
-	}
-	
-	/**	Collects all the attributes in the same start position and sort
-	 * 	them by elementRef in reverse order (the ones with the bigger 
-	 * 	elementRef first). 
-	 * */
-	private void setCandidateList() throws IOException {
-		
-		while (hasMoreSpans &&	firstSpans.doc() == currentDoc && 
-				firstSpans.start() == currentPosition){
-			
-			candidateList.add(createCandidateSpan(firstSpans));
-			hasMoreSpans = firstSpans.next();
-		}
-		
-		Collections.sort(candidateList);
-		Collections.reverse(candidateList);
-	}
-	
-	private CandidateAttributeSpan createCandidateSpan(Spans firstSpans) throws IOException {
-		List<byte[]> payload = (List<byte[]>) firstSpans.getPayload();
-		ByteBuffer wrapper = ByteBuffer.wrap(payload.get(0));
-		
-		short spanId = wrapper.getShort(0);		
-		int elementEnd = -1;
-		if (payload.get(0).length == 6){
-			elementEnd = wrapper.getInt(2);
-		}		
-		return new CandidateAttributeSpan(firstSpans,spanId, elementEnd);
-	}
-	
-	public short getSpanId(){
-		return this.spanId;
-	}
+    @Override
+    public boolean next() throws IOException {
+        isStartEnumeration = false;
+        matchPayload.clear();
+        return advance();
+    }
 
-	public void setSpanId(short spanId) {
-		this.spanId = spanId;
-	}
+    /**
+     * Moves to the next match by checking the candidate match list or setting
+     * the list first when it is empty.
+     * 
+     * @return true if a match is found
+     * @throws IOException
+     */
+    private boolean advance() throws IOException {
+        while (hasMoreSpans || !candidateList.isEmpty()) {
+            if (!candidateList.isEmpty()) {
+                // set the current match from the first CandidateAttributeSpan
+                // in the candidate list
+                CandidateAttributeSpan cs = candidateList.get(0);
+                this.matchDocNumber = cs.getDoc();
+                this.matchStartPosition = cs.getStart();
+                this.matchEndPosition = cs.getEnd();
+                this.setSpanId(cs.getSpanId());
+                this.setElementEnd(cs.getElementEnd());
+                candidateList.remove(0);
+                return true;
+            } else {
+                setCandidateList();
+                currentDoc = firstSpans.doc();
+                currentPosition = firstSpans.start();
+            }
+        }
+        return false;
+    }
 
-	public int getElementEnd() {
-		return elementEnd;
-	}
+    /**
+     * Collects all the attributes in the same start position and sort them by
+     * element/relation Id in a reverse order (the ones with the bigger
+     * element/relation Id first).
+     * 
+     * @throws IOException
+     */
+    private void setCandidateList() throws IOException {
 
-	public void setElementEnd(int elementEnd) {
-		this.elementEnd = elementEnd;
-	}
+        while (hasMoreSpans && firstSpans.doc() == currentDoc
+                && firstSpans.start() == currentPosition) {
 
-	public boolean isFinish() {
-		return isFinish;
-	}
+            candidateList.add(createCandidateSpan());
+            hasMoreSpans = firstSpans.next();
+        }
 
-	public void setFinish(boolean isFinish) {
-		this.isFinish = isFinish;
-	}
+        Collections.sort(candidateList);
+        Collections.reverse(candidateList);
+    }
 
-	@Override
-	public boolean skipTo(int target) throws IOException {
-		if (hasMoreSpans && (firstSpans.doc() < target)){
-  			if (!firstSpans.skipTo(target)){
-  				candidateList.clear();
-  				return false;
-  			}
-  		}		
-		setCandidateList();
-		matchPayload.clear();
-		isStartEnumeration=false;
-		return advance();
-	}
+    /**
+     * Creates a CandidateAttributeSpan based on the child span and set the
+     * spanId and elementEnd from its payloads.
+     * 
+     * @param firstSpans an AttributeSpans
+     * @return a CandidateAttributeSpan
+     * @throws IOException
+     */
+    private CandidateAttributeSpan createCandidateSpan() throws IOException {
+        List<byte[]> payload = (List<byte[]>) firstSpans.getPayload();
+        ByteBuffer wrapper = ByteBuffer.wrap(payload.get(0));
 
-	@Override
-	public long cost() {
-		return firstSpans.cost();
-	}
-	
-	/** Match candidate for attribute spans.
-	 * */
-	class CandidateAttributeSpan extends CandidateSpans 
-			implements Comparable<CandidateSpans>{
+        short spanId = wrapper.getShort(0);
+        int elementEnd = -1;
+        if (payload.get(0).length == 6) {
+            elementEnd = wrapper.getInt(2);
+        }
+        return new CandidateAttributeSpan(firstSpans, spanId, elementEnd);
+    }
 
-		private short spanId;
-		private int elementEnd;
-		
-		public CandidateAttributeSpan(Spans span, short spanId, int elementEnd) 
-				throws IOException {
-			super(span);
-			setSpanId(spanId);
-			setElementEnd(elementEnd);
-		}
-		
-		public void setSpanId(short spanId) {
-			this.spanId = spanId;
-		}
-		public short getSpanId() {
-			return spanId;
-		}
+    /**
+     * Return the span id to which an attribute span belongs, for instance a
+     * relation id or an element id.
+     * 
+     * @return a span id, for instance a relation id or an element id
+     */
+    public short getSpanId() {
+        return this.spanId;
+    }
 
-		public int getElementEnd() {
-			return elementEnd;
-		}
+    /**
+     * Sets the span id to which an attribute span belongs, for instance a
+     * relation id or an element id.
+     * 
+     * @param spanId the span id to which an attribute span belongs, for
+     *        instance a relation id or an element id.
+     */
+    public void setSpanId(short spanId) {
+        this.spanId = spanId;
+    }
 
-		public void setElementEnd(int elementEnd) {
-			this.elementEnd = elementEnd;
-		}
+    /**
+     * Returns the end position of the element to which an attribute span
+     * belongs.
+     * 
+     * @return an element end position
+     */
+    public int getElementEnd() {
+        return elementEnd;
+    }
 
-		@Override
-		public int compareTo(CandidateSpans o) {
-			CandidateAttributeSpan cs = (CandidateAttributeSpan) o;
-			if (this.spanId == cs.spanId)
-				return 0;
-			else if (this.spanId > cs.spanId )
-				return 1;
-			return -1;			
-		}		
-	}
+    /**
+     * Sets the end position of the element to which an attribute span belongs.
+     * 
+     * @param elementEnd the end position of the element to which an attribute
+     *        span belongs.
+     */
+    public void setElementEnd(int elementEnd) {
+        this.elementEnd = elementEnd;
+    }
+
+    /**
+     * Tells if the enumeration of the AttributeSpans has come to an end.
+     * 
+     * @return true if the enumeration has finished.
+     */
+    public boolean isFinish() {
+        return isFinish;
+    }
+
+    /**
+     * Sets true if the enumeration of the AttributeSpans has come to an end.
+     * 
+     * @param isFinish <code>true</code> if the enumeration of the
+     *        AttributeSpans has come to an end, <code>false</code> otherwise.
+     */
+    public void setFinish(boolean isFinish) {
+        this.isFinish = isFinish;
+    }
+
+    @Override
+    public boolean skipTo(int target) throws IOException {
+        if (hasMoreSpans && (firstSpans.doc() < target)) {
+            if (!firstSpans.skipTo(target)) {
+                candidateList.clear();
+                return false;
+            }
+        }
+        setCandidateList();
+        matchPayload.clear();
+        isStartEnumeration = false;
+        return advance();
+    }
+
+    @Override
+    public long cost() {
+        return firstSpans.cost();
+    }
+
+    /**
+     * CandidateAttributeSpan contains information about an Attribute span. All
+     * attribute spans occurring in an identical position are collected as
+     * CandidateAttributeSpans. The list of these CandidateAttributeSpans are
+     * sorted based on the span ids to which the attributes belong to. The
+     * attributes with smaller spanIds come first on the list.
+     * 
+     * */
+    class CandidateAttributeSpan extends CandidateSpans implements
+            Comparable<CandidateSpans> {
+
+        private short spanId;
+        private int elementEnd;
+
+        /**
+         * Construct a CandidateAttributeSpan based on the given span, spanId,
+         * and elementEnd.
+         * 
+         * @param span an AttributeSpans
+         * @param spanId the element or relation span id to which the current
+         *        state of the specified AttributeSpans belongs to.
+         * @param elementEnd the end position of the element or relation span to
+         *        which the current state of the specified AttributeSpans
+         *        belongs to.
+         * @throws IOException
+         */
+        public CandidateAttributeSpan(Spans span, short spanId, int elementEnd)
+                throws IOException {
+            super(span);
+            setSpanId(spanId);
+            setElementEnd(elementEnd);
+        }
+
+        public void setSpanId(short spanId) {
+            this.spanId = spanId;
+        }
+
+        public short getSpanId() {
+            return spanId;
+        }
+
+        public int getElementEnd() {
+            return elementEnd;
+        }
+
+        public void setElementEnd(int elementEnd) {
+            this.elementEnd = elementEnd;
+        }
+
+        @Override
+        public int compareTo(CandidateSpans o) {
+            CandidateAttributeSpan cs = (CandidateAttributeSpan) o;
+            if (this.spanId == cs.spanId)
+                return 0;
+            else if (this.spanId > cs.spanId)
+                return 1;
+            return -1;
+        }
+    }
 }
