diff --git a/CHANGES b/CHANGES
index 8d4f839..e9fbe04 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+0.30.2 2014-02-14
+        - [bugfix] wrapper uses correct distance constraint
+
 0.30.1 2014-02-13
         - Added sentence extension for match info (diewald)
 
diff --git a/pom.xml b/pom.xml
index 03d4809..45f02d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
 -->
   <groupId>KorAP-modules</groupId>
   <artifactId>KorAP-lucene-index</artifactId>
-  <version>0.30.1</version>
+  <version>0.30.2</version>
   <packaging>jar</packaging>
 
   <name>KorAP-lucene-index</name>
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
index d57eb0c..93fcee4 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanSequenceQueryWrapper.java
@@ -92,14 +92,21 @@
     public SpanSequenceQueryWrapper withConstraint (int min, int max) {
 	if (this.constraints == null)
 	    this.constraints = new ArrayList<DistanceConstraint>(1);
-	this.constraints.add(new DistanceConstraint("w", min, max,false));
+	this.constraints.add(new DistanceConstraint("w", min, max, false));
 	return this;
     };
 
     public SpanSequenceQueryWrapper withConstraint (int min, int max, String unit) {
 	if (this.constraints == null)
 	    this.constraints = new ArrayList<DistanceConstraint>(1);
-	this.constraints.add(new DistanceConstraint(unit, min, max,false));
+	if (unit.equals("w"))
+	    this.constraints.add(new DistanceConstraint("w", min, max, false));
+	else
+	    this.constraints.add(
+		 new DistanceConstraint(
+                     new SpanElementQuery(this.field, unit), unit, min, max, false
+                 )
+	    );
 	return this;
     };
 
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java
index d21fa5a..486065c 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestNextIndex.java
@@ -27,6 +27,8 @@
 import de.ids_mannheim.korap.query.SpanSegmentQuery;
 import de.ids_mannheim.korap.query.SpanWithinQuery;
 
+import de.ids_mannheim.korap.query.wrap.SpanSequenceQueryWrapper;
+
 import org.apache.lucene.index.Term;
 
 @RunWith(JUnit4.class)
@@ -320,18 +322,59 @@
 		assertEquals("EndPos", 3, kr.match(0).endPos);	
 		
 	}
+
+	@Test
+	public void indexExample7Distances () throws IOException{
+		KorapIndex ki = new KorapIndex();
+		ki.addDoc(createFieldDoc1());		
+		ki.addDoc(createFieldDoc2());		
+		ki.addDoc(createFieldDoc3());
+		ki.addDoc(createFieldDoc4());
+		ki.commit();
+		
+		SpanSequenceQueryWrapper sq = new SpanSequenceQueryWrapper("base");
+		sq.append("i:b").append("i:d").withConstraint(1,3);
+		
+		KorapResult kr = ki.search(sq.toQuery(), (short) 10);			
+
+		assertEquals("totalResults", 3, kr.totalResults());
+		assertEquals("doc-number", "match-doc-0-p2-5", kr.match(0).getID());
+		assertEquals("doc-number", "match-doc-2-p2-4", kr.match(1).getID());
+		assertEquals("doc-number", "match-doc-3-p2-5", kr.match(2).getID());
+	};
+
+	@Test
+	public void indexExample8Distances () throws IOException{
+		KorapIndex ki = new KorapIndex();
+		ki.addDoc(createFieldDoc1());		
+		ki.addDoc(createFieldDoc2());		
+		ki.addDoc(createFieldDoc3());
+		ki.addDoc(createFieldDoc4());
+		ki.commit();
+		
+		SpanSequenceQueryWrapper sq = new SpanSequenceQueryWrapper("base");
+		sq.append("i:a").append("i:b").withConstraint(0, 3, "e");
+		
+		KorapResult kr = ki.search(sq.toQuery(), (short) 10);			
+
+		assertEquals("totalResults", 3, kr.totalResults());
+		assertEquals("doc-number", "match-doc-0-p3-6", kr.match(0).getID());
+		assertEquals("doc-number", "match-doc-1-p1-3", kr.match(1).getID());
+		assertEquals("doc-number", "match-doc-3-p3-6", kr.match(2).getID());
+	};
+
 	
 	private FieldDocument createFieldDoc1(){
 		FieldDocument fd = new FieldDocument();
 		fd.addString("ID", "doc-0");
 		fd.addTV("base",
-			 "bcbabd",			 
-			 "[(0-1)s:b|i:b|_1#0-1]" +
-			 "[(1-2)s:c|i:c|s:b|_2#1-2]" +			 
-			 "[(2-3)s:b|i:b|_3#2-3]" +
-			 "[(3-4)s:a|i:a|_4#3-4|<>:e#3-5$<i>5]" + 
-			 "[(4-5)s:d|i:d|s:c|_5#4-5]" +			 
-			 "[(5-6)s:b|i:b|_6#5-6]");
+			 "bcbadb",			 
+			 "[(0-1)s:b|i:b|_0#0-1]" +
+			 "[(1-2)s:c|i:c|s:b|_1#1-2]" +			 
+			 "[(2-3)s:b|i:b|_2#2-3]" +
+			 "[(3-4)s:a|i:a|_3#3-4|<>:e#3-6$<i>6]" + 
+			 "[(4-5)s:d|i:d|s:c|_4#4-5]" +			 
+			 "[(5-6)s:b|i:b|_5#5-6]");
 		return fd;
 	}
 	
@@ -339,11 +382,11 @@
 		FieldDocument fd = new FieldDocument();
 		fd.addString("ID", "doc-1");
 		fd.addTV("base",
-			 "baba",			 
-			 "[(0-1)s:c|i:c|_1#0-1]" +
-			 "[(1-2)s:a|i:a|s:c|_2#1-2|<>:e#1-3$<i>3]" +			 
-			 "[(2-3)s:b|i:b|s:a|_3#2-3]" +
-			 "[(3-4)s:a|i:a|_4#3-4]");
+			 "caba",			 
+			 "[(0-1)s:c|i:c|_0#0-1]" +
+			 "[(1-2)s:a|i:a|s:c|_1#1-2|<>:e#1-3$<i>3]" +			 
+			 "[(2-3)s:b|i:b|s:a|_2#2-3]" +
+			 "[(3-4)s:a|i:a|_3#3-4]");
 		return fd;
 	} 
 	
@@ -351,14 +394,28 @@
 		FieldDocument fd = new FieldDocument();
 		fd.addString("ID", "doc-2");
 		fd.addTV("base",
-			 "bdb",			 
-			 "[(0-1)s:c|i:c|_1#0-1]" +
-			 "[(1-2)s:d|i:d|_2#1-2]"+
-			 "[(2-3)s:b|i:b|s:a|_3#2-3]"+
-			 "[(3-4)s:d|i:d|_4#3-4]");
+			 "cdbd",			 
+			 "[(0-1)s:c|i:c|_0#0-1]" +
+			 "[(1-2)s:d|i:d|_1#1-2]"+
+			 "[(2-3)s:b|i:b|s:a|_2#2-3]"+
+			 "[(3-4)s:d|i:d|_3#3-4]");
 			 	
 		return fd;
 	}
+
+	private FieldDocument createFieldDoc4(){
+		FieldDocument fd = new FieldDocument();
+		fd.addString("ID", "doc-3");
+		fd.addTV("base",
+			 "bcbadb",			 
+			 "[(0-1)s:b|i:b|_0#0-1]" +
+			 "[(1-2)s:c|i:c|s:b|<>:s#1-3$<i>3|_1#1-2]" +			 
+			 "[(2-3)s:b|i:b|_2#2-3]" +
+			 "[(3-4)s:a|i:a|_3#3-4|<>:e#3-6$<i>6]" + 
+			 "[(4-5)s:d|i:d|s:c|_4#4-5]" +			 
+			 "[(5-6)s:b|i:b|_5#5-6]");
+		return fd;
+	}
 	
 	
 };
