diff --git a/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
index 293286b..d4a9ae2 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestAttributeIndex.java
@@ -19,249 +19,234 @@
 import de.ids_mannheim.korap.query.SpanWithAttributeQuery;
 
 public class TestAttributeIndex {
-	
-	private KorapIndex ki = new KorapIndex();
-	private KorapResult kr;
-	private FieldDocument fd;
 
-	public TestAttributeIndex() throws IOException {
-		ki = new KorapIndex();		
-	}
-	
-	private FieldDocument createFieldDoc0(){		
-		fd = new FieldDocument();
-		fd.addString("ID", "doc-0");
-		fd.addTV("base",
-			 "bcbabd",			 
-			 "[(0-1)s:a|_1#0-1|<>:s#0-5$<i>5<s>-1|<>:div#0-3$<i>3<s>1|<>:div#0-2$<i>2<s>2|@:class=header$<s>1<i>3|@:class=header$<s>2<i>2]" +
-			 "[(1-2)s:e|_2#1-2|<>:a#1-2$<i>2<s>1|@:class=header$<s>1<i>2]" +
-			 "[(2-3)s:e|_3#2-3|<>:div#2-3$<i>5<s>1|@:class=time$<s>1<i>5]" +
-			 "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=header$<s>1<i>5]" + 
-			 "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|<>:a#4-5$<i>5<s>2|@:class=header$<s>2<i>5]" +
-			 "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>1|<>:div#5-6$<i>6<s>-1|@:class=header$<s>1<i>6]"+
-			 "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<s>1<i>7|@:class=header$<s>2<i>7]");
-			 
-		return fd;
-	}
-	
-	private FieldDocument createFieldDoc1(){
-		fd = new FieldDocument();
-		fd.addString("ID", "doc-1");
-		fd.addTV("base",
-			 "bcbabd",			 
-			 "[(0-1)s:b|_1#0-1|<>:s#0-5$<i>5<s>-1|<>:div#0-3$<i>3<s>1|@:class=header$<s>1<i>3|@:class=title$<s>1<i>3|@:class=book$<s>1<i>3]" +
-			 "[(1-2)s:c|_2#1-2|<>:div#1-2$<i>2<s>1|@:class=header$<s>1<i>2|@:class=title$<s>1<i>2]" +
-			 "[(2-3)s:b|_3#2-3|<>:div#2-3$<i>5<s>1|@:class=book$<s>1<i>5]" +
-			 "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=title$<s>1<i>5]" +
-			 "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<s>1<i>5|@:class=book$<s>1<i>5|@:class=title$<s>1<i>5]" +
-			 "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>-1|<>:div#5-6$<i>6<s>1|@:class=header$<s>1<i>6]"+
-			 "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<s>1<i>7|@:class=title$<s>1<i>7]");
-			 
-		return fd;
-	}
-	
-	private FieldDocument createFieldDoc2(){
-		fd = new FieldDocument();
-		fd.addString("ID", "doc-1");
-		fd.addTV("base",
-			 "bcbabd",			 
-			 "[(0-1)s:b|_1#0-1|<>:s#0-5$<i>5<s>1|<>:div#0-3$<i>3<s>2|@:class=header$<s>2<i>3|@:class=book$<s>1<i>5|@:class=book$<s>2<i>3]" +
-			 "[(1-2)s:e|_2#1-2|<>:div#1-2$<i>2<s>1|<>:a#1-2$<i>2<s>2|@:class=book$<s>2<i>2|@:class=header$<s>1<i>2]" +
-			 "[(2-3)s:b|_3#2-3|<>:div#2-3$<i>5<s>1|<>:a#1-2$<i>2<s>2|@:class=header$<s>2<i>2|@:class=book$<s>1<i>5]" +
-			 "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=title$<s>1<i>5]" + 
-			 "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<s>1<i>5|@:class=book$<s>1<i>5|@:class=book$<s>1<i>5]" +
-			 "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>-1|<>:div#5-6$<i>6<s>1|@:class=header$<s>1<i>6]"+
-			 "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<s>1<i>7|@:class=book$<s>2<i>7]");
-			 
-		return fd;
-	}
-	
-		
-	/** Test matching elementRef
-	 * @throws IOException 
-	 * */
-	@Test
-	public void testCase1() throws IOException {
-		ki.addDoc(createFieldDoc0());
-		ki.commit();
-		
-		SpanAttributeQuery saq = new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=header")), 
-				true);
-		
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(saq);
-		
-		// div with @class=header
-		SpanQuery sq = new SpanWithAttributeQuery(
-				new SpanElementQuery("base", "div"),
-				sql, true);
-		
-		kr = ki.search(sq, (short) 10);
-		
-		assertEquals((long) 4, kr.getTotalResults());
-		assertEquals(0,kr.getMatch(0).getStartPos());
-		assertEquals(2,kr.getMatch(0).getEndPos());
-		assertEquals(0,kr.getMatch(1).getStartPos());
-		assertEquals(3,kr.getMatch(1).getEndPos());
-		assertEquals(3,kr.getMatch(2).getStartPos());
-		assertEquals(5,kr.getMatch(2).getEndPos());
-		assertEquals(6,kr.getMatch(3).getStartPos());
-		assertEquals(7,kr.getMatch(3).getEndPos());
-	}	
-	
-	/** Test multiple attributes and negation
-	 * @throws IOException 
-	 * */
-	@Test
-	public void testCase2() throws IOException{
-		ki.addDoc(createFieldDoc1());
-		ki.commit();
-		// header and title
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=header")),true)
-		);
-		sql.add(new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=title")),true)
-		);
-		
-		SpanQuery sq = new SpanWithAttributeQuery(
-				new SpanElementQuery("base", "div"),
-				sql, true);
-		
-		kr = ki.search(sq, (short) 10);
-				
-		assertEquals((long) 4, kr.getTotalResults());
-		assertEquals(0,kr.getMatch(0).getStartPos());
-		assertEquals(3,kr.getMatch(0).getEndPos());
-		assertEquals(1,kr.getMatch(1).getStartPos());
-		assertEquals(2,kr.getMatch(1).getEndPos());
-		assertEquals(4,kr.getMatch(2).getStartPos());
-		assertEquals(5,kr.getMatch(2).getEndPos());
-		assertEquals(6,kr.getMatch(3).getStartPos());
-		assertEquals(7,kr.getMatch(3).getEndPos());
-		
-		// Add not Attribute
-		// header and title, not book
-		sql.add(new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=book")),true,true)
-		);
-		
-		sq = new SpanWithAttributeQuery(
-				new SpanElementQuery("base", "div"),
-				sql, true);
-		
-		kr = ki.search(sq, (short) 10);
-		
-		assertEquals((long) 2, kr.getTotalResults());
-		assertEquals(1,kr.getMatch(0).getStartPos());
-		assertEquals(2,kr.getMatch(0).getEndPos());
-		assertEquals(6,kr.getMatch(1).getStartPos());
-		assertEquals(7,kr.getMatch(1).getEndPos());		
-		
-		// Test multiple negations
-		// header, not title, not book
-		sql.remove(1);
-		sql.add(new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=title")),true,true)
-		);
-		
-		sq = new SpanWithAttributeQuery(
-				new SpanElementQuery("base", "div"),
-				sql, true);
-		
-		kr = ki.search(sq, (short) 10);
-		assertEquals((long) 1, kr.getTotalResults());
-		assertEquals(5,kr.getMatch(0).getStartPos());
-		assertEquals(6,kr.getMatch(0).getEndPos());
-	}	
-		
-	/** same attribute types referring to different element types
-	 * */	 
-	@Test
-	public void testCase3() throws IOException{
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=header")),true)
-		);		
-		sql.add(new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=book")),true,true)
-		);
-		SpanQuery sq = new SpanWithAttributeQuery(
-				new SpanElementQuery("base", "div"),
-				sql, true);
-		
-		kr = ki.search(sq, (short) 10);
-		
-		assertEquals((long) 3, kr.getTotalResults());
-		assertEquals(1,kr.getMatch(0).getStartPos());
-		assertEquals(2,kr.getMatch(0).getEndPos());
-		assertEquals(5,kr.getMatch(1).getStartPos());
-		assertEquals(6,kr.getMatch(1).getEndPos());
-		assertEquals(6,kr.getMatch(2).getStartPos());
-		assertEquals(7,kr.getMatch(2).getEndPos());
-	}
-	
-	/** Test skipto doc for spanWithAttribute*/
-	@Test
-	public void testCase4() throws IOException{
-		ki.addDoc(createFieldDoc1());
-		ki.addDoc(createFieldDoc0());		
-		ki.addDoc(createFieldDoc2());
-		ki.commit();
-		
-		SpanAttributeQuery saq = new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=book")), 
-				true);
-		
-		List<SpanQuery> sql = new ArrayList<>();
-		sql.add(saq);
-		
-		SpanWithAttributeQuery sq = new SpanWithAttributeQuery(
-				new SpanElementQuery("base", "div"),
-				sql, true);
-		
-		kr = ki.search(sq, (short) 10);
-		assertEquals((long) 6,kr.getTotalResults());
-		
-		SpanNextQuery snq = new SpanNextQuery(
-				new SpanTermQuery(new Term("base", "s:e"))
-				,sq);
-		
-		kr = ki.search(snq, (short) 10);
-		
-		assertEquals((long) 1,kr.getTotalResults());
-		assertEquals(2,kr.getMatch(0).getLocalDocID());
-		assertEquals(1,kr.getMatch(0).getStartPos());
-		assertEquals(5,kr.getMatch(0).getEndPos());		
-	}
-	
-	/** Arbitrary elements with a specific attribute
-	 *  This is just spanAttribute query, to get the elementEnd, 
-	 *  you have to use getElementEnd(). Alternatives (unimplemented): 
-	 *  	1) store in payload?
-	 *  	2) wrap as a span
-	 * */
-	@Test
-	public void testCase5() throws IOException{
-		ki.addDoc(createFieldDoc1());
-		ki.commit();
-		SpanAttributeQuery saq = new SpanAttributeQuery(
-				new SpanTermQuery(new Term("base","@:class=book")), 
-				true);
-		kr = ki.search(saq, (short) 10);
-		assertEquals((long) 3, kr.getTotalResults());
-		
-		/*for (int i=0; i< kr.getTotalResults(); i++){
-			System.out.println(
-				kr.match(i).getLocalDocID()+" "+
-				kr.match(i).startPos + " " +
-				kr.match(i).endPos
-		    );
-		}*/
-	}
+    private KorapIndex ki = new KorapIndex();
+    private KorapResult kr;
+    private FieldDocument fd;
+
+    public TestAttributeIndex() throws IOException {
+        ki = new KorapIndex();
+    }
+
+    private FieldDocument createFieldDoc0() {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-0");
+        fd.addTV(
+                "base",
+                "bcbabd",
+                "[(0-1)s:a|_1#0-1|<>:s#0-5$<i>5<s>-1|<>:div#0-3$<i>3<s>1|<>:div#0-2$<i>2<s>2|@:class=header$<s>1<i>3|@:class=header$<s>2<i>2]"
+                        + "[(1-2)s:e|_2#1-2|<>:a#1-2$<i>2<s>1|@:class=header$<s>1<i>2]"
+                        + "[(2-3)s:e|_3#2-3|<>:div#2-3$<i>5<s>1|@:class=time$<s>1<i>5]"
+                        + "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=header$<s>1<i>5]"
+                        + "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|<>:a#4-5$<i>5<s>2|@:class=header$<s>2<i>5]"
+                        + "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>1|<>:div#5-6$<i>6<s>-1|@:class=header$<s>1<i>6]"
+                        + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<s>1<i>7|@:class=header$<s>2<i>7]");
+
+        return fd;
+    }
+
+    private FieldDocument createFieldDoc1() {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-1");
+        fd.addTV(
+                "base",
+                "bcbabd",
+                "[(0-1)s:b|_1#0-1|<>:s#0-5$<i>5<s>-1|<>:div#0-3$<i>3<s>1|@:class=header$<s>1<i>3|@:class=title$<s>1<i>3|@:class=book$<s>1<i>3]"
+                        + "[(1-2)s:c|_2#1-2|<>:div#1-2$<i>2<s>1|@:class=header$<s>1<i>2|@:class=title$<s>1<i>2]"
+                        + "[(2-3)s:b|_3#2-3|<>:div#2-3$<i>5<s>1|@:class=book$<s>1<i>5]"
+                        + "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=title$<s>1<i>5]"
+                        + "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<s>1<i>5|@:class=book$<s>1<i>5|@:class=title$<s>1<i>5]"
+                        + "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>-1|<>:div#5-6$<i>6<s>1|@:class=header$<s>1<i>6]"
+                        + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<s>1<i>7|@:class=title$<s>1<i>7]");
+
+        return fd;
+    }
+
+    private FieldDocument createFieldDoc2() {
+        fd = new FieldDocument();
+        fd.addString("ID", "doc-1");
+        fd.addTV(
+                "base",
+                "bcbabd",
+                "[(0-1)s:b|_1#0-1|<>:s#0-5$<i>5<s>1|<>:div#0-3$<i>3<s>2|@:class=header$<s>2<i>3|@:class=book$<s>1<i>5|@:class=book$<s>2<i>3]"
+                        + "[(1-2)s:e|_2#1-2|<>:div#1-2$<i>2<s>1|<>:a#1-2$<i>2<s>2|@:class=book$<s>2<i>2|@:class=header$<s>1<i>2]"
+                        + "[(2-3)s:b|_3#2-3|<>:div#2-3$<i>5<s>1|<>:a#1-2$<i>2<s>2|@:class=header$<s>2<i>2|@:class=book$<s>1<i>5]"
+                        + "[(3-4)s:a|_4#3-4|<>:div#3-5$<i>5<s>1|@:class=title$<s>1<i>5]"
+                        + "[(4-5)s:b|_5#4-5|<>:div#4-5$<i>5<s>1|@:class=header$<s>1<i>5|@:class=book$<s>1<i>5|@:class=book$<s>1<i>5]"
+                        + "[(5-6)s:d|_6#5-6|<>:s#5-6$<i>6<s>-1|<>:div#5-6$<i>6<s>1|@:class=header$<s>1<i>6]"
+                        + "[(6-7)s:d|_7#6-7|<>:s#6-7$<i>7<s>2|<>:div#6-7$<i>7<s>1|@:class=header$<s>1<i>7|@:class=book$<s>2<i>7]");
+
+        return fd;
+    }
+
+    /**
+     * Test matching elementRef
+     * 
+     * @throws IOException
+     * */
+    @Test
+    public void testCase1() throws IOException {
+        ki.addDoc(createFieldDoc0());
+        ki.commit();
+
+        SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(
+                new Term("base", "@:class=header")), true);
+
+        // div with @class=header
+        SpanQuery sq = new SpanWithAttributeQuery(new SpanElementQuery("base",
+                "div"), saq, true);
+
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals((long) 4, kr.getTotalResults());
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(0, kr.getMatch(1).getStartPos());
+        assertEquals(3, kr.getMatch(1).getEndPos());
+        assertEquals(3, kr.getMatch(2).getStartPos());
+        assertEquals(5, kr.getMatch(2).getEndPos());
+        assertEquals(6, kr.getMatch(3).getStartPos());
+        assertEquals(7, kr.getMatch(3).getEndPos());
+    }
+
+    /**
+     * Test multiple attributes and negation
+     * 
+     * @throws IOException
+     * */
+    @Test
+    public void testCase2() throws IOException {
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+        // header and title
+        List<SpanQuery> sql = new ArrayList<>();
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=header")), true));
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=title")), true));
+
+        SpanQuery sq = new SpanWithAttributeQuery(new SpanElementQuery("base",
+                "div"), sql, true);
+
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals((long) 4, kr.getTotalResults());
+        assertEquals(0, kr.getMatch(0).getStartPos());
+        assertEquals(3, kr.getMatch(0).getEndPos());
+        assertEquals(1, kr.getMatch(1).getStartPos());
+        assertEquals(2, kr.getMatch(1).getEndPos());
+        assertEquals(4, kr.getMatch(2).getStartPos());
+        assertEquals(5, kr.getMatch(2).getEndPos());
+        assertEquals(6, kr.getMatch(3).getStartPos());
+        assertEquals(7, kr.getMatch(3).getEndPos());
+
+        // Add not Attribute
+        // header and title, not book
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=book")), true, true));
+
+        sq = new SpanWithAttributeQuery(new SpanElementQuery("base", "div"),
+                sql, true);
+
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals((long) 2, kr.getTotalResults());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(6, kr.getMatch(1).getStartPos());
+        assertEquals(7, kr.getMatch(1).getEndPos());
+
+        // Test multiple negations
+        // header, not title, not book
+        sql.remove(1);
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=title")), true, true));
+
+        sq = new SpanWithAttributeQuery(new SpanElementQuery("base", "div"),
+                sql, true);
+
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 1, kr.getTotalResults());
+        assertEquals(5, kr.getMatch(0).getStartPos());
+        assertEquals(6, kr.getMatch(0).getEndPos());
+    }
+
+    /**
+     * same attribute types referring to different element types
+     * */
+    @Test
+    public void testCase3() throws IOException {
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        List<SpanQuery> sql = new ArrayList<>();
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=header")), true));
+        sql.add(new SpanAttributeQuery(new SpanTermQuery(new Term("base",
+                "@:class=book")), true, true));
+        SpanQuery sq = new SpanWithAttributeQuery(new SpanElementQuery("base",
+                "div"), sql, true);
+
+        kr = ki.search(sq, (short) 10);
+
+        assertEquals((long) 3, kr.getTotalResults());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(2, kr.getMatch(0).getEndPos());
+        assertEquals(5, kr.getMatch(1).getStartPos());
+        assertEquals(6, kr.getMatch(1).getEndPos());
+        assertEquals(6, kr.getMatch(2).getStartPos());
+        assertEquals(7, kr.getMatch(2).getEndPos());
+    }
+
+    /** Test skipto doc for spanWithAttribute */
+    @Test
+    public void testCase4() throws IOException {
+        ki.addDoc(createFieldDoc1());
+        ki.addDoc(createFieldDoc0());
+        ki.addDoc(createFieldDoc2());
+        ki.commit();
+
+        SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(
+                new Term("base", "@:class=book")), true);
+
+        List<SpanQuery> sql = new ArrayList<>();
+        sql.add(saq);
+
+        SpanWithAttributeQuery sq = new SpanWithAttributeQuery(
+                new SpanElementQuery("base", "div"), sql, true);
+
+        kr = ki.search(sq, (short) 10);
+        assertEquals((long) 6, kr.getTotalResults());
+
+        SpanNextQuery snq = new SpanNextQuery(new SpanTermQuery(new Term(
+                "base", "s:e")), sq);
+
+        kr = ki.search(snq, (short) 10);
+
+        assertEquals((long) 1, kr.getTotalResults());
+        assertEquals(2, kr.getMatch(0).getLocalDocID());
+        assertEquals(1, kr.getMatch(0).getStartPos());
+        assertEquals(5, kr.getMatch(0).getEndPos());
+    }
+
+    /**
+     * Arbitrary elements with a specific attribute This is just spanAttribute
+     * query, to get the elementEnd, you have to use getElementEnd().
+     * Alternatives (unimplemented): 1) store in payload? 2) wrap as a span
+     * */
+    @Test
+    public void testCase5() throws IOException {
+        ki.addDoc(createFieldDoc1());
+        ki.commit();
+        SpanAttributeQuery saq = new SpanAttributeQuery(new SpanTermQuery(
+                new Term("base", "@:class=book")), true);
+        kr = ki.search(saq, (short) 10);
+        assertEquals((long) 3, kr.getTotalResults());
+
+        /*
+         * for (int i=0; i< kr.getTotalResults(); i++){ System.out.println(
+         * kr.match(i).getLocalDocID()+" "+ kr.match(i).startPos + " " +
+         * kr.match(i).endPos ); }
+         */
+    }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
index 7c5d021..81c3d67 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestRelationIndex.java
@@ -28,7 +28,7 @@
 
 1. return all words that are subjects of (that are linked by the “SUBJ” relation to) the string “beginnt”
 xip/syntax-dep_rel:beginnt >[func=”SUBJ”] xip/syntax-dep_rel:.*
--> rel("SUBJ", highlight(query1), new TermQuery("s:beginnt"))
+-> rel("SUBJ", highlight(query1), new TermQuery("s:beginnt")) 
 
 
 SUBJ ist modelliert mit offset für den gesamten Bereich
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java b/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java
index ba9b14f..58f88f5 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestSubSpanIndex.java
@@ -15,45 +15,77 @@
 import de.ids_mannheim.korap.query.SpanDistanceQuery;
 import de.ids_mannheim.korap.query.SpanSubspanQuery;
 
-
 public class TestSubSpanIndex {
-	
-	KorapResult kr;
-    KorapIndex ki;  
-    
+
+    KorapResult kr;
+    KorapIndex ki;
+
+    public TestSubSpanIndex() throws IOException {
+        ki = new KorapIndex();
+        ki.addDocFile(getClass().getResource("/wiki/00001.json.gz").getFile(),
+                true);
+        ki.commit();
+    }
+
     @Test
     public void testCase1() throws IOException {
-    	ki = new KorapIndex();
-    	ki.addDocFile(
-    	        getClass().getResource("/wiki/00001.json.gz").getFile(),true);
-		ki.commit();
-		
-		SpanDistanceQuery sdq = new SpanDistanceQuery(
-				new SpanTermQuery(new Term("tokens","tt/p:NN")), 
-				new SpanTermQuery(new Term("tokens","tt/p:VAFIN")), 
-				new DistanceConstraint(5, 5, true, false), 
-				true);
-		
-		SpanSubspanQuery ssq = new SpanSubspanQuery(sdq, 0, 2, true);		
-		kr = ki.search(ssq, (short) 10);
-		
-		assertEquals((long) 8,kr.getTotalResults());
-		assertEquals(35, kr.getMatch(0).getStartPos());
+        SpanDistanceQuery sdq = new SpanDistanceQuery(
+                new SpanTermQuery(new Term("tokens", "tt/p:NN")), 
+                new SpanTermQuery(new Term("tokens", "tt/p:VAFIN")), 
+                new DistanceConstraint(5, 5, true,false), true);
+
+        SpanSubspanQuery ssq = new SpanSubspanQuery(sdq, 0, 2, true);
+        kr = ki.search(ssq, (short) 10);
+
+        assertEquals((long) 8, kr.getTotalResults());
+        assertEquals(35, kr.getMatch(0).getStartPos());
         assertEquals(37, kr.getMatch(0).getEndPos());
         assertEquals(179, kr.getMatch(1).getStartPos());
         assertEquals(181, kr.getMatch(1).getEndPos());
-		
-		ssq = new SpanSubspanQuery(sdq, -2, 2, true);		
-		kr = ki.search(ssq, (short) 10);
-		
-		assertEquals(39, kr.getMatch(0).getStartPos());
+
+        ssq = new SpanSubspanQuery(sdq, -2, 2, true);
+        kr = ki.search(ssq, (short) 10);
+
+        assertEquals(39, kr.getMatch(0).getStartPos());
         assertEquals(41, kr.getMatch(0).getEndPos());
         assertEquals(183, kr.getMatch(1).getStartPos());
         assertEquals(185, kr.getMatch(1).getEndPos());
-		
-		/*for (KorapMatch km : kr.getMatches()){
-			System.out.println(km.getStartPos() +","+km.getEndPos()
-					+km.getSnippetBrackets());
-		}*/
-	}
+
+        /*
+         * for (KorapMatch km : kr.getMatches()){
+         * System.out.println(km.getStartPos() +","+km.getEndPos()
+         * +km.getSnippetBrackets()); }
+         */
+    }
+
+    @Test
+    public void testCase2() {
+        SpanDistanceQuery sdq = new SpanDistanceQuery(
+                new SpanTermQuery(new Term("tokens", "tt/p:NN")), 
+                new SpanTermQuery(new Term("tokens", "tt/p:VAFIN")), 
+                new DistanceConstraint(5, 5, true,false), true);
+        
+        SpanSubspanQuery ssq = new SpanSubspanQuery(sdq, 0, 7, true);
+        kr = ki.search(ssq, (short) 10);
+
+        assertEquals(35, kr.getMatch(0).getStartPos());
+        assertEquals(41, kr.getMatch(0).getEndPos());
+        assertEquals(179, kr.getMatch(1).getStartPos());
+        assertEquals(185, kr.getMatch(1).getEndPos());
+        
+        ssq = new SpanSubspanQuery(sdq, -7, 4, true);
+        kr = ki.search(ssq, (short) 10);
+        
+        assertEquals((long) 8, kr.getTotalResults());
+        assertEquals(35, kr.getMatch(0).getStartPos());
+        assertEquals(39, kr.getMatch(0).getEndPos());
+        assertEquals(179, kr.getMatch(1).getStartPos());
+        assertEquals(183, kr.getMatch(1).getEndPos());
+        
+        /* for (KorapMatch km : kr.getMatches()){
+         System.out.println(km.getStartPos() +","+km.getEndPos()
+         +km.getSnippetBrackets()); }*/
+         
+    }
+
 }
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestSpanSubspanQueryJSON.java b/src/test/java/de/ids_mannheim/korap/query/TestSpanSubspanQueryJSON.java
new file mode 100644
index 0000000..e1e473d
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/query/TestSpanSubspanQueryJSON.java
@@ -0,0 +1,26 @@
+package de.ids_mannheim.korap.query;
+
+import static de.ids_mannheim.korap.TestSimple.getJSONQuery;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.lucene.search.spans.SpanQuery;
+import org.junit.Test;
+
+import de.ids_mannheim.korap.query.wrap.SpanQueryWrapper;
+import de.ids_mannheim.korap.util.QueryException;
+
+/**
+ * @author margaretha
+ * 
+ */
+public class TestSpanSubspanQueryJSON {
+
+    @Test
+    public void testCase1() throws QueryException {
+        String filepath = getClass().getResource("/queries/submatch.jsonld")
+                .getFile();
+        SpanQueryWrapper sqwi = getJSONQuery(filepath);
+        SpanQuery sq = sqwi.toQuery();
+        assertEquals(sq.toString(), "subspan(<tokens:s />,1,4)");
+    }
+}
diff --git a/src/test/resources/queries/submatch.jsonld b/src/test/resources/queries/submatch.jsonld
new file mode 100644
index 0000000..36153eb
--- /dev/null
+++ b/src/test/resources/queries/submatch.jsonld
@@ -0,0 +1,30 @@
+{
+   "@context":"http://ids-mannheim.de/ns/KorAP/json-ld/v0.2/context.jsonld",
+   "errors":[
+
+   ],
+   "warnings":[
+
+   ],
+   "messages":[
+
+   ],
+   "collection":null,
+   "query":{
+      "@type":"korap:reference",
+      "operation":"operation:focus",
+      "operands":[
+         {
+            "@type":"korap:span",
+            "key":"s"
+         }
+      ],
+      "spanRef":[
+         1,
+         4
+      ]
+   },
+   "meta":{
+
+   }
+}
