deprecation path for 'frame'
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/AbstractSyntaxTree.java b/src/main/java/de/ids_mannheim/korap/query/serialize/AbstractSyntaxTree.java
index 02fa6f0..2de2d18 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/AbstractSyntaxTree.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/AbstractSyntaxTree.java
@@ -151,6 +151,40 @@
 		group.put("frames", Arrays.asList(allowedFrames));
 		group.put("sharedClasses", Arrays.asList(sharedClasses));
 		group.put("operands", new ArrayList<Object>());
+		// DEPRECATED 'frame'
+		String frame = "";
+		if (allowedFrames.length==0 && sharedClasses[0]=="includes") {
+			frame = "contains";
+		} else if (allowedFrames.length==0 && sharedClasses[0]=="intersects") {
+			frame = "overlaps";
+		} else if (allowedFrames[0]=="startswith" && sharedClasses[0]=="includes") {
+			frame = "startswith";
+		} else if (allowedFrames[0]=="endswith" && sharedClasses[0]=="includes") {
+			frame = "endswith";
+		} else if (allowedFrames[0]=="matches" && sharedClasses[0]=="includes" && sharedClasses.length==1) {
+			frame = "endswith";
+		} else if (allowedFrames[0]=="matches" && sharedClasses[0]=="includes" && sharedClasses[1]=="unequals") {
+			frame = "matches";
+		} else if (allowedFrames[0]=="matches" && sharedClasses[0]=="equals") {
+			frame = "matches";			
+		} else if (allowedFrames[0]=="contains" && sharedClasses[0]=="includes") {
+			frame = "contains";
+		} else if (allowedFrames[0]=="startswith" && sharedClasses[0]=="intersects") {
+			frame = "overlapsLeft";
+		} else if (allowedFrames[0]=="endswith" && sharedClasses[0]=="intersects") {
+			frame = "overlapsRight";
+		} else if (allowedFrames[0]=="matches" && sharedClasses[0]=="intersects") {
+			frame = "matches";
+		} else if (allowedFrames[0]=="matches" && sharedClasses[0]=="unequals") {
+			frame = "matches";
+		} else if (allowedFrames[0]=="matches" && sharedClasses[0]=="equals") {
+			frame = "matches";
+		} else if (allowedFrames[0]=="contains" && sharedClasses[0]=="intersects") {
+			frame = "contains";
+		}
+		group.put("frame", frame);
+		announcements.add("Deprecated 2014-09-22: 'frame' only to be supported until 3 months from deprecation date. " +
+				"Position frames are now expressed through 'frames' and 'sharedClasses'");
 		return group;
 	}
 	
@@ -255,6 +289,22 @@
 		return classGroup;
 	}
 	
+	/**
+	 * Ensures that a distance or quantification value does not exceed the allowed maximum value. 
+	 * @param number
+	 * @return The input number if it is below the allowed maximum value, else the maximum value. 
+	 */
+	protected int cropToMaxValue(int number) {
+		if (number > MAXIMUM_DISTANCE) {
+			number = MAXIMUM_DISTANCE; 
+			String warning = String.format("You specified a distance between two segments that is greater than " +
+					"the allowed max value of %d. Your query will be re-interpreted using a distance of %d.", MAXIMUM_DISTANCE, MAXIMUM_DISTANCE);
+			warnings.add(warning);
+			log.warn("User warning: "+warning);
+		}
+		return number;
+	}
+	
     /**
      * Returns the category (or 'label') of the root of a (sub-) ParseTree (ANTLR 3).
      *
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java b/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java
index 0a940de..22cfac2 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/AqlTree.java
@@ -698,19 +698,20 @@
 		 * For testing
 		 */
 		String[] queries = new String[] {
-				"cat=\"NP\" & cat=\"VP\" & #1 $ #2 ",
-				"Haus",
-				"lemma=\"Haus\"",
-				"Katze=\"Hund\"",
-				"cnx/c=\"NP\"",
-				"cat=\"NP\"",
-				"node & node & #1 .+ #2",
-				" #1 > #2 & cnx/cat=\"VP\" & cnx/cat=\"NP\"",
-				"\"Mann\" & node & #2 >[cat=\"NP\"] #1",
-				"node & node & #2 ->coref[val=\"true\"] #1",
-				"cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & #1 $ #2 > #3",
-				"tok=\"Mann\" & tok=\"geht\" & #1 .* #2",
-				"\"Sonne\""
+//				"cat=\"NP\" & cat=\"VP\" & #1 $ #2 ",
+//				"Haus",
+//				"lemma=\"Haus\"",
+//				"Katze=\"Hund\"",
+//				"cnx/c=\"NP\"",
+//				"cat=\"NP\"",
+//				"node & node & #1 .+ #2",
+//				" #1 > #2 & cnx/cat=\"VP\" & cnx/cat=\"NP\"",
+//				"\"Mann\" & node & #2 >[cat=\"NP\"] #1",
+//				"node & node & #2 ->coref[val=\"true\"] #1",
+//				"cat=\"NP\" & cat=\"VP\" & cat=\"PP\" & #1 $ #2 > #3",
+//				"tok=\"Mann\" & tok=\"geht\" & #1 .* #2",
+//				"\"Sonne\"",
+				"\"so\" & \"nicht\" & #1 .1,6 #2"
 		};
 		//		AqlTree.verbose=true;
 		for (String q : queries) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java b/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
index 2e8c44d..702f007 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/CosmasTree.java
@@ -51,9 +51,12 @@
      */
     int classCounter = 1;
     boolean negate = false;
-//    int wrapFirstOpInClass = -1;
-//    int wrapSecondOpInClass = -1;
-    
+
+    /**
+     * Allows for the definition of objects to be wrapped around the arguments of an operation.
+     * Each record in the table holds the parent node of the argument, the number of the argument 
+     * and an object in whose operands list the argument shall be wrapped.
+     */
     Table<Tree,Integer,LinkedHashMap<String,Object>> operandWrap = HashBasedTable.create();
 
     /**
@@ -685,19 +688,33 @@
         openNodeCats.pop();
     }
 
+    private void processSpanDistance(String meas, int min, int max) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	/**
+     * Registers an entry in the {@link #operandWrap} table in order to allow an operator's arguments
+     * (or only one of them) to be wrapped in a class group.
+     * @param node The operator node (parent node of the ARG1/ARG2 node)
+     * @param arg The argument number (1 or 2)
+     * @param cls The class id.
+     */
     private void wrapOperandInClass(Tree node, int arg, int cls) {
     	LinkedHashMap<String,Object> clsGroup = makeSpanClass(cls);
 		wrapOperand(node,arg,clsGroup);
 	}
 
+    /**
+     * Registers an entry in the {@link #operandWrap} table in order to allow an operator's arguments
+     * (or only one of them) to be wrapped in an arbitrary object, e.g. a reference group.
+     * @param node The operator node (parent node of the ARG1/ARG2 node)
+     * @param arg The argument number (1 or 2)
+     * @param container The object in whose operand list the argument shall be wrapped.
+     */
     private void wrapOperand(Tree node, int arg, LinkedHashMap<String, Object> container) {
     	operandWrap.put(node, arg, container);
   	}
-    
-	private void processSpanDistance(String meas, int parseInt, int parseInt2) {
-		// TODO Auto-generated method stub
-		
-	}
 
 	private Object translateMorph(String layer) {
         // todo: not very nicely solved! Does this require extension somehow? if not, why not use simple string comparison?!
@@ -769,8 +786,7 @@
         if (rangenode != null) {
             String range = rangenode.getChild(0).toStringTree().toLowerCase();
             if (range.equals("all")) {
-//            	wrapOperandInClass(node,2,classCounter);
-            	LinkedHashMap<String,Object> ref = makeResetReference();
+            	LinkedHashMap<String,Object> ref = makeResetReference(); // reset all defined classes
             	wrapOperand(node,2,ref);
             }
         }
@@ -1039,11 +1055,11 @@
 //                "Sonne /+w4 Mond",
 //                "#BED(der Mann , sa,-pa)",
 //        		"Sonne /+w1:4 Mond /-w1:7 Sterne",
-        		"wegen #IN('FE,ALL,%,MIN') <s>",
-        		"#NHIT(gehen /w1:10 voran)"
-        		
+//        		"wegen #IN('FE,ALL,%,MIN') <s>",
+//        		"#NHIT(gehen /w1:10 voran)"
+//        		"MORPH(V PRES IND)",
 //                "wegen #OV(F) <s>"
-                
+        		"Sonne /s0 Mond"
         };
 		CosmasTree.verbose=true;
         for (String q : queries) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusTree.java b/src/main/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusTree.java
index c29a69d..5d84526 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusTree.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/PoliqarpPlusTree.java
@@ -32,7 +32,7 @@
 	 */
 	public PoliqarpPlusTree(String query) throws QueryException {
 		process(query);
-		System.out.println(">>> " + requestMap.get("query") + " <<<");
+		System.out.println(">>> " + requestMap + " <<<");
 		log.info(">>> " + requestMap.get("query") + " <<<");
 	}
 
@@ -90,7 +90,8 @@
 				quantGroup.put("boundary", makeBoundary(minmax[0], minmax[1]));
 				if (minmax[0] != null) quantGroup.put("min", minmax[0]);
 				if (minmax[1] != null) quantGroup.put("max", minmax[1]);
-				announcements.add("Deprecated 2014-07-24: 'min' and 'max' to be supported until 3 months from deprecation date.");
+				announcements.add("Deprecated 2014-07-24: 'min' and 'max' to be " +
+						"supported until 3 months from deprecation date.");
 				putIntoSuperObject(quantGroup);
 				objectStack.push(quantGroup);
 				stackedObjects++;
@@ -107,16 +108,20 @@
 				ArrayList<Object> distances = new ArrayList<Object>();
 				distances.add(distance);
 				sequence.put("distances", distances);
-				visited.add(distanceNode.getChild(0));
+				visited.add(distanceNode.getChild(0)); // don't re-visit the emptyTokenSequence node
 			}
 			putIntoSuperObject(sequence);
 			objectStack.push(sequence);
 			stackedObjects++;
 		}
 		
+		/*
+		 * empty tokens at beginning/end of sequence
+		 */
 		if (nodeCat.equals("emptyTokenSequence")) {
 			Integer[] minmax = parseEmptySegments(node);
-			LinkedHashMap<String,Object> object;
+			// object will be either a repetition group or a single empty token
+			LinkedHashMap<String,Object> object; 
 			LinkedHashMap<String,Object> emptyToken = makeToken();
 			if (minmax[0] != 1 || minmax[1] == null || minmax[1] != 1) {
 				object = makeRepetition(minmax[0], minmax[1]);
@@ -153,7 +158,8 @@
 				term.put("match", "match:"+matches);
 				ParseTree flagNode = getFirstChildWithCat(node, "flag");
 				if (flagNode != null) {
-					String flag = getNodeCat(flagNode.getChild(0)).substring(1); //substring removes leading slash '/'
+					// substring removes leading slash '/'
+					String flag = getNodeCat(flagNode.getChild(0)).substring(1);
 					if (flag.contains("i")) term.put("caseInsensitive", true);
 					else if (flag.contains("I")) term.put("caseInsensitive", false);
 					if (flag.contains("x")) {
@@ -167,7 +173,8 @@
 				token.put("wrap", term);
 			} else {
 				// child is 'term' or 'termGroup' -> process in extra method 
-				LinkedHashMap<String,Object> termOrTermGroup = parseTermOrTermGroup(node.getChild(1), negated);
+				LinkedHashMap<String,Object> termOrTermGroup = 
+						parseTermOrTermGroup(node.getChild(1), negated);
 				token.put("wrap", termOrTermGroup);
 			}
 			putIntoSuperObject(token);
@@ -208,11 +215,13 @@
 				else if (termOp.equals("!=")) span.put("match", "match:ne");
 			}
 			if (termNode != null) {
-				LinkedHashMap<String,Object> termOrTermGroup = parseTermOrTermGroup(termNode, negated, "span");
+				LinkedHashMap<String,Object> termOrTermGroup = 
+						parseTermOrTermGroup(termNode, negated, "span");
 				span.put("attr", termOrTermGroup);
 			}
 			if (termGroupNode != null) {
-				LinkedHashMap<String,Object> termOrTermGroup = parseTermOrTermGroup(termGroupNode, negated, "span");
+				LinkedHashMap<String,Object> termOrTermGroup = 
+						parseTermOrTermGroup(termGroupNode, negated, "span");
 				span.put("attr", termOrTermGroup);
 			}
 			putIntoSuperObject(span);
@@ -268,8 +277,10 @@
 				try {
 					classId = Integer.parseInt(ref);
 				} catch (NumberFormatException e) {
-					log.error("The specified class reference in the focus/split-Operator is not a number: " + ref);
-					throw new QueryException("The specified class reference in the focus/split-Operator is not a number: " + ref);
+					String msg = "The specified class reference in the " +
+							"focus/split-Operator is not a number: " + ref;
+					log.error(msg);
+					throw new QueryException(msg);
 				}
 				// only allow class id up to 255
 				if (classId > 255) {
@@ -297,7 +308,8 @@
 							int classRef = Integer.parseInt(ref);
 							classRefs.add(classRef);
 						} catch (NumberFormatException e) {
-							String err = "The specified class reference in the shrink/split-Operator is not a number.";
+							String err = "The specified class reference in the " +
+									"shrink/split-Operator is not a number.";
 							errorMsgs.add(err);
 							throw new QueryException(err);
 						}
@@ -312,8 +324,9 @@
 			// Default is focus(), if deviating catch here
 			if (type.equals("split")) referenceGroup.put("operation", "operation:split");
 			if (type.equals("submatch") || type.equals("shrink")) {
-				String warning = "Deprecated 2014-07-24: "+type + "() as a match reducer to a specific class is deprecated in " +
-						"favor of focus() and will only be supported for 3 months after deprecation date.";
+				String warning = "Deprecated 2014-07-24: "+type + "() as a match reducer " +
+						"to a specific class is deprecated in favor of focus() and will " +
+						"only be supported for 3 months after deprecation date.";
 				log.warn(warning);
 				requestMap.put("warning", warning);
 			}
@@ -355,7 +368,8 @@
 		if (nodeCat.equals("within") && !getNodeCat(node.getParent()).equals("position")) {
 			ParseTree domainNode = node.getChild(2);
 			String domain = getNodeCat(domainNode);
-			LinkedHashMap<String, Object> curObject = (LinkedHashMap<String, Object>) objectStack.getFirst();
+			LinkedHashMap<String, Object> curObject = 
+					(LinkedHashMap<String, Object>) objectStack.getFirst();
 			curObject.put("within", domain);
 			visited.add(node.getChild(0));
 			visited.add(node.getChild(1));
@@ -426,7 +440,7 @@
 	}
 
 	private LinkedHashMap<String,Object> parseFrame(ParseTree node) {
-		String operator = node.toStringTree(parser);
+		String operator = node.toStringTree(parser).toLowerCase();
 		String[] frames = new String[]{""};
 		String[] sharedClasses = new String[]{"includes"};
 		switch (operator) {
@@ -615,21 +629,6 @@
 		return new Integer[]{min, max};
 	}
 
-	/**
-	 * Ensures that a distance or quantification value does not exceed the allowed maximum value. 
-	 * @param number
-	 * @return The input number if it is below the allowed maximum value, else the maximum value. 
-	 */
-	private int cropToMaxValue(int number) {
-		if (number > MAXIMUM_DISTANCE) {
-			number = MAXIMUM_DISTANCE; 
-			String warning = String.format("You specified a distance between two segments that is greater than " +
-					"the allowed max value of %d. Your query will be re-interpreted using a distance of %d.", MAXIMUM_DISTANCE, MAXIMUM_DISTANCE);
-			warnings.add(warning);
-			log.warn("User warning: "+warning);
-		}
-		return number;
-	}
 
 	private ParserRuleContext parsePoliqarpQuery(String p) throws QueryException {
 		checkUnbalancedPars(p);
@@ -665,50 +664,4 @@
 		// Return the generated tree
 		return tree;
 	}
-
-	public static void main(String[] args) {
-		/*
-		 * For testing
-		 */
-		String[] queries = new String[]{
-//				"[base=foo][base=foo]",
-//				"Der \"Baum\"/x",
-//				"contains(<vp>,[][base=foo])",
-//				"[hallo=welt]*",
-//				"schland/x",
-//				"focus([orth=Der]{[orth=Mann]})",
-//				"shrink([orth=Der]{[orth=Mann]})",
-//				"[mate/m=number:sg]",
-//				"z.B./x",
-//				"\".*?Mann.\"",
-//				"\".*?Mann.*?\"",
-//				"[orth=\".*?l(au|ie)fen.*?*\"]",
-//				"[orth=Mann][][orth=Mann]",
-//				"startswith(<s>, [][base=Mann])",
-//				"[base=der][]{1,102}[base=Mann]",
-//				"[base=geht][base=der][]*[base=Mann]",
-//				"<cnx/c=vp (class=header&id=7)>",
-//				"<cnx/c=vp class=header&id=a>",
-//				"[][]*[base=Mann]",
-//				"focus(2&3|4:contains({2:<s>},[base=mann]))",
-//				"relatesTo(cnx/c:<s>,<np>)",
-//				"dominates(cnx/c*:<np>,[base=Baum])",
-//				"submatch(2:<np>{2:<s>})",
-//				"focus(3:{1:[orth=der]}{3:[]}{2:[orth=Mann]})",
-				"[base=geht][base=der][]*contains(<s>,<np>)"
-		};
-//		PoliqarpPlusTree.verbose=true;
-		for (String q : queries) {
-			try {
-				System.out.println(q);
-				@SuppressWarnings("unused")
-				PoliqarpPlusTree pt = new PoliqarpPlusTree(q);
-				System.out.println();
-
-			} catch (Exception npe) {
-				npe.printStackTrace();
-				System.out.println("null\n");
-			}
-		}
-	}
 }
diff --git a/src/test/java/CosmasTreeTest.java b/src/test/java/CosmasTreeTest.java
index eb6e2b8..7bd6d2c 100644
--- a/src/test/java/CosmasTreeTest.java
+++ b/src/test/java/CosmasTreeTest.java
@@ -285,7 +285,7 @@
 							"{@type=korap:group, operation=operation:class, class=0, operands=[" +	
 								"{@type=korap:token, wrap={@type=korap:term, key=Mond, layer=orth, match=match:eq}}" +
 							"]}" +
-						"]}," +
+						"], frame=overlaps}," +
 						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
 							"{@type=korap:group, operation=operation:sequence, " +
 								"operands=[" +
@@ -316,7 +316,7 @@
 						"{@type=korap:group, operation=operation:class, class=0, operands=[" +	
 							"{@type=korap:token, wrap={@type=korap:term, key=Sonne, layer=orth, match=match:eq}}" +
 						"]}" +
-					"]}," +
+					"], frame=overlaps}," +
 					"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
 						"{@type=korap:group, operation=operation:sequence, " +
 							"operands=[" +
@@ -347,7 +347,7 @@
 						"{@type=korap:group, operation=operation:class, class=0, operands=[" +	
 							"{@type=korap:token, wrap={@type=korap:term, key=Mond, layer=orth, match=match:eq}}" +
 						"]}" +
-					"]}," +
+					"], frame=overlaps}," +
 					"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
 						"{@type=korap:group, operation=operation:sequence, " +
 							"operands=[" +
@@ -441,7 +441,7 @@
 		String mondsterneClassesOv =
 				"{@type=korap:group, operation=operation:position, frames=[], sharedClasses=[intersects], operands=[" +
 					mondsterneClasses +
-				"]}";
+				"], frame=overlaps}";
 //		String mondsterneAll =
 //					"{@type=korap:group, operation=operation:or, operands=[" +
 //						mondsterneOv + "," + mondsterneClassesSeq +
@@ -461,7 +461,7 @@
 					"{@type=korap:group, operation=operation:class, class=0, operands=[" +	
 						"{@type=korap:token, wrap={@type=korap:term, key=Sonne, layer=orth, match=match:eq}}" +
 					"]}" +
-				"]}," +
+				"], frame=overlaps}," +
 				"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
 					"{@type=korap:group, operation=operation:sequence, " +
 						"operands=[" +
@@ -734,7 +734,7 @@
 							"{@type=korap:group, operation=operation:class, class=0, operands=[" +
 								kommt +
 							"]}" +
-						"]}," +
+						"], frame=overlaps}," +
 						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
 							"{@type=korap:group, operation=operation:sequence, operands=[" +
 								"{@type=korap:group, operation=operation:class, class=0, operands=[" +
@@ -763,7 +763,7 @@
 							"{@type=korap:group, operation=operation:class, class=0, operands=[" +
 								beg1+
 							"]}" +
-						"]}," +
+						"], frame=overlaps}," +
 						"{@type=korap:reference, operation=operation:focus, classRef=[0], operands=[" +
 							"{@type=korap:group, operation=operation:sequence, operands=[" +
 								"{@type=korap:group, operation=operation:class, class=0, operands=[" +
@@ -1026,7 +1026,7 @@
 						"{@type=korap:group, operation=operation:class, class=1, operands=[" +
 							"{@type=korap:token, wrap={@type=korap:term, key=der, layer=orth, match=match:eq}}" +
 						"]}" +
-					"]}" +
+					"], frame=startswith}" +
 				"]}";
 		ct = new CosmasTree(query);
 		map = ct.getRequestMap().get("query").toString();
@@ -1043,7 +1043,7 @@
 									"{@type=korap:token, wrap={@type=korap:term, key=Mann, layer=orth, match=match:eq}}" +
 								"]}" +
 							"]}" +
-						"]}" +
+						"], frame=endswith}" +
 					"]}";
 		ct = new CosmasTree(query);
 		map = ct.getRequestMap().get("query").toString();
@@ -1061,7 +1061,7 @@
 									"{@type=korap:token, wrap={@type=korap:term, key=Mann, layer=orth, match=match:eq}}" +
 								"]}" +
 							"]}" +
-						"]}," +
+						"], frame=startswith}," +
 						"{@type=korap:group, operation=operation:position, frames=[startswith], sharedClasses=[includes], operands=[" +
 							"{@type=korap:span, key=p}," +
 							"{@type=korap:group, operation=operation:class, class=2, operands=[" +
@@ -1070,7 +1070,7 @@
 									"{@type=korap:token, wrap={@type=korap:term, key=Mann, layer=orth, match=match:eq}}" +
 								"]}" +
 							"]}" +
-						"], exclude=true}" +
+						"], frame=startswith, exclude=true}" +
 					"], distances=[" +
 						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=0}, min=0, max=0}" +
 					"]}" +
@@ -1091,7 +1091,7 @@
 						"{@type=korap:group, operation=operation:class, class=1, operands=[" +
 							"{@type=korap:token, wrap={@type=korap:term, key=Der, layer=orth, match=match:eq}}" +
 						"]}" +
-					"]}" +
+					"], frame=startswith}" +
 				"]}";
 		ct = new CosmasTree(query);
 		map = ct.getRequestMap().get("query").toString();
@@ -1106,19 +1106,19 @@
 							"{@type=korap:group, operation=operation:class, class=1, operands=[" +
 									"{@type=korap:token, wrap={@type=korap:term, key=Mann, layer=orth, match=match:eq}}" +
 							"]}" +
-						"]}," +
+						"], frame=startswith}," +
 						"{@type=korap:group, operation=operation:position, frames=[startswith], sharedClasses=[includes], operands=[" +
 							"{@type=korap:span, key=p}," +
 							"{@type=korap:group, operation=operation:class, class=2, operands=[" +
 									"{@type=korap:token, wrap={@type=korap:term, key=Mann, layer=orth, match=match:eq}}" +
 							"]}" +
-						"], exclude=true}," +
+						"], frame=startswith, exclude=true}," +
 						"{@type=korap:group, operation=operation:position, frames=[endswith], sharedClasses=[includes], operands=[" +
 							"{@type=korap:span, key=t}," +
 							"{@type=korap:group, operation=operation:class, class=3, operands=[" +
 									"{@type=korap:token, wrap={@type=korap:term, key=Mann, layer=orth, match=match:eq}}" +
-						"]}" +
-					"]}" +
+							"]}" +
+						"], frame=endswith}" +
 					"], distances=[" +
 						"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=0, max=0}, min=0, max=0}" +
 					"]}" +
diff --git a/src/test/java/PoliqarpPlusTreeTest.java b/src/test/java/PoliqarpPlusTreeTest.java
index 6cbd2a2..4cac667 100644
--- a/src/test/java/PoliqarpPlusTreeTest.java
+++ b/src/test/java/PoliqarpPlusTreeTest.java
@@ -389,7 +389,7 @@
 					"{@type=korap:group, operation=operation:position, frames=[],sharedClasses=[includes], operands=[" +
 					  "{@type=korap:span, key=s}," +
 					  "{@type=korap:span, key=np}" +
-					"]}" +
+					"], frame=contains}" +
 				"], inOrder=true, distances=[" +
 					"{@type=korap:distance, key=w, boundary={@type=korap:boundary, min=1}, min=1}" +
 				"]}" +
@@ -409,7 +409,7 @@
 					"{@type=korap:token}," +
 					"{@type=korap:token, wrap={@type=korap:term, layer=lemma, key=Mann, match=match:eq}}" +
 				"]}" +
-			"]}";
+			"], frame=startswith}";
 		ppt = new PoliqarpPlusTree("startswith(<s>, [][base=Mann])");
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(et1.replaceAll(" ", ""), map.replaceAll(" ", ""));
@@ -472,7 +472,7 @@
 					"{@type=korap:group, operation=operation:position, frames=[],sharedClasses=[includes], operands=[" +
 					  "{@type=korap:span, key=s}," +
 					  "{@type=korap:span, key=np}" +
-					"]}," +
+					"], frame=contains}," +
 					"{@type=korap:group, operation=operation:repetition, operands=[" +
 						"{@type=korap:token}" +
 					"], boundary={@type=korap:boundary, min=2, max=2}, min=2, max=2}" +
@@ -912,14 +912,14 @@
 		String pos1 = "{@type=korap:group, operation=operation:position, frames=[],sharedClasses=[includes], operands=[" +
 				  "{@type=korap:span, key=s}," +
 				  "{@type=korap:span, key=np}" +
-				"]}";
+				"], frame=contains}";
 		assertTrue(equalsQueryContent(pos1, "contains(<s>,<np>)"));
 		
 		// contains(<s>,[base=Mann])
 		String pos2 = "{@type=korap:group, operation=operation:position, frames=[],sharedClasses=[includes], operands=[" +
 				  "{@type=korap:span, key=s}," +
 				  "{@type=korap:token, wrap= {@type=korap:term, layer=lemma, key=Mann, match=match:eq}}" +
-				"]}";
+				"], frame=contains}";
 		assertTrue(equalsQueryContent(pos2, "contains(<s>,[base=Mann])"));
 		
 		// contains(<s>,[orth=der][orth=Mann])
@@ -929,7 +929,7 @@
 				  		"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=der, match=match:eq}}," +
 				  		"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Mann, match=match:eq}}" +
 				  	"]}" +
-				  "]}";
+				  "], frame=contains}";
 		ppt = new PoliqarpPlusTree("contains(<s>,[orth=der][orth=Mann])");
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(pos3.replaceAll(" ", ""), map.replaceAll(" ", ""));
@@ -941,7 +941,7 @@
 					"{@type=korap:group, operation=operation:position, frames=[],sharedClasses=[includes], operands=[" +
 				  		"{@type=korap:span, key=s}," +
 				  		"{@type=korap:token, wrap={@type=korap:term, layer=lemma, key=Mann, match=match:eq}}" +
-				  	"]}" +
+				  	"], frame=contains}" +
 				"]}";
 		ppt = new PoliqarpPlusTree("[base=Auto]contains(<s>,[base=Mann])");
 		map = ppt.getRequestMap().get("query").toString();
@@ -955,7 +955,7 @@
 				  			"operands=[{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}" +
 				  			"], boundary={@type=korap:boundary, min=0}, min=0" +
 				  		"}" +
-				  	"]}";
+				  	"], frame=contains}";
 		ppt = new PoliqarpPlusTree("contains(<s>,[pos=N]*)");
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(pos5.replaceAll(" ", ""), map.replaceAll(" ", ""));
@@ -970,7 +970,7 @@
 				  			"operands=[{@type=korap:token, wrap={@type=korap:term, layer=pos, key=N, match=match:eq}}" +
 				  			"], boundary={@type=korap:boundary, min=0}, min=0" +
 				  		"}" +
-				  	"]}" +
+				  	"], frame=contains}" +
 				"]}";
 		ppt = new PoliqarpPlusTree("[base=Auto]contains(<s>,[pos=N]*)");
 		map = ppt.getRequestMap().get("query").toString();
@@ -986,8 +986,8 @@
 				"{@type=korap:group, operation=operation:position, frames=[startswith],sharedClasses=[includes], operands=[" +
 					"{@type=korap:span, key=np}," +
 					"{@type=korap:token, wrap={@type=korap:term, layer=orth, key=Der, match=match:eq}}" +
-				"]}" +
-			"]}";
+				"], frame=startswith}" +
+			"], frame=contains}";
 		ppt = new PoliqarpPlusTree("contains(<s>, startswith(<np>,[orth=Der]))");
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(npos1.replaceAll(" ", ""), map.replaceAll(" ", ""));
@@ -1051,7 +1051,7 @@
 					"{@type=korap:group, operation=operation:class, class=1, operands=[" +
 						"{@type=korap:span, key=np}" +
 					"]}" +
-				"]}" +
+				"], frame=startswith}" +
 			"]}";
 		ppt = new PoliqarpPlusTree("focus(1:startswith(<s>,{1:<np>}))");
 		map = ppt.getRequestMap().get("query").toString();
@@ -1075,7 +1075,7 @@
 							"]}" +
 						"]}" +
 					"]}" +
-				"]}" +
+				"], frame=startswith}" +
 			"]}";
 		ppt = new PoliqarpPlusTree("focus(3:startswith(<s>,{3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) ");
 		map = ppt.getRequestMap().get("query").toString();
@@ -1099,7 +1099,7 @@
 							"]}" +
 						"]}" +
 					"]}" +
-				"]}" +
+				"], frame=startswith}" +
 			"]}";
 		ppt = new PoliqarpPlusTree("split(3:startswith(<s>,{3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) ");
 		map = ppt.getRequestMap().get("query").toString();
@@ -1123,7 +1123,7 @@
 							"]}" +
 						"]}" +
 					"]}" +
-				"]}" +
+				"], frame=startswith}" +
 			"]}";
 		ppt = new PoliqarpPlusTree("split(2|3:startswith(<s>,{3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) ");
 		map = ppt.getRequestMap().get("query").toString();
@@ -1175,7 +1175,7 @@
 				"{@type=korap:group, operation=operation:position, frames=[],sharedClasses=[includes], operands=[" +
 					"{@type=korap:span, key=s}," +
 					"{@type=korap:token, wrap= {@type=korap:term, layer=lemma, key=Haus, match=match:eq}}" +
-				"]}" +
+				"], frame=contains}" +
 				"], spanRef=[1,4]" +
 			"}";
 		ppt = new PoliqarpPlusTree(query);