Cleanup and initial position frames
diff --git a/Changes b/Changes
index 247c82a..3bc1681 100644
--- a/Changes
+++ b/Changes
@@ -4,9 +4,11 @@
 	- [feature] Added deserialization of SpanSubSpanQueries (margaretha,diewald)
 	- [bugfix] Null filters are now correctly extended (diewald)
 	- [cleanup] Refactoring of KorapResult, KorapResponse, KorapQuery,
-	  deprecated operation:or in favor of operation:junction (diewald)
+	  deprecated operation:or in favor of operation:junction,
+	  updating test suite for class and frame attributes (diewald)
 	- [bugfix] Empty class segments are now correctly serialized
 	  in sequences (diewald)
+	- [feature] Started support for position frames (diewald)
 
 0.49.2 2014-12-05
 	- [documentation] Improved documentation for various queries (margaretha)
diff --git a/src/main/java/de/ids_mannheim/korap/KorapQuery.java b/src/main/java/de/ids_mannheim/korap/KorapQuery.java
index 9ad167c..027161f 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapQuery.java
@@ -333,9 +333,10 @@
 
         case "operation:or": // Deprecated in favor of operation:junction
             return this._operationJunctionFromJson(operands);
-
+            /*
         case "operation:submatch": // Deprecated in favor of korap:reference
             return this._operationSubmatchFromJson(json, operands);
+            */
         };
 
         // Unknown
@@ -360,7 +361,7 @@
         if (operands.size() != 2)
             throw new QueryException(705, "Number of operands is not acceptable");
 
-        String frame = "contains";
+        String frame = "isAround";
         // Temporary workaround for wrongly set overlaps
         if (json.has("frames")) {
             JsonNode frameN = json.get("frames");
@@ -372,6 +373,8 @@
         }
         // <legacyCode>
         else if (json.has("frame")) {
+            this.addMessage(0, "Frame is deprecated");
+
             JsonNode frameN = json.get("frame");
             if (frameN != null && frameN.isValueNode())
                 frame = frameN.asText().substring(6);
@@ -383,17 +386,17 @@
         // Byte flag - should cover all 13 cases, i.e. two bytes long
         byte flag = WITHIN;
         switch (frame) {
-        case "contains":
+        case "isAround":
             break;
         case "strictlyContains":
             flag = REAL_WITHIN;
             break;
-        case "within":
+        case "isWithin":
             break;
-        case "startswith":
+        case "startsWith":
             flag = STARTSWITH;
             break;
-        case "endswith":
+        case "endsWith":
             flag = ENDSWITH;
             break;
         case "matches":
@@ -401,6 +404,10 @@
             break;
         case "overlaps":
             flag = OVERLAP;
+            this.addWarning(
+                769,
+                "Overlap variant currently interpreted as overlap"
+            );
             break;
         case "overlapsLeft":
             // Temporary workaround
@@ -421,6 +428,9 @@
         case "strictlyOverlaps":
             flag = REAL_OVERLAP;
             break;
+
+            // alignsLeft
+
         default:
             throw new QueryException(706, "Frame type is unknown");
         };
@@ -551,6 +561,7 @@
         }
         // <legacyCode>
         else if (json.has("class")) {
+            this.addMessage(0, "Class is deprecated");
             number = json.get("class").asInt(0);
         };
         // </legacyCode>
diff --git a/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java b/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
new file mode 100644
index 0000000..d035463
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/FrameConstraint.java
@@ -0,0 +1,202 @@
+package de.ids_mannheim.korap.query;
+import de.ids_mannheim.korap.util.QueryException;
+import java.util.*;
+
+/**
+ * Class representing a frame constraint as a bit vector.
+ *
+ * @author diewald
+ */
+public class FrameConstraint {
+
+    public static final Integer FRAME_ALL = 1024 * 8 - 1;
+    private static final Map<String,Integer> FRAME;
+    static {
+        Map<String, Integer> FRAME_t = new HashMap<>();
+
+        /*
+         * A precedes B
+         *
+         * |-A-|
+         *       |-B-|
+         *
+         * A.end < B.start
+         */
+        FRAME_t.put("precedes", 1);
+
+        /*
+         * A precedes B directly
+         *
+         * |-A-|
+         *     |-B-|
+         *
+         * A.end == b.start
+         */
+        FRAME_t.put("precedesDirectly", 1 << 1);
+
+        /*
+         * A overlaps B to the left
+         *
+         * |-A-|
+         *    |-B-|
+         *
+         * a.end < b.end && a.end > b.start && a.start < b.start
+         */
+        FRAME_t.put("overlapsLeft", 1 << 2);
+
+        /*
+         * A aligns B to the left
+         *
+         * |-A-|
+         * |-B--|
+         *
+         * a.end < b.end && a.start == b.start
+         */
+        FRAME_t.put("alignsLeft", 1 << 3);
+        
+        /*
+         * A starts with B
+         *
+         * |-A--|
+         * |-B-|
+         *
+         * a.end > b.end && a.start == b.start
+         */
+        FRAME_t.put("startsWith", 1 << 4);
+        
+        /*
+         * A matches B
+         *
+         * |-A-|
+         * |-B-|
+         *
+         * a.end = b.end && a.start = b.start
+         */
+        FRAME_t.put("matches", 1 << 5);
+        
+        /*
+         * A is within B
+         *
+         *  |-A-|
+         * |--B--|
+         *
+         * a.end < b.end && a.start > b.start
+         */
+        FRAME_t.put("isWithin", 1 << 6);
+
+        /*
+         * A is around B
+         *
+         * |--A--|
+         *  |-B-|
+         *
+         * a.start < b.start && a.end > b.end
+         */
+        FRAME_t.put("isAround", 1 << 7);
+
+        /*
+         * A ends with B
+         *
+         * |-A--|
+         *  |-B-|
+         *
+         * a.start < b.start && a.end == b.end
+         */
+        FRAME_t.put("endsWith", 1 << 8);
+
+        /*
+         * A aligns B to the right
+         *
+         *  |-A-|
+         * |--B-|
+         *
+         * a.start > b.start && a.end == b.end
+         */
+        FRAME_t.put("alignsRight", 1 << 9);
+
+        /*
+         * A overlaps B to the right
+         *
+         *  |-A-|
+         * |-B-|
+         *
+         * a.start > b.start && a.start < b.end && && a.end > b.end
+         */
+        FRAME_t.put("overlapsRight", 1 << 10);
+
+        /*
+         * A succeeds B directly
+         *
+         *     |-A-|
+         * |-B-|
+         *
+         * a.start == b.end
+         */
+        FRAME_t.put("succeedsDirectly", 1 << 11);
+
+        /*
+         * A succeeds B
+         *
+         *       |-A-|
+         * |-B-|
+         *
+         * a.start > b.end
+         */
+        FRAME_t.put("succeeds", 1 << 12);
+        FRAME = Collections.unmodifiableMap(FRAME_t);
+    };
+
+    // Bitvector representing the frame constraint
+    public int vector;
+
+    public FrameConstraint () {
+        this.vector = 0;
+    };
+
+    public FrameConstraint or (String constraint) throws QueryException {
+        int or = FRAME.get(constraint);
+        if (or == 0)
+            throw new QueryException(706, "Frame type is unknown");
+
+        this.vector |= or;
+        return this;
+    };
+
+    public FrameConstraint or (FrameConstraint constraint) {
+        this.vector |= constraint.vector;
+        return this;
+    };
+
+    public FrameConstraint invert () {
+        this.vector ^= FRAME_ALL;
+        return this;
+    };
+
+
+    /**
+     * Check for constraint per bit vector.
+     */
+    public boolean check (int check) {
+        return (this.vector & check) != 0;
+    };
+
+
+    /**
+     * Check for constraint per FrameConstraint.
+     */
+    public boolean check (FrameConstraint check) {
+        return (this.vector & check.vector) != 0;
+    };
+
+
+    /**
+     * Check for constraint per string.
+     */
+    public boolean check (String constraint) throws QueryException {
+        int check = FRAME.get(constraint);
+        if (check == 0)
+            throw new QueryException(706, "Frame type is unknown");
+
+        return this.check(check);
+    };
+};
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
index e0d23cd..c25b187 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanWithinQuery.java
@@ -13,17 +13,18 @@
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermContext;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.util.Bits;
-import org.apache.lucene.util.ToStringUtils;
-import org.apache.lucene.search.spans.SpanQuery;
 import org.apache.lucene.index.AtomicReaderContext;
+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.SpanTermQuery;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.ToStringUtils;
 
 import de.ids_mannheim.korap.query.spans.WithinSpans;
 import de.ids_mannheim.korap.query.SpanElementQuery;
 
+
 /**
  * Matches spans that are within certain elements.
  */
@@ -35,75 +36,80 @@
     private boolean collectPayloads;
 
     public static final byte
-	OVERLAP      = WithinSpans.OVERLAP,
-	REAL_OVERLAP = WithinSpans.REAL_OVERLAP,
-	WITHIN       = WithinSpans.WITHIN,
-	REAL_WITHIN  = WithinSpans.REAL_WITHIN,
-	ENDSWITH     = WithinSpans.ENDSWITH,
-	STARTSWITH   = WithinSpans.STARTSWITH,
-	MATCH        = WithinSpans.MATCH;
+        OVERLAP      = WithinSpans.OVERLAP,
+        REAL_OVERLAP = WithinSpans.REAL_OVERLAP,
+        WITHIN       = WithinSpans.WITHIN,
+        REAL_WITHIN  = WithinSpans.REAL_WITHIN,
+        ENDSWITH     = WithinSpans.ENDSWITH,
+        STARTSWITH   = WithinSpans.STARTSWITH,
+        MATCH        = WithinSpans.MATCH;
 
     // may support "starting" and "ending"
 
+
     // Constructor
     public SpanWithinQuery (SpanQuery wrap,
-			    SpanQuery embedded,
-			    byte flag,
-			    boolean collectPayloads) {
+                            SpanQuery embedded,
+                            byte flag,
+                            boolean collectPayloads) {
 
-	this.field = embedded.getField();
-	this.embedded = embedded;
-	this.wrap = wrap;
-	this.flag = flag;
-	this.collectPayloads = collectPayloads;
-    };
-
-    // Constructor
-    public SpanWithinQuery(String element,
-			   SpanQuery embedded) {
-	this(element, embedded, WITHIN, true);
-    };
-
-    // Constructor
-    public SpanWithinQuery (String element,
-			    SpanQuery embedded,
-			    byte flag,
-			    boolean collectPayloads) {
-	this(
-	     (SpanQuery) new SpanElementQuery(embedded.getField(), element),
-	     embedded,
-	     flag,
-	     collectPayloads
-	);
+        this.field = embedded.getField();
+        this.embedded = embedded;
+        this.wrap = wrap;
+        this.flag = flag;
+        this.collectPayloads = collectPayloads;
     };
 
 
     // Constructor
     public SpanWithinQuery(String element,
-			   SpanQuery embedded,
-			   byte flag) {
-	this(element, embedded, flag, true);
+                           SpanQuery embedded) {
+        this(element, embedded, WITHIN, true);
     };
 
+
     // Constructor
     public SpanWithinQuery (String element,
-			    SpanQuery embedded,
-			    boolean collectPayloads) {
-	this(element, embedded, WITHIN, collectPayloads);
+                            SpanQuery embedded,
+                            byte flag,
+                            boolean collectPayloads) {
+        this(
+             (SpanQuery) new SpanElementQuery(embedded.getField(), element),
+             embedded,
+             flag,
+             collectPayloads
+             );
+    };
+
+
+    // Constructor
+    public SpanWithinQuery(String element,
+                           SpanQuery embedded,
+                           byte flag) {
+        this(element, embedded, flag, true);
+    };
+
+
+    // Constructor
+    public SpanWithinQuery (String element,
+                            SpanQuery embedded,
+                            boolean collectPayloads) {
+        this(element, embedded, WITHIN, collectPayloads);
     };
 
 
     // Constructor
     public SpanWithinQuery(SpanQuery wrap,
-			   SpanQuery embedded,
-			   byte flag) {
-	this(wrap, embedded, flag, true);
+                           SpanQuery embedded,
+                           byte flag) {
+        this(wrap, embedded, flag, true);
     };
 
+
     // Constructor
     public SpanWithinQuery(SpanQuery wrap,
-			   SpanQuery embedded) {
-	this(wrap, embedded, WITHIN, true);
+                           SpanQuery embedded) {
+        this(wrap, embedded, WITHIN, true);
     };
 
 
@@ -112,122 +118,130 @@
     public SpanQuery wrap()     { return wrap;     };
     public SpanQuery embedded() { return embedded; };
     public byte flag()          { return flag; };
-  
+
+    
     @Override
     public void extractTerms(Set<Term> terms) {
-	embedded.extractTerms(terms);
+        embedded.extractTerms(terms);
     };
   
+
     @Override
     public String toString(String field) {
-	StringBuilder buffer = new StringBuilder();
-	buffer.append("span");
-	buffer.append(flagToString());
-	buffer.append("(");
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("span");
+        buffer.append(flagToString());
+        buffer.append("(");
         buffer.append(wrap.toString());
         buffer.append(", ");
-	buffer.append(embedded.toString(field));
-	buffer.append(")");
-	buffer.append(ToStringUtils.boost(getBoost()));
-	return buffer.toString();
+        buffer.append(embedded.toString(field));
+        buffer.append(")");
+        buffer.append(ToStringUtils.boost(getBoost()));
+        return buffer.toString();
     };
     
+
     private String flagToString () {
-	switch (flag) {
-	case OVERLAP:
-	    return "Overlap";
-	case REAL_OVERLAP:
-	    return "OverlapStrict";
-	case WITHIN:
-	    return "Contain";
-	case REAL_WITHIN:
-	    return "ContainStrict";
-	case ENDSWITH:
-	    return "EndsWith";
-	case STARTSWITH:
-	    return "StartsWith";
-	case MATCH:
-	    return "Match";
-	};
-	return "Contains";
+        switch (flag) {
+        case OVERLAP:
+            return "Overlap";
+        case REAL_OVERLAP:
+            return "OverlapStrict";
+        case WITHIN:
+            return "Contain";
+        case REAL_WITHIN:
+            return "ContainStrict";
+        case ENDSWITH:
+            return "EndsWith";
+        case STARTSWITH:
+            return "StartsWith";
+        case MATCH:
+            return "Match";
+        };
+        return "Contains";
     };
 
+
     @Override
     public Spans getSpans (final AtomicReaderContext context,
-			   Bits acceptDocs,
-			   Map<Term,TermContext> termContexts) throws IOException {
-	return (Spans) new WithinSpans (
+                           Bits acceptDocs,
+                           Map<Term,TermContext> termContexts) throws IOException {
+        return (Spans) new WithinSpans (
             this, context, acceptDocs, termContexts, this.flag
-	);
+        );
     };
+    
 
     /*
      * Rewrite query in case it includes regular expressions or wildcards
      */
     @Override
     public Query rewrite (IndexReader reader) throws IOException {
-	SpanWithinQuery clone = null;
+        SpanWithinQuery clone = null;
 
-	// Does the embedded query needs a rewrite?
-	SpanQuery query = (SpanQuery) embedded.rewrite(reader);
-	if (query != embedded) {
-	    if (clone == null)
-		clone = this.clone();
-	    clone.embedded = query;
-	};
+        // Does the embedded query needs a rewrite?
+        SpanQuery query = (SpanQuery) embedded.rewrite(reader);
+        if (query != embedded) {
+            if (clone == null)
+                clone = this.clone();
+            clone.embedded = query;
+        };
 
-	// Does the wrap query needs a rewrite?
-	query = (SpanQuery) wrap.rewrite(reader);
-	if (query != wrap) {
-	    if (clone == null)
-		clone = this.clone();
-	    clone.wrap = query;
-	};
+        // Does the wrap query needs a rewrite?
+        query = (SpanQuery) wrap.rewrite(reader);
+        if (query != wrap) {
+            if (clone == null)
+                clone = this.clone();
+            clone.wrap = 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 SpanWithinQuery clone () {
-	SpanWithinQuery spanWithinQuery = new SpanWithinQuery(
+        SpanWithinQuery spanWithinQuery = new SpanWithinQuery(
             (SpanQuery) wrap.clone(),
-	    (SpanQuery) embedded.clone(),
-	    this.flag,
-	    this.collectPayloads
+            (SpanQuery) embedded.clone(),
+            this.flag,
+            this.collectPayloads
         );
-	spanWithinQuery.setBoost(getBoost());
-	return spanWithinQuery;
+        spanWithinQuery.setBoost(getBoost());
+        return spanWithinQuery;
     };
 
 
-    /** Returns true iff <code>o</code> is equal to this. */
+    /**
+     * Returns true iff <code>o</code> is equal to this.
+     */
     @Override
     public boolean equals(Object o) {
-	if (this == o) return true;
-	if (!(o instanceof SpanWithinQuery)) return false;
-	
-	final SpanWithinQuery spanWithinQuery = (SpanWithinQuery) o;
-	
-	if (collectPayloads != spanWithinQuery.collectPayloads) return false;
-	if (!wrap.equals(spanWithinQuery.wrap)) return false;
-	if (!embedded.equals(spanWithinQuery.embedded)) return false;
-
-	return getBoost() == spanWithinQuery.getBoost();
+        if (this == o) return true;
+        if (!(o instanceof SpanWithinQuery)) return false;
+        
+        final SpanWithinQuery spanWithinQuery = (SpanWithinQuery) o;
+        
+        if (collectPayloads != spanWithinQuery.collectPayloads) return false;
+        if (!wrap.equals(spanWithinQuery.wrap)) return false;
+        if (!embedded.equals(spanWithinQuery.embedded)) return false;
+        
+        return getBoost() == spanWithinQuery.getBoost();
     };
 
+
     // I don't know what I am doing here
     @Override
     public int hashCode() {
-	int result = flag;
-	result = embedded.hashCode();
-	result += wrap.hashCode();
-	result ^= (result << 4) | (result >>> 29);
-	result += Float.floatToRawIntBits(getBoost());
-	return result;
+        int result = flag;
+        result = embedded.hashCode();
+        result += wrap.hashCode();
+        result ^= (result << 4) | (result >>> 29);
+        result += Float.floatToRawIntBits(getBoost());
+        return result;
     };
 };
diff --git a/src/test/java/de/ids_mannheim/korap/query/TestFrameConstraint.java b/src/test/java/de/ids_mannheim/korap/query/TestFrameConstraint.java
new file mode 100644
index 0000000..37f038d
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/query/TestFrameConstraint.java
@@ -0,0 +1,201 @@
+package de.ids_mannheim.korap.query;
+
+import de.ids_mannheim.korap.query.FrameConstraint;
+import de.ids_mannheim.korap.util.QueryException;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * @author diewald
+ */
+@RunWith(JUnit4.class)
+public class TestFrameConstraint {
+
+    @Test
+    public void testInitialization () throws QueryException {
+        FrameConstraint fc = new FrameConstraint();
+        assertEquals(fc.check(1), false);
+    };
+
+    @Test
+    public void testBitVector () throws QueryException {
+        int a = 1;
+        int b = 1 << 1;
+
+        assertEquals(3, a ^ b);
+    };
+
+    @Test
+    public void testOr () throws QueryException {
+        FrameConstraint fc = new FrameConstraint();
+
+        // Nothing set
+        assertEquals(fc.check("precedes"),         false);
+        assertEquals(fc.check("precedesDirectly"), false);
+        assertEquals(fc.check("overlapsLeft"),     false);
+        assertEquals(fc.check("alignsLeft"),       false);
+        assertEquals(fc.check("startsWith"),       false);
+        assertEquals(fc.check("matches"),          false);
+        assertEquals(fc.check("isWithin"),         false);
+        assertEquals(fc.check("isAround"),         false);
+        assertEquals(fc.check("endsWith"),         false);
+        assertEquals(fc.check("alignsRight"),      false);
+        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("succeedsDirectly"), false);
+        assertEquals(fc.check("succeeds"),         false);
+
+        // Some or
+        fc.or("succeeds").or("succeedsDirectly");
+        assertEquals(fc.check("precedes"),         false);
+        assertEquals(fc.check("precedesDirectly"), false);
+        assertEquals(fc.check("overlapsLeft"),     false);
+        assertEquals(fc.check("alignsLeft"),       false);
+        assertEquals(fc.check("startsWith"),       false);
+        assertEquals(fc.check("matches"),          false);
+        assertEquals(fc.check("isWithin"),         false);
+        assertEquals(fc.check("isAround"),         false);
+        assertEquals(fc.check("endsWith"),         false);
+        assertEquals(fc.check("alignsRight"),      false);
+        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("succeedsDirectly"), true);
+        assertEquals(fc.check("succeeds"),         true);
+
+        // Moar or
+        fc.or("precedes").or("precedesDirectly");
+        assertEquals(fc.check("precedes"),         true);
+        assertEquals(fc.check("precedesDirectly"), true);
+        assertEquals(fc.check("overlapsLeft"),     false);
+        assertEquals(fc.check("alignsLeft"),       false);
+        assertEquals(fc.check("startsWith"),       false);
+        assertEquals(fc.check("matches"),          false);
+        assertEquals(fc.check("isWithin"),         false);
+        assertEquals(fc.check("isAround"),         false);
+        assertEquals(fc.check("endsWith"),         false);
+        assertEquals(fc.check("alignsRight"),      false);
+        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("succeedsDirectly"), true);
+        assertEquals(fc.check("succeeds"),         true);
+
+        // Moar or
+        fc.or("matches").or("startsWith");
+        assertEquals(fc.check("precedes"),         true);
+        assertEquals(fc.check("precedesDirectly"), true);
+        assertEquals(fc.check("overlapsLeft"),     false);
+        assertEquals(fc.check("alignsLeft"),       false);
+        assertEquals(fc.check("startsWith"),       true);
+        assertEquals(fc.check("matches"),          true);
+        assertEquals(fc.check("isWithin"),         false);
+        assertEquals(fc.check("isAround"),         false);
+        assertEquals(fc.check("endsWith"),         false);
+        assertEquals(fc.check("alignsRight"),      false);
+        assertEquals(fc.check("overlapsRight"),    false);
+        assertEquals(fc.check("succeedsDirectly"), true);
+        assertEquals(fc.check("succeeds"),         true);
+
+        // Invert
+        fc.invert();
+        assertEquals(fc.check("precedes"),         false);
+        assertEquals(fc.check("precedesDirectly"), false);
+        assertEquals(fc.check("overlapsLeft"),     true);
+        assertEquals(fc.check("alignsLeft"),       true);
+        assertEquals(fc.check("startsWith"),       false);
+        assertEquals(fc.check("matches"),          false);
+        assertEquals(fc.check("isWithin"),         true);
+        assertEquals(fc.check("isAround"),         true);
+        assertEquals(fc.check("endsWith"),         true);
+        assertEquals(fc.check("alignsRight"),      true);
+        assertEquals(fc.check("overlapsRight"),    true);
+        assertEquals(fc.check("succeedsDirectly"), false);
+        assertEquals(fc.check("succeeds"),         false);
+
+
+        fc.or("precedes").
+            or("precedesDirectly").
+            or("startsWith").
+            or("matches");
+        assertEquals(fc.check("precedes"),         true);
+        assertEquals(fc.check("precedesDirectly"), true);
+        assertEquals(fc.check("overlapsLeft"),     true);
+        assertEquals(fc.check("alignsLeft"),       true);
+        assertEquals(fc.check("startsWith"),       true);
+        assertEquals(fc.check("matches"),          true);
+        assertEquals(fc.check("isWithin"),         true);
+        assertEquals(fc.check("isAround"),         true);
+        assertEquals(fc.check("endsWith"),         true);
+        assertEquals(fc.check("alignsRight"),      true);
+        assertEquals(fc.check("overlapsRight"),    true);
+        assertEquals(fc.check("succeedsDirectly"), false);
+        assertEquals(fc.check("succeeds"),         false);
+
+        fc.or("succeeds").
+            or("succeedsDirectly");
+        assertEquals(fc.check("precedes"),         true);
+        assertEquals(fc.check("precedesDirectly"), true);
+        assertEquals(fc.check("overlapsLeft"),     true);
+        assertEquals(fc.check("alignsLeft"),       true);
+        assertEquals(fc.check("startsWith"),       true);
+        assertEquals(fc.check("matches"),          true);
+        assertEquals(fc.check("isWithin"),         true);
+        assertEquals(fc.check("isAround"),         true);
+        assertEquals(fc.check("endsWith"),         true);
+        assertEquals(fc.check("alignsRight"),      true);
+        assertEquals(fc.check("overlapsRight"),    true);
+        assertEquals(fc.check("succeedsDirectly"), true);
+        assertEquals(fc.check("succeeds"),         true);
+    };
+
+    @Test
+    public void testOrVector () throws QueryException {
+        FrameConstraint fc1 = new FrameConstraint();
+        // Some or
+        fc1.or("succeeds").or("succeedsDirectly");
+        assertEquals(fc1.check("precedes"),         false);
+        assertEquals(fc1.check("precedesDirectly"), false);
+        assertEquals(fc1.check("overlapsLeft"),     false);
+        assertEquals(fc1.check("alignsLeft"),       false);
+        assertEquals(fc1.check("startsWith"),       false);
+        assertEquals(fc1.check("matches"),          false);
+        assertEquals(fc1.check("isWithin"),         false);
+        assertEquals(fc1.check("isAround"),         false);
+        assertEquals(fc1.check("endsWith"),         false);
+        assertEquals(fc1.check("alignsRight"),      false);
+        assertEquals(fc1.check("overlapsRight"),    false);
+        assertEquals(fc1.check("succeedsDirectly"), true);
+        assertEquals(fc1.check("succeeds"),         true);
+
+        FrameConstraint fc2 = new FrameConstraint();
+        fc2.or("precedes").or("precedesDirectly");
+        assertEquals(fc2.check("precedes"),         true);
+        assertEquals(fc2.check("precedesDirectly"), true);
+        assertEquals(fc2.check("overlapsLeft"),     false);
+        assertEquals(fc2.check("alignsLeft"),       false);
+        assertEquals(fc2.check("startsWith"),       false);
+        assertEquals(fc2.check("matches"),          false);
+        assertEquals(fc2.check("isWithin"),         false);
+        assertEquals(fc2.check("isAround"),         false);
+        assertEquals(fc2.check("endsWith"),         false);
+        assertEquals(fc2.check("alignsRight"),      false);
+        assertEquals(fc2.check("overlapsRight"),    false);
+        assertEquals(fc2.check("succeedsDirectly"), false);
+        assertEquals(fc2.check("succeeds"),         false);
+
+        fc1.or(fc2);
+        assertEquals(fc1.check("precedes"),         true);
+        assertEquals(fc1.check("precedesDirectly"), true);
+        assertEquals(fc1.check("overlapsLeft"),     false);
+        assertEquals(fc1.check("alignsLeft"),       false);
+        assertEquals(fc1.check("startsWith"),       false);
+        assertEquals(fc1.check("matches"),          false);
+        assertEquals(fc1.check("isWithin"),         false);
+        assertEquals(fc1.check("isAround"),         false);
+        assertEquals(fc1.check("endsWith"),         false);
+        assertEquals(fc1.check("alignsRight"),      false);
+        assertEquals(fc1.check("overlapsRight"),    false);
+        assertEquals(fc1.check("succeedsDirectly"), true);
+        assertEquals(fc1.check("succeeds"),         true);
+    };
+};
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java b/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java
index 87dc893..a4bbf12 100644
--- a/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java
+++ b/src/test/java/de/ids_mannheim/korap/search/TestKorapSearch.java
@@ -1154,7 +1154,7 @@
 
         assertEquals(
             kr.getError(0).getMessage(),
-            "Number of operands is not acceptable"
+            "Operation needs operand list"
         );
     };
 
diff --git a/src/test/resources/queries/benchmark1.jsonld b/src/test/resources/queries/benchmark1.jsonld
index 79403b4..dccdeef 100644
--- a/src/test/resources/queries/benchmark1.jsonld
+++ b/src/test/resources/queries/benchmark1.jsonld
@@ -3,7 +3,7 @@
     "query": {
 	"@type": "korap:group", 
 	"operation": "operation:position", 
-	"frame": "frame:contains",
+	"frames": ["frames:isAround"],
 	"operands": [
 	    {
 		"@type": "korap:span",
diff --git a/src/test/resources/queries/benchmark1b.jsonld b/src/test/resources/queries/benchmark1b.jsonld
index aa1e729..5ee9791 100644
--- a/src/test/resources/queries/benchmark1b.jsonld
+++ b/src/test/resources/queries/benchmark1b.jsonld
@@ -3,7 +3,7 @@
     "query": {
 	"@type": "korap:group", 
 	"operation": "operation:position", 
-	"frame": "frame:contains",
+	"frames": ["frames:isAround"],
 	"operands": [
 	    {
 		"@type": "korap:span",
@@ -14,7 +14,7 @@
 	    {
 		"@type" : "korap:group",
 		"operation" : "operation:class",
-		"class" : 1,
+		"classOut" : 1,
 		"operands" : [
 		    {
 			"@type": "korap:token",
diff --git a/src/test/resources/queries/benchmark5-submatch.jsonld b/src/test/resources/queries/benchmark5-submatch.jsonld
index a9cad71..885b458 100644
--- a/src/test/resources/queries/benchmark5-submatch.jsonld
+++ b/src/test/resources/queries/benchmark5-submatch.jsonld
@@ -13,14 +13,13 @@
 		}
 	    },
 	    {
-		"@type" : "korap:group",
-		"operation" : "operation:submatch",
+		"@type" : "korap:reference",
 		"classRef" : [2],
 		"operands" : [
 		    {
 			"@type" : "korap:group",
 			"operation" : "operation:class",
-			"class" : 1,
+			"classOut" : 1,
 			"operands" : [
 			    {
 				"@type": "korap:group", 
@@ -37,7 +36,7 @@
 				    {
 					"@type" : "korap:group",
 					"operation" : "operation:class",
-					"class" : 2,
+					"classOut" : 2,
 					"operands" : [
 					    {
 						"@type": "korap:token",
diff --git a/src/test/resources/queries/benchmark5.jsonld b/src/test/resources/queries/benchmark5.jsonld
index 332d23f..1f64527 100644
--- a/src/test/resources/queries/benchmark5.jsonld
+++ b/src/test/resources/queries/benchmark5.jsonld
@@ -15,7 +15,7 @@
 	    {
 		"@type" : "korap:group",
 		"operation" : "operation:class",
-		"class" : 1,
+		"classOut" : 1,
 		"operands" : [
 		    {
 			"@type": "korap:group", 
@@ -32,7 +32,7 @@
 			    {
 				"@type" : "korap:group",
 				"operation" : "operation:class",
-				"class" : 2,
+				"classOut" : 2,
 				"operands" : [
 				    {
 					"@type": "korap:token",
diff --git a/src/test/resources/queries/bsp-bug.jsonld b/src/test/resources/queries/bsp-bug.jsonld
index 33bb904..e46374e 100644
--- a/src/test/resources/queries/bsp-bug.jsonld
+++ b/src/test/resources/queries/bsp-bug.jsonld
@@ -1,8 +1,7 @@
 {
   "@context": "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
-    "@type": "korap:group",
-    "operation" : "operation:submatch",
+    "@type": "korap:reference",
     "classRef" : [0],
     "operands" : []
   },
diff --git a/src/test/resources/queries/bsp-class-2.jsonld b/src/test/resources/queries/bsp-class-2.jsonld
index 162070f..4cccfa5 100644
--- a/src/test/resources/queries/bsp-class-2.jsonld
+++ b/src/test/resources/queries/bsp-class-2.jsonld
@@ -3,7 +3,7 @@
     "query" : {
       "@type" : "korap:group",
       "operation" : "operation:class",
-      "class" : 0,
+      "classOut" : 0,
       "operands" : [ {
         "@type" : "korap:token",
         "wrap" : {
diff --git a/src/test/resources/queries/bsp-class.jsonld b/src/test/resources/queries/bsp-class.jsonld
index b4fd65e..f095a47 100644
--- a/src/test/resources/queries/bsp-class.jsonld
+++ b/src/test/resources/queries/bsp-class.jsonld
@@ -3,7 +3,7 @@
   "query":{
     "@type":"korap:group",
     "operation" : "operation:class",
-   "class":1,
+   "classOut":1,
     "operands":[
       {
 	"@type":"korap:group",
diff --git a/src/test/resources/queries/bsp-fail1.jsonld b/src/test/resources/queries/bsp-fail1.jsonld
index 7425bc1..fc6fb51 100644
--- a/src/test/resources/queries/bsp-fail1.jsonld
+++ b/src/test/resources/queries/bsp-fail1.jsonld
@@ -2,7 +2,7 @@
   "@context": "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
     "query": {
         "@type": "korap:group", 
-        "frame": "frame:contains", 
+        "frames": ["frame:isAround"], 
         "operation": "operation:position"
         "operands": [
             {
diff --git a/src/test/resources/queries/bsp-fail2.jsonld b/src/test/resources/queries/bsp-fail2.jsonld
index dc4ace2..96a3bb5 100644
--- a/src/test/resources/queries/bsp-fail2.jsonld
+++ b/src/test/resources/queries/bsp-fail2.jsonld
@@ -3,7 +3,7 @@
   "query": {
     "@type": "korap:group", 
     "operation": "operation:position",
-    "frame": "frame:contains", 
+    "frames": ["frames:isAround"], 
     "operands": [
       {
         "@type": "korap:span", 
diff --git a/src/test/resources/queries/bsp-startswith.json b/src/test/resources/queries/bsp-startswith.json
index c986a5a..95df8b9 100644
--- a/src/test/resources/queries/bsp-startswith.json
+++ b/src/test/resources/queries/bsp-startswith.json
@@ -1 +1,13 @@
-{"@context":{"korap":"http://korap.ids-mannheim.de/ns/query","@language":"de","operands":{"@id":"korap:operands","@container":"@list"},"relation":{"@id":"korap:relation","@type":"korap:relation#types"},"class":{"@id":"korap:class","@type":"xsd:integer"},"query":"korap:query","filter":"korap:filter","meta":"korap:meta"},"query":{"@type":"korap:group","relation":"position","position":"startswith","operands":[{"@type":"korap:element","@value":"s"},{"@type":"korap:sequence","operands":[{"@type":"korap:group","class":"0","operands":[{"@type":"korap:token","@value":{"@type":"korap:term","@value":"tt_p:ADJA","relation":"="}}]},{"@type":"korap:token","@value":{"@type":"korap:term","@value":"mate_p:NN","relation":"="}}]}]},"meta":[{"@type":"korap:meta-filter","@value":{"@type":"korap:term","@field":"korap:field#corpusID","@value":"A00"}},{"@type":"korap:meta-extend","@value":{"@type":"korap:term","@field":"korap:field#corpusID","@value":"A01"}}],"startPage":1,"count":50,"context":{"left":["token",6],"right":["token",6]}}
+{
+  "@context":"http://korap.ids-mannheim.de/ns/query/context.json.ld",
+  "query":{
+    "@type":"korap:group",
+    "relation":"position",
+    "frames":[
+      "frames:startsWith"
+    ],
+    "operands":[
+      {
+	"@type":"korap:element",
+	"@value":"s"
+      },{"@type":"korap:sequence","operands":[{"@type":"korap:group","class":"0","operands":[{"@type":"korap:token","@value":{"@type":"korap:term","@value":"tt_p:ADJA","relation":"="}}]},{"@type":"korap:token","@value":{"@type":"korap:term","@value":"mate_p:NN","relation":"="}}]}]},"meta":[{"@type":"korap:meta-filter","@value":{"@type":"korap:term","@field":"korap:field#corpusID","@value":"A00"}},{"@type":"korap:meta-extend","@value":{"@type":"korap:term","@field":"korap:field#corpusID","@value":"A01"}}],"startPage":1,"count":50,"context":{"left":["token",6],"right":["token",6]}}
diff --git a/src/test/resources/queries/bsp10.jsonld b/src/test/resources/queries/bsp10.jsonld
index 643edc3..384175d 100644
--- a/src/test/resources/queries/bsp10.jsonld
+++ b/src/test/resources/queries/bsp10.jsonld
@@ -1,105 +1,5 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
     "@type": "korap:group", 
     "operation" : "operation:sequence",
diff --git a/src/test/resources/queries/bsp12.jsonld b/src/test/resources/queries/bsp12.jsonld
index 4db4b95..6b7a7b5 100644
--- a/src/test/resources/queries/bsp12.jsonld
+++ b/src/test/resources/queries/bsp12.jsonld
@@ -1,109 +1,9 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
     "@type": "korap:group", 
     "operation": "operation:position", 
-    "frame": "frame:contains",
+    "frames": ["frames:isAround"],
     "operands": [
       {
         "@type": "korap:span", 
diff --git a/src/test/resources/queries/bsp13.jsonld b/src/test/resources/queries/bsp13.jsonld
index bb177ee..879fbf5 100644
--- a/src/test/resources/queries/bsp13.jsonld
+++ b/src/test/resources/queries/bsp13.jsonld
@@ -1,108 +1,8 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
     "@type": "korap:group", 
-    "frame": "frame:startswith", 
+    "frames": ["frames:startsWith", "frames:alignsLeft", "frames:matches"], 
     "operation": "operation:position",
     "operands": [
       {
diff --git a/src/test/resources/queries/bsp13b.jsonld b/src/test/resources/queries/bsp13b.jsonld
index 6a4b19e..077aeff 100644
--- a/src/test/resources/queries/bsp13b.jsonld
+++ b/src/test/resources/queries/bsp13b.jsonld
@@ -1,108 +1,8 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
     "@type": "korap:group", 
-    "frame": "frame:startswith", 
+    "frames": ["frames:startsWith", "frames:alignsLeft", "frames:matches"],
     "operation": "operation:position",
     "operands": [
       {
diff --git a/src/test/resources/queries/bsp17.jsonld b/src/test/resources/queries/bsp17.jsonld
index 2df7268..8d9eca8 100644
--- a/src/test/resources/queries/bsp17.jsonld
+++ b/src/test/resources/queries/bsp17.jsonld
@@ -1,109 +1,9 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
     "@type": "korap:group", 
     "operation": "operation:position",
-    "frame": "frame:within", 
+    "frames": ["frames:isWithin"], 
     "operands": [
       {
         "@type": "korap:span", 
diff --git a/src/test/resources/queries/bsp18.jsonld b/src/test/resources/queries/bsp18.jsonld
index 99afb29..f0c2fc2 100644
--- a/src/test/resources/queries/bsp18.jsonld
+++ b/src/test/resources/queries/bsp18.jsonld
@@ -13,7 +13,7 @@
     "operands" : [ {
       "@type" : "korap:group",
       "operation" : "operation:class",
-      "class" : 1,
+      "classOut" : 1,
       "operands" : [ {
         "@type" : "korap:token",
         "wrap" : {
diff --git a/src/test/resources/queries/bsp3.jsonld b/src/test/resources/queries/bsp3.jsonld
index 0e76838..b662b72 100644
--- a/src/test/resources/queries/bsp3.jsonld
+++ b/src/test/resources/queries/bsp3.jsonld
@@ -1,114 +1,13 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
-    "@type": "korap:group", 
-    "operation": "operation:submatch", 
+    "@type": "korap:reference", 
     "classRef": [1],
     "operands": [
       {
         "@type": "korap:group", 
         "operation" : "operation:class",
-        "class": 1, 
+        "classOut": 1, 
         "operands": [
           {
             "@type": "korap:token", 
diff --git a/src/test/resources/queries/bsp4.jsonld b/src/test/resources/queries/bsp4.jsonld
index 3a0c3c4..6cea948 100644
--- a/src/test/resources/queries/bsp4.jsonld
+++ b/src/test/resources/queries/bsp4.jsonld
@@ -1,108 +1,7 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
-    "@type": "korap:group", 
-    "operation": "operation:submatch", 
+    "@type": "korap:reference", 
     "classRef": [1],
     "operands": [
       {
@@ -112,7 +11,7 @@
           {
             "@type": "korap:group", 
 	    "operation":"operation:class",
-            "class": 1, 
+            "classOut": 1, 
             "operands": [
               {
                 "@type": "korap:token", 
diff --git a/src/test/resources/queries/bsp5.jsonld b/src/test/resources/queries/bsp5.jsonld
index bebc438..b1dc6d8 100644
--- a/src/test/resources/queries/bsp5.jsonld
+++ b/src/test/resources/queries/bsp5.jsonld
@@ -1,108 +1,7 @@
 {
-  "@context" : {
-    "korap" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/",
-    "query" : "korap:query",
-    "meta" : "korap:meta",
-    "collections" : {
-      "@id" : "korap:collections",
-      "@container" : "@list"
-    },
-    "token" : "korap:token/",
-    "distance" : "korap:distance/",
-    "boundary" : "korap:boundary/",
-    "group" : "korap:group/",
-    "span" : "korap:span/",
-    "term" : "korap:term/",
-    "termGroup" : "korap:termGroup/",
-    "wrap" : "token:wrap",
-    "operation" : {
-      "@id" : "group:operation/",
-      "@type" : "@id"
-    },
-    "class" : {
-      "@id" : "group:class",
-      "@type" : "xsd:integer"
-    },
-    "operands" : {
-      "@id" : "group:operands",
-      "@container" : "@list"
-    },
-    "frame" : {
-      "@id" : "group:frame/",
-      "@type" : "@id"
-    },
-    "classRef" : {
-      "@id" : "group:classRef",
-      "@type" : "xsd:integer"
-    },
-    "spanRef" : {
-      "@id" : "group:spanRef",
-      "@type" : "xsd:integer"
-    },
-    "classRefOp" : {
-      "@id" : "group:classRefOp",
-      "@type" : "@id"
-    },
-    "min" : {
-      "@id" : "boundary:min",
-      "@type" : "xsd:integer"
-    },
-    "max" : {
-      "@id" : "boundary:max",
-      "@type" : "xsd:integer"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "distances" : {
-      "@id" : "group:distances",
-      "@container" : "@list"
-    },
-    "inOrder" : {
-      "@id" : "group:inOrder",
-      "@type" : "xsd:boolean"
-    },
-    "exclude" : {
-      "@id" : "group:exclude",
-      "@type" : "xsd:boolean"
-    },
-    "key" : {
-      "@id" : "korap:key",
-      "@type" : "xsd:string"
-    },
-    "foundry" : {
-      "@id" : "korap:foundry",
-      "@type" : "xsd:string"
-    },
-    "layer" : {
-      "@id" : "korap:layer",
-      "@type" : "xsd:string"
-    },
-    "value" : {
-      "@id" : "korap:value",
-      "@type" : "xsd:string"
-    },
-    "caseInsensitive" : {
-      "@id" : "term:caseInsensitive",
-      "@type" : "xsd:boolean"
-    },
-    "type" : {
-      "@id" : "term:type/",
-      "@type" : "@id"
-    },
-    "match" : {
-      "@id" : "term:match/",
-      "@type" : "@id"
-    },
-    "relation" : {
-      "@id" : "korap:relation/",
-      "@type" : "@id"
-    }
-  },
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query": {
-    "@type": "korap:group", 
-    "operation": "operation:submatch",
+    "@type": "korap:reference",
     "classRef": [1],
     "operands": [
       {
@@ -121,7 +20,7 @@
           {
             "@type": "korap:group", 
 	    "operation" : "operation:class",
-            "class": 1, 
+            "classOut": 1, 
             "operands": [
               {
                 "@type": "korap:token", 
diff --git a/src/test/resources/queries/cosmas16.json b/src/test/resources/queries/cosmas16.json
index b392098..852a964 100644
--- a/src/test/resources/queries/cosmas16.json
+++ b/src/test/resources/queries/cosmas16.json
@@ -1,20 +1,19 @@
 {
   "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query" : {
-    "@type" : "korap:group",
-    "operation" : "operation:submatch",
+    "@type" : "korap:reference",
     "classRef" : [ 1 ],
     "operands" : [ {
       "@type" : "korap:group",
       "operation" : "operation:position",
-      "frame" : "frame:startswith",
+      "frames" : ["frames:startsWith"],
       "operands" : [ {
         "@type" : "korap:span",
         "key" : "s"
       }, {
         "@type" : "korap:group",
         "operation" : "operation:class",
-        "class" : 1,
+        "classOut" : 1,
         "operands" : [ {
           "@type" : "korap:token",
           "wrap" : {
diff --git a/src/test/resources/queries/cosmas17.json b/src/test/resources/queries/cosmas17.json
index 1eec888..c0d1f5c 100644
--- a/src/test/resources/queries/cosmas17.json
+++ b/src/test/resources/queries/cosmas17.json
@@ -3,7 +3,7 @@
   "query" : {
     "@type" : "korap:group",
     "operation" : "operation:position",
-    "frame" : "frame:startswith",
+    "frames" : ["frames:startsWith", "frames:matches", "frames:alignsLeft"],
     "operands" : [ {
       "@type" : "korap:span",
       "key" : "s"
diff --git a/src/test/resources/queries/cosmas20.json b/src/test/resources/queries/cosmas20.json
index 86a7df6..5a4b745 100644
--- a/src/test/resources/queries/cosmas20.json
+++ b/src/test/resources/queries/cosmas20.json
@@ -1,20 +1,19 @@
 {
   "context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
   "query" : {
-    "@type" : "korap:group",
-    "operation" : "operation:submatch",
+    "@type" : "korap:reference",
     "classRef" : [ 1 ],
       "operands" : [ {
       "@type" : "korap:group",
       "operation" : "operation:position",
-      "frame" : "frame:endswith",
+      "frames" : ["frames:endsWith", "frames:matches", "frames:alignsRight"],
       "operands" : [ {
         "@type" : "korap:span",
         "key" : "s"
       }, {
         "@type" : "korap:group",
         "operation" : "operation:class",
-        "class" : 1,
+        "classOut" : 1,
         "operands" : [ {
           "@type" : "korap:token",
           "wrap" : {
diff --git a/src/test/resources/queries/poly1.json b/src/test/resources/queries/poly1.json
index bc1b138..77bc6b5 100644
--- a/src/test/resources/queries/poly1.json
+++ b/src/test/resources/queries/poly1.json
@@ -22,7 +22,6 @@
       "operands" : [
          {
             "@type" : "korap:group",
-            "class" : 1,
             "classOut" : 1,
             "operands" : [
                {
@@ -40,7 +39,6 @@
          },
          {
             "@type" : "korap:group",
-            "class" : 2,
             "classOut" : 2,
             "operands" : [
                {
diff --git a/src/test/resources/queries/poly2.json b/src/test/resources/queries/poly2.json
index 68bcadc..543da5e 100644
--- a/src/test/resources/queries/poly2.json
+++ b/src/test/resources/queries/poly2.json
@@ -18,9 +18,8 @@
    "meta" : {},
    "query" : {
       "@type" : "korap:group",
-      "frame" : "frame:contains",
       "frames" : [
-         "frames:contains"
+         "frames:isAround"
       ],
       "operands" : [
          {
@@ -88,4 +87,4 @@
    },
    "warnings" : []
 }
-  
\ No newline at end of file
+  
diff --git a/src/test/resources/queries/poly4.json b/src/test/resources/queries/poly4.json
index eb863e1..4d38ad4 100644
--- a/src/test/resources/queries/poly4.json
+++ b/src/test/resources/queries/poly4.json
@@ -42,7 +42,6 @@
             "operands" : [
                {
                   "@type" : "korap:group",
-                  "class" : 1,
                   "classOut" : 1,
                   "operands" : [
                      {
diff --git a/src/test/resources/queries/sequence/empty-first-class.jsonld b/src/test/resources/queries/sequence/empty-first-class.jsonld
index 89f44e3..f55d382 100644
--- a/src/test/resources/queries/sequence/empty-first-class.jsonld
+++ b/src/test/resources/queries/sequence/empty-first-class.jsonld
@@ -16,7 +16,7 @@
       "operands" : [
 	 {
 	     "@type" : "korap:group",
-	     "class" : 2,
+	     "classOut" : 2,
 	     "operation" : "operation:class",
 	     "operands" : [
              {
diff --git a/src/test/resources/queries/sequence/empty-last-class.jsonld b/src/test/resources/queries/sequence/empty-last-class.jsonld
index e2591e7..9a5ad5e 100644
--- a/src/test/resources/queries/sequence/empty-last-class.jsonld
+++ b/src/test/resources/queries/sequence/empty-last-class.jsonld
@@ -25,7 +25,7 @@
          },
 	 {
 	     "@type" : "korap:group",
-	     "class" : 3,
+	     "classOut" : 3,
 	     "operation" : "operation:class",
 	     "operands" : [
              {
diff --git a/src/test/resources/queries/sequence/empty-middle-class.jsonld b/src/test/resources/queries/sequence/empty-middle-class.jsonld
index 865bfa1..9203e5e 100644
--- a/src/test/resources/queries/sequence/empty-middle-class.jsonld
+++ b/src/test/resources/queries/sequence/empty-middle-class.jsonld
@@ -25,7 +25,7 @@
          },
 	 {
 	     "@type" : "korap:group",
-	     "class" : 1,
+	     "classOut" : 1,
 	     "operation" : "operation:class",
 	     "operands" : [
 	 	 {
diff --git a/src/test/resources/queries/sequence/empty-surround-class-2.jsonld b/src/test/resources/queries/sequence/empty-surround-class-2.jsonld
index 5f15478..f927e59 100644
--- a/src/test/resources/queries/sequence/empty-surround-class-2.jsonld
+++ b/src/test/resources/queries/sequence/empty-surround-class-2.jsonld
@@ -5,7 +5,7 @@
       "operands" : [
 	 {
 	     "@type" : "korap:group",
-	     "class" : 3,
+	     "classOut" : 3,
 	     "operation" : "operation:class",
 	     "operands" : [
 	     	 {
@@ -24,7 +24,7 @@
          },
 	 {
 	     "@type" : "korap:group",
-	     "class" : 2,
+	     "classOut" : 2,
 	     "operation" : "operation:class",
 	     "operands" : [
 	     	 {
diff --git a/src/test/resources/queries/sequence/empty-surround-class.jsonld b/src/test/resources/queries/sequence/empty-surround-class.jsonld
index 2c5846f..b9a44d0 100644
--- a/src/test/resources/queries/sequence/empty-surround-class.jsonld
+++ b/src/test/resources/queries/sequence/empty-surround-class.jsonld
@@ -18,7 +18,7 @@
          },
 	 {
 	     "@type" : "korap:group",
-	     "class" : 2,
+	     "classOut" : 2,
 	     "operation" : "operation:class",
 	     "operands" : [
 	     	 {
diff --git a/src/test/resources/queries/sequence/empty-surround-repetition-class.jsonld b/src/test/resources/queries/sequence/empty-surround-repetition-class.jsonld
index 8a584dc..ec34606 100644
--- a/src/test/resources/queries/sequence/empty-surround-repetition-class.jsonld
+++ b/src/test/resources/queries/sequence/empty-surround-repetition-class.jsonld
@@ -14,7 +14,7 @@
 	"operands" : [
 	  {
 	    "@type" : "korap:group",
-	    "class" : 1,
+	    "classOut" : 1,
 	    "operation" : "operation:class",
 	    "operands" : [
 	      {
@@ -36,7 +36,7 @@
       },
       {
 	"@type" : "korap:group",
-	"class" : 2,
+	"classOut" : 2,
 	"operation" : "operation:class",
 	"operands" : [
 	  {
diff --git a/src/test/resources/queries/sequence/negative-last-class-repetition-2.jsonld b/src/test/resources/queries/sequence/negative-last-class-repetition-2.jsonld
index 4d93449..0d7207a 100644
--- a/src/test/resources/queries/sequence/negative-last-class-repetition-2.jsonld
+++ b/src/test/resources/queries/sequence/negative-last-class-repetition-2.jsonld
@@ -24,7 +24,7 @@
 	"operands" : [
 	  {
 	    "@type" : "korap:group",
-	    "class" : 2,
+	    "classOut" : 2,
 	    "operation" : "operation:class",
 	    "operands" : [
 	      {
diff --git a/src/test/resources/queries/sequence/negative-last-class-repetition.jsonld b/src/test/resources/queries/sequence/negative-last-class-repetition.jsonld
index 372e390..71cc4f3 100644
--- a/src/test/resources/queries/sequence/negative-last-class-repetition.jsonld
+++ b/src/test/resources/queries/sequence/negative-last-class-repetition.jsonld
@@ -15,7 +15,7 @@
       },
       {
 	"@type" : "korap:group",
-	"class" : 2,
+	"classOut" : 2,
 	"operation" : "operation:class",
 	"operands" : [
 	  {
diff --git a/src/test/resources/queries/sequence/negative-last-class.jsonld b/src/test/resources/queries/sequence/negative-last-class.jsonld
index 41e0d45..b668db6 100644
--- a/src/test/resources/queries/sequence/negative-last-class.jsonld
+++ b/src/test/resources/queries/sequence/negative-last-class.jsonld
@@ -15,7 +15,7 @@
          },
         {
 	  "@type" : "korap:group",
-	  "class" : 2,
+	  "classOut" : 2,
 	  "operation" : "operation:class",
 	  "operands" : [
 	    {
diff --git a/src/test/resources/queries/submatch/1.jsonld b/src/test/resources/queries/submatch/1.jsonld
index 4baa073..cc4a529 100644
--- a/src/test/resources/queries/submatch/1.jsonld
+++ b/src/test/resources/queries/submatch/1.jsonld
@@ -15,9 +15,8 @@
       "operands" : [
          {
             "@type" : "korap:group",
-            "frame" : "frame:contains",
             "frames" : [
-               "frames:contains"
+               "frames:isAround"
             ],
             "operands" : [
                {