updated to new notation
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 a772a5c..2931ad4 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
@@ -119,32 +119,7 @@
 		return this.requestMap;
 	}
 	
-	private void prepareContext() {
-		LinkedHashMap<String,Object> context = new LinkedHashMap<String,Object>();
-		LinkedHashMap<String,Object> operands = new LinkedHashMap<String,Object>();
-		LinkedHashMap<String,Object> relation = new LinkedHashMap<String,Object>();
-		LinkedHashMap<String,Object> classMap = new LinkedHashMap<String,Object>();
-		
-		operands.put("@id", "korap:operands");
-		operands.put("@container", "@list");
-		
-		relation.put("@id", "korap:relation");
-		relation.put("@type", "korap:relation#types");
-		
-		classMap.put("@id", "korap:class");
-		classMap.put("@type", "xsd:integer");
-		
-		context.put("korap", "http://korap.ids-mannheim.de/ns/query");
-		context.put("@language", "de");
-		context.put("@operands", operands);
-		context.put("@relation", relation);
-		context.put("class", classMap);
-		context.put("query", "korap:query");
-		context.put("filter", "korap:filter");
-		context.put("meta", "korap:meta");
-		
-		requestMap.put("@context", context);		
-	}
+	
 	
 	@Override
 	public void process(String query) throws QueryException {
@@ -158,7 +133,7 @@
 		}
 		
 		System.out.println("Processing Cosmas");
-		prepareContext();
+		QueryUtils.prepareContext(requestMap);
 		processNode(tree);
 	}
 	
@@ -202,8 +177,9 @@
 					if (hasSequentiableSiblings) {
 						// Step I: create sequence
 						LinkedHashMap<String, Object> sequence = new LinkedHashMap<String, Object>();
-						sequence.put("@type", "korap:sequence");
-						sequence.put("@operands", new ArrayList<Object>());
+						sequence.put("type", "group");
+						sequence.put("operation", "sequence");
+						sequence.put("operands", new ArrayList<Object>());
 						// push sequence on object stack but don't increment stackedObjects counter since
 						// we've got to wait until the parent node is processed - therefore, add the parent
 						// to the sequencedNodes list and remove the sequence from the stack when the parent
@@ -222,24 +198,24 @@
 			
 			//Step I: get info
 			LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
-			token.put("@type", "korap:token");
+			token.put("type", "token");
 			objectStack.push(token);
 			stackedObjects++;
 			LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
-			token.put("@value", fieldMap);
+			token.put("key", fieldMap);
 			
-			fieldMap.put("@type", "korap:term");			
+			fieldMap.put("type", "term");			
 			// make category-specific fieldMap entry
 			String attr = nodeCat.equals("OPWF") ? "orth" : "lemma";
 			String value = node.getChild(0).toStringTree().replaceAll("\"", "");
-			fieldMap.put("@value", value);
-			fieldMap.put("@attr", attr);
+			fieldMap.put("key", value);
+			fieldMap.put("layer", attr);
 			
 			// negate field (see above)
 			if (negate) {
-				fieldMap.put("@relation", "!=");
+				fieldMap.put("match", "ne");
 			} else {
-				fieldMap.put("@relation", "=");
+				fieldMap.put("match", "eq");
 			}
 			//Step II: decide where to put
 			putIntoSuperObject(token, 1);
@@ -248,54 +224,54 @@
 		if (nodeCat.equals("OPMORPH")) {
 			//Step I: get info
 			LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
-			token.put("@type", "korap:token");
+			token.put("type", "token");
 			LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
-			token.put("@value", fieldMap);
+			token.put("key", fieldMap);
 			
-			fieldMap.put("@type", "korap:term");
-//			fieldMap.put("@value", "morph:"+node.getChild(0).toString().replace(" ", "_"));
-			fieldMap.put("@value", node.getChild(0).toString().replace(" ", "_"));
+			fieldMap.put("type", "term");
+//			fieldMap.put("key", "morph:"+node.getChild(0).toString().replace(" ", "_"));
+			fieldMap.put("key", node.getChild(0).toString().replace(" ", "_"));
 			// make category-specific fieldMap entry
 			// negate field (see above)
 			if (negate) {
-				fieldMap.put("@relation", "!=");
+				fieldMap.put("match", "ne");
 			} else {
-				fieldMap.put("@relation", "=");
+				fieldMap.put("match", "eq");
 			}
 //			List<String> morphValues = QueryUtils.parseMorph(node.getChild(0).toStringTree());
 //			System.err.println(morphValues);
 //			if (morphValues.size() == 1) {
 //				LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
-//				token.put("@value", fieldMap);
+//				token.put("key", fieldMap);
 //				
-//				fieldMap.put("@type", "korap:term");
-//				fieldMap.put("@value", morphValues.get(0));
+//				fieldMap.put("type", "term");
+//				fieldMap.put("key", morphValues.get(0));
 //				// make category-specific fieldMap entry
 //				// negate field (see above)
 //				if (negate) {
-//					fieldMap.put("@relation", "!=");
+//					fieldMap.put("operation", "!=");
 //				} else {
-//					fieldMap.put("@relation", "=");
+//					fieldMap.put("operation", "=");
 //				}
 //			} else {
 //				LinkedHashMap<String, Object> conjGroup = new LinkedHashMap<String, Object>();
-//				token.put("@value", conjGroup);
+//				token.put("key", conjGroup);
 //				ArrayList<Object> conjOperands = new ArrayList<Object>();
-//				conjGroup.put("@type", "korap:group");
-//				conjGroup.put("@relation", "and");
-//				conjGroup.put("@operands", conjOperands);
+//				conjGroup.put("type", "group");
+//				conjGroup.put("operation", "and");
+//				conjGroup.put("operands", conjOperands);
 //				for (String value : morphValues) {
 //					LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
-//					token.put("@value", fieldMap);
+//					token.put("key", fieldMap);
 //					
-//					fieldMap.put("@type", "korap:term");
-//					fieldMap.put("@value", value);
+//					fieldMap.put("type", "term");
+//					fieldMap.put("key", value);
 //					// make category-specific fieldMap entry
 //					// negate field (see above)
 //					if (negate) {
-//						fieldMap.put("@relation", "!=");
+//						fieldMap.put("operation", "!=");
 //					} else {
-//						fieldMap.put("@relation", "=");
+//						fieldMap.put("operation", "=");
 //					}
 //				}
 //			}
@@ -308,8 +284,8 @@
 		if (nodeCat.equals("OPELEM")) {
 			// Step I: create element
 			LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
-			elem.put("@type", "korap:span");
-			elem.put("@value", node.getChild(0).getChild(0).toStringTree().toLowerCase());
+			elem.put("type", "span");
+			elem.put("key", node.getChild(0).getChild(0).toStringTree().toLowerCase());
 			//Step II: decide where to put
 			putIntoSuperObject(elem);
 		}		
@@ -317,8 +293,8 @@
 		if (nodeCat.equals("OPLABEL")) {
 			// Step I: create element
 			LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
-			elem.put("@type", "korap:span");
-			elem.put("@value", node.getChild(0).toStringTree().replaceAll("<|>", ""));
+			elem.put("type", "span");
+			elem.put("key", node.getChild(0).toStringTree().replaceAll("<|>", ""));
 			//Step II: decide where to put
 			putIntoSuperObject(elem);
 		}
@@ -326,12 +302,12 @@
 		if (nodeCat.equals("OPOR") || nodeCat.equals("OPAND") || nodeCat.equals("OPNOT")) {
 			// Step I: create group
 			LinkedHashMap<String, Object> disjunction = new LinkedHashMap<String, Object>();
-			disjunction.put("@type", "korap:group");
+			disjunction.put("type", "group");
 			String relation = "or";
 			if (nodeCat.equals("OPAND")) relation = "and";
 			if (nodeCat.equals("OPNOT")) relation = "not";
-			disjunction.put("@relation", relation);
-			disjunction.put("@operands", new ArrayList<Object>());
+			disjunction.put("operation", relation);
+			disjunction.put("operands", new ArrayList<Object>());
 			objectStack.push(disjunction);
 			stackedObjects++;
 			// Step II: decide where to put
@@ -346,7 +322,8 @@
 			Tree dist_list = prox_opts.getChild(1);
 			// Step I: create group
 			LinkedHashMap<String, Object> proxSequence = new LinkedHashMap<String, Object>();
-			proxSequence.put("@type", "korap:sequence");
+			proxSequence.put("type", "group");
+			proxSequence.put("operation", "sequence");
 			objectStack.push(proxSequence);
 			stackedObjects++;
 //			if (openNodeCats.get(1).equals("OPALL")) proxSequence.put("match", "all");
@@ -356,11 +333,11 @@
 			boolean exclusion = ! typ.getChild(0).toStringTree().equals("PROX"); 
 			
 			String inOrder = "true";
-			proxSequence.put("@inOrder", inOrder);
-			proxSequence.put("@constraints", constraints);
+			proxSequence.put("inOrder", inOrder);
+			proxSequence.put("distances", constraints);
 			
 			ArrayList<Object> operands = new ArrayList<Object>(); 
-			proxSequence.put("@operands", operands);
+			proxSequence.put("operands", operands);
 			
 			// if only one dist_info, put directly into constraints
 			if (dist_list.getChildCount()==1) {
@@ -378,24 +355,24 @@
 					inOrder="false";
 				}
 				LinkedHashMap<String, Object> distance = new LinkedHashMap<String, Object>();
-				distance.put("@type", "korap:distance");
-				distance.put("@measure", meas);
-				distance.put("@min", Integer.parseInt(min));
-				distance.put("@max", Integer.parseInt(max));
+				distance.put("type", "distance");
+				distance.put("measure", meas);
+				distance.put("min", Integer.parseInt(min));
+				distance.put("max", Integer.parseInt(max));
 				if (exclusion) {
-					distance.put("@exclude", exclusion);
+					distance.put("exclude", exclusion);
 				}
 				constraints.add(distance);
-				proxSequence.put("@inOrder", inOrder);
+				proxSequence.put("inOrder", inOrder);
 			}
 			
 			// otherwise, create group and add info there
 			else {
 				LinkedHashMap<String, Object> distanceGroup = new LinkedHashMap<String, Object>();
 				ArrayList<Object> groupOperands = new ArrayList<Object>();
-				distanceGroup.put("@type", "korap:group");
-				distanceGroup.put("@relation", "and");
-				distanceGroup.put("@operands", groupOperands);
+				distanceGroup.put("type", "group");
+				distanceGroup.put("operation", "and");
+				distanceGroup.put("operands", groupOperands);
 				constraints.add(distanceGroup);
 				for (int i=0; i<dist_list.getChildCount(); i++) {
 					String direction = dist_list.getChild(i).getChild(0).getChild(0).toStringTree().toLowerCase();
@@ -406,12 +383,12 @@
 						min=max;
 					}
 					LinkedHashMap<String, Object> distance = new LinkedHashMap<String, Object>();
-					distance.put("@type", "korap:distance");
-					distance.put("@measure", meas);
-					distance.put("@min", min);
-					distance.put("@max", max);
+					distance.put("type", "distance");
+					distance.put("measure", meas);
+					distance.put("min", min);
+					distance.put("max", max);
 					if (exclusion) {
-						distance.put("@exclude", exclusion);
+						distance.put("exclude", exclusion);
 					}
 					groupOperands.add(distance);
 					if (direction.equals("plus")) {
@@ -421,7 +398,7 @@
 						invertedOperandsLists.add(operands);
 					}
 				}
-				proxSequence.put("@inOrder", inOrder);
+				proxSequence.put("inOrder", inOrder);
 			}
 			// Step II: decide where to put
 			putIntoSuperObject(proxSequence, 1);
@@ -431,24 +408,24 @@
 		if (nodeCat.equals("OPIN") || nodeCat.equals("OPOV")) {
 			// Step I: create group
 			LinkedHashMap<String, Object> submatchgroup = new LinkedHashMap<String, Object>();
-			submatchgroup.put("@type", "korap:group");
-			submatchgroup.put("@relation", "submatch");
-			submatchgroup.put("@classRef", "1");
+			submatchgroup.put("type", "group");
+			submatchgroup.put("operation", "submatch");
+			submatchgroup.put("classRef", "1");
 			
 			ArrayList<Object> submatchoperands = new ArrayList<Object>(); 
 			LinkedHashMap<String, Object> posgroup = new LinkedHashMap<String, Object>();
-			submatchgroup.put("@operands", submatchoperands);
+			submatchgroup.put("operands", submatchoperands);
 			submatchoperands.add(posgroup);
-			posgroup.put("@type", "korap:group");
+			posgroup.put("type", "group");
 //			String relation = nodeCat.equals("OPIN") ? "position" : "overlaps";
-			posgroup.put("@relation", "position");
+			posgroup.put("operation", "position");
 			if (nodeCat.equals("OPIN")) {
 				parseOPINOptions(node, posgroup);
 			} else {
 				parseOPOVOptions(node, posgroup);
 			}
 			ArrayList<Object> posoperands = new ArrayList<Object>();
-			posgroup.put("@operands", posoperands);
+			posgroup.put("operands", posoperands);
 			objectStack.push(posgroup);
 			// mark this an inverted list
 			invertedOperandsLists.push(posoperands);
@@ -462,9 +439,10 @@
 		if (nodeCat.equals("ARG1") && (openNodeCats.get(1).equals("OPIN") || openNodeCats.get(1).equals("OPOV"))) {
 			// Step I: create group
 			LinkedHashMap<String, Object> classGroup = new LinkedHashMap<String, Object>();
-			classGroup.put("@type", "korap:group");
+			classGroup.put("type", "group");
+			classGroup.put("operation", "class");
 			classGroup.put("class", "1");
-			classGroup.put("@operands", new ArrayList<Object>());
+			classGroup.put("operands", new ArrayList<Object>());
 			objectStack.push(classGroup);
 			stackedObjects++;
 			// Step II: decide where to put
@@ -475,15 +453,15 @@
 		if (nodeCat.equals("OPNHIT")) {
 //			proxGroupMatching = nodeCat.equals("OPALL") ? "all" : "exclude";
 			LinkedHashMap<String, Object> exclGroup = new LinkedHashMap<String, Object>();
-			exclGroup.put("@type", "korap:group");
-			exclGroup.put("@relation", "shrink");
+			exclGroup.put("type", "group");
+			exclGroup.put("operation", "shrink");
 			ArrayList<Integer> classRef = new ArrayList<Integer>();
 			classRef.add(1);
 			classRef.add(2);
 			exclGroup.put("classRef", classRef);
 			exclGroup.put("classRefOp", "intersection");
 			ArrayList<Object> operands = new ArrayList<Object>();
-			exclGroup.put("@operands", operands);
+			exclGroup.put("operands", operands);
 			objectStack.push(exclGroup);
 			stackedObjects++;
 			putIntoSuperObject(exclGroup, 1);
@@ -492,8 +470,8 @@
 		if (nodeCat.equals("OPEND") || nodeCat.equals("OPBEG")) {
 			// Step I: create group
 			LinkedHashMap<String, Object> beggroup = new LinkedHashMap<String, Object>();
-			beggroup.put("@type", "korap:group");
-			beggroup.put("@relation", "submatch");
+			beggroup.put("type", "group");
+			beggroup.put("operation", "submatch");
 			ArrayList<Integer> spanRef = new ArrayList<Integer>();
 			if (nodeCat.equals("OPBEG")) {
 				spanRef.add(0); spanRef.add(1);
@@ -501,7 +479,7 @@
 				spanRef.add(-1); spanRef.add(1);
 			}
 			beggroup.put("@spanRef", spanRef);
-			beggroup.put("@operands", new ArrayList<Object>());
+			beggroup.put("operands", new ArrayList<Object>());
 			objectStack.push(beggroup);
 			stackedObjects++;
 			
@@ -516,17 +494,17 @@
 			// Distinguish two cases. Normal case: query has just one condition, like #BED(XY, sa) ...
 			if (conditions.getChildCount()==1) {
 				LinkedHashMap<String, Object> posgroup = new LinkedHashMap<String, Object>();
-				posgroup.put("@type", "korap:group");
-				posgroup.put("@relation", "position");
+				posgroup.put("type", "group");
+				posgroup.put("operation", "position");
 				CosmasCondition c = new CosmasCondition(conditions.getChild(0));
-				posgroup.put("@position", c.position);
-				if (c.negated) posgroup.put("@relation", "!=");
+				posgroup.put("frame", c.position);
+				if (c.negated) posgroup.put("operation", "!=");
 				ArrayList<Object> operands = new ArrayList<Object>();
-				posgroup.put("@operands", operands);
+				posgroup.put("operands", operands);
 				LinkedHashMap<String, Object> bedElem = new LinkedHashMap<String, Object>();
 				operands.add(bedElem);
-				bedElem.put("@type", "korap:span");
-				bedElem.put("@value", c.elem);
+				bedElem.put("type", "span");
+				bedElem.put("key", c.elem);
 				objectStack.push(posgroup);
 				stackedObjects++;
 				// Step II: decide where to put
@@ -537,10 +515,10 @@
 				// node has several conditions (like 'sa, -pa')
 				// -> create 'and' group and embed all position groups there
 				LinkedHashMap<String, Object> conjunct = new LinkedHashMap<String, Object>();
-				conjunct.put("@type", "korap:group");
-				conjunct.put("@relation", "and");
+				conjunct.put("type", "group");
+				conjunct.put("operation", "and");
 				ArrayList<Object> operands = new ArrayList<Object>();
-				conjunct.put("@operands", operands);
+				conjunct.put("operands", operands);
 				ArrayList<ArrayList<Object>> distributedOperands = new ArrayList<ArrayList<Object>>();
 				
 				for (int i=0; i<conditions.getChildCount(); i++) {
@@ -550,17 +528,17 @@
 					operands.add(posGroup);
 					
 					CosmasCondition c = new CosmasCondition(conditions.getChild(i));
-					posGroup.put("@type", "korap:group");
-					posGroup.put("@relation", "position");
-					posGroup.put("@position", c.position);
-					if (c.negated) posGroup.put("@exclude", "true");
+					posGroup.put("type", "group");
+					posGroup.put("operation", "position");
+					posGroup.put("frame", c.position);
+					if (c.negated) posGroup.put("exclude", "true");
 					ArrayList<Object> posOperands = new ArrayList<Object>();
 					distributedOperands.add(posOperands);
-					posGroup.put("@operands", posOperands);
+					posGroup.put("operands", posOperands);
 					LinkedHashMap<String, Object> bedElem = new LinkedHashMap<String, Object>();
 					posOperands.add(bedElem);
-					bedElem.put("@type", "korap:span");
-					bedElem.put("@value", c.elem);
+					bedElem.put("type", "span");
+					bedElem.put("key", c.elem);
 					
 					
 				}
@@ -632,7 +610,7 @@
 		} else {
 			position = "contains";
 		}
-		posgroup.put("@position", position);
+		posgroup.put("frame", position);
 		position = openNodeCats.get(1).equals("OPIN") ? "contains" : "full";
 		
 		if (rangenode != null) {
@@ -647,7 +625,7 @@
 		}
 		System.err.println(negatePosition);
 		if (negatePosition) {
-			posgroup.put("@exclude", "true");	
+			posgroup.put("exclude", "true");	
 //			negate = !negate;
 		}
 		
@@ -667,11 +645,11 @@
 			String value = posnode.getChild(0).toStringTree();
 			position = "-"+translateTextAreaArgument(value, "ov");
 		}
-		posgroup.put("@position", "overlaps"+position);
+		posgroup.put("frame", "overlaps"+position);
 		
 		if (exclnode != null) {
 			if (exclnode.getChild(0).toStringTree().equals("YES")) {
-				posgroup.put("@relation", "!=");
+				posgroup.put("match", "ne");
 			}
 		}
 		if (groupnode != null) {
@@ -726,7 +704,7 @@
 				operands.add(object);
 			}
 		} else if (objectStack.size()>objStackPosition) {
-			ArrayList<Object> topObjectOperands = (ArrayList<Object>) objectStack.get(objStackPosition).get("@operands");
+			ArrayList<Object> topObjectOperands = (ArrayList<Object>) objectStack.get(objStackPosition).get("operands");
 			if (!invertedOperandsLists.contains(topObjectOperands)) {
 				topObjectOperands.add(object);
 			} else {
@@ -776,7 +754,13 @@
 //				"(Mann oder Frau) #IN <s>",
 //				"#BEG(der /w3:5 Mann) /+w10 kommt",
 //				"&würde /w0 MORPH(V)",
-				"#NHIT(gehen /w1:10 voran)"
+				"#NHIT(gehen /w1:10 voran)",
+				"Der Mann",
+				"Der /+w1:3 Mann",
+				"Der /+w1:3,s1 Mann",
+				"(Der /+w1:3,s1 Mann) /+w5 geht",
+				"(Der /+w1:3,s1 Mann) /-w5 geht",
+				"(Der /+w1:3,s1 Mann) /+w5 (geht weg)",
 				};
 		CosmasTree.debug=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 470603a..7fa8b5e 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
@@ -161,33 +161,6 @@
         log.info(">>> " + requestMap.get("query") + " <<<");
 	}
 
-	private void prepareContext() {
-		LinkedHashMap<String,Object> context = new LinkedHashMap<String,Object>();
-		LinkedHashMap<String,Object> operands = new LinkedHashMap<String,Object>();
-		LinkedHashMap<String,Object> relation = new LinkedHashMap<String,Object>();
-		LinkedHashMap<String,Object> classMap = new LinkedHashMap<String,Object>();
-		
-		operands.put("@id", "korap:operands");
-		operands.put("@container", "@list");
-		
-		relation.put("@id", "korap:relation");
-		relation.put("@type", "korap:relation#types");
-		
-		classMap.put("@id", "korap:class");
-		classMap.put("@type", "xsd:integer");
-		
-		context.put("korap", "http://korap.ids-mannheim.de/ns/query");
-		context.put("@language", "de");
-		context.put("@operands", operands);
-		context.put("@relation", relation);
-		context.put("class", classMap);
-		context.put("query", "korap:query");
-		context.put("filter", "korap:filter");
-		context.put("meta", "korap:meta");
-		
-		requestMap.put("@context", context);		
-	}
-
 	@Override
 	public Map<String, Object> getRequestMap() {
 		return requestMap;
@@ -206,7 +179,7 @@
 			}
 		}
 		System.out.println("Processing PoliqarpPlus");
-		prepareContext();
+		QueryUtils.prepareContext(requestMap);
 		processNode(tree);
 	}
 	
@@ -286,23 +259,25 @@
 						String[] minmax = parseEmptySegments(emptySegments);
 						Integer min = Integer.parseInt(minmax[0]);
 						Integer max = Integer.parseInt(minmax[1]);
-						sequence.put("@type", "korap:sequence");
-//						sequence.put("@relation", "distance");
-						sequence.put("@inOrder", "true");
+						sequence.put("type", "group");
+						sequence.put("operation", "sequence");
+//						sequence.put("operation", "distance");
+						sequence.put("inOrder", "true");
 						ArrayList<Object> constraint = new ArrayList<Object>(); 
-						sequence.put("@constraints", constraint);
+						sequence.put("distances", constraint);
 						ArrayList<Object> sequenceOperands = new ArrayList<Object>();
-						sequence.put("@operands", sequenceOperands);
+						sequence.put("operands", sequenceOperands);
 						objectStack.push(sequence);
 						stackedObjects++;
 						LinkedHashMap<String, Object> distMap = new LinkedHashMap<String, Object>();
 						constraint.add(distMap);
-						distMap.put("@type", "korap:distance");
+						distMap.put("type", "distance");
 						distMap.put("measure", "w");
 						distMap.put("min", min);
 						distMap.put("max", max);
 					} else {
-						sequence.put("@type", "korap:sequence");
+						sequence.put("type", "group");
+						sequence.put("operation", "sequence");
 						ArrayList<Object> sequenceOperands = new ArrayList<Object>();
 						if (emptySegments != null) {
 							String[] minmax = parseEmptySegments(emptySegments);
@@ -311,30 +286,30 @@
 							sequence.put("offset-min", min);
 							sequence.put("offset-max", max);
 						}
-						sequence.put("@operands", sequenceOperands);
+						sequence.put("operands", sequenceOperands);
 						objectStack.push(sequence);
 						stackedObjects++;
 					}
 				} else {
-					// if only child, make the sequence a mere korap:token...
+					// if only child, make the sequence a mere token...
 					// ... but only if it has a real token/element beneath it
 					if (QueryUtils.getNodeCat(node.getChild(0)).equals("cq_segment")
 						|| QueryUtils.getNodeCat(node.getChild(0)).equals("sq_segment")
 						|| QueryUtils.getNodeCat(node.getChild(0)).equals("element")	) {
-						sequence.put("@type", "korap:token");
+						sequence.put("type", "token");
 						tokenStack.push(sequence);
 						stackedTokens++;
 						objectStack.push(sequence);
 						stackedObjects++;
 					// else, it's a group (with shrink()/spanclass/align... as child)
 					} else {
-						sequence.put("@type", "korap:group");
+						sequence.put("type", "group");
 					}
 				}
 				// Step II: decide where to put this element 
 				// check if this is an argument for a containing occurrence group (see step 0)
 				if (cqHasOccSibling) {
-					ArrayList<Object> topGroupOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+					ArrayList<Object> topGroupOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 					topGroupOperands.add(sequence);
 				// ...if not modified by occurrence, put into suitable super structure
 				} else {
@@ -348,22 +323,23 @@
 							if (node.getParent().getChild(0).equals(node)) {
 								// if first child, create containing sequence and embed there
 								LinkedHashMap<String,Object> superSequence = new LinkedHashMap<String,Object>();
-								superSequence.put("@type", "korap:sequence");
+								superSequence.put("type", "group");
+								superSequence.put("operation", "sequence");
 								ArrayList<Object> operands = new ArrayList<Object>();
-								superSequence.put("@operands", operands);
+								superSequence.put("operands", operands);
 								operands.add(sequence);
 								requestMap.put("query", superSequence);
 								objectStack.push(superSequence); // add at 2nd position to keep current cq_segment accessible
 								stackedObjects++;
 							} else {
 								// if not first child, add to previously created parent sequence
-								ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+								ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 								topSequenceOperands.add(sequence);
 							}
 						}
 					} else if (!objectStack.isEmpty()){
 						// embed in super sequence
-						ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+						ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 						topSequenceOperands.add(sequence);
 					}
 				}
@@ -389,7 +365,7 @@
 			}
 			curToken = token;
 			// Step II: start filling object and add to containing sequence
-			token.put("@type", "korap:token");
+			token.put("type", "token");
 			// add token to sequence only if it is not an only child (in that case, cq_segments has already added the info and is just waiting for the values from "field")
 			// take into account a possible 'occ' child
 			if (node.getParent().getChildCount()>1) {				
@@ -404,7 +380,7 @@
 //					}
 //					
 				} else {
-					ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(onTopOfObjectStack).get("@operands");
+					ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(onTopOfObjectStack).get("operands");
 					topSequenceOperands.add(token);
 				}
 			}
@@ -414,14 +390,14 @@
 		if (nodeCat.equals("cq_seg_occ")) {
 			LinkedHashMap<String,Object> group = new LinkedHashMap<String,Object>();
 			curOccGroup = group;
-			group.put("@type", "korap:group");
-			group.put("@operands", new ArrayList<Object>());
+			group.put("type", "group");
+			group.put("operands", new ArrayList<Object>());
 			objectStack.push(group);
 			stackedObjects++;
 			// add group to sequence only if it is not an only child (in that case, cq_segments has already added the info and is just waiting for the values from "field")
 			// take into account a possible 'occ' child
 			if (node.getParent().getChildCount()>1) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(group);
 			} else {
 				requestMap.put("query", group);
@@ -434,14 +410,14 @@
 			objectStack.push(disjunction);
 			stackedObjects++;
 			ArrayList<Object> disjOperands = new ArrayList<Object>();
-			disjunction.put("@type", "korap:group");
-			disjunction.put("@relation", "or");
-			disjunction.put("@operands", disjOperands);
+			disjunction.put("type", "group");
+			disjunction.put("operation", "or");
+			disjunction.put("operands", disjOperands);
 			// decide where to put the disjunction
 			if (openNodeCats.get(1).equals("query")) {
 				requestMap.put("query", disjunction);	
 			} else if (openNodeCats.get(1).equals("cq_segments")) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(disjunction);
 			}
 		}
@@ -457,6 +433,7 @@
 			} else if (fieldNameNode.getChildCount() == 3) {
 				// layer is indicated, merge layer and field name (0th and 2nd children, 1st is "/")
 				String layer = fieldNameNode.getChild(0).toStringTree(poliqarpParser);
+				if (layer.equals("base")) layer="lemma";
 				String layeredFieldName = fieldNameNode.getChild(2).toStringTree(poliqarpParser);
 				fieldName = layer+"/"+layeredFieldName;
 			}
@@ -469,31 +446,38 @@
 					relation = "!"+relation;
 				}
 			}
+			if (relation.equals("=")) {
+				relation="eq";
+			}
+			if (relation.equals("!=")) {
+				relation="ne";
+			}
 			String value = "";
 			ParseTree valNode = node.getChild(2);
 			String valType = QueryUtils.getNodeCat(valNode);
-			fieldMap.put("@type", "korap:term");
+			fieldMap.put("type", "term");
 			if (valType.equals("simple_query")) {
 				value = valNode.getChild(0).getChild(0).toStringTree(poliqarpParser);   //e.g. (simple_query (sq_segment foo))
 			} else if (valType.equals("re_query")) {
 				value = valNode.getChild(0).toStringTree(poliqarpParser); 				//e.g. (re_query "bar*")
-				fieldMap.put("@subtype", "korap:value#regex");
+				fieldMap.put("@subtype", "value#regex");
 			}
-			fieldMap.put("@value", value);
+			fieldMap.put("key", value);
 			if (fieldName.contains("/")) {
 				String[] splitted = fieldName.split("/");
-				fieldMap.put("@attr", splitted[1]);
-				fieldMap.put("@foundry", splitted[0]);
+				fieldMap.put("layer", splitted[1]);
+				fieldMap.put("foundry", splitted[0]);
 			} else {
-				fieldMap.put("@attr", fieldName);
+				if (fieldName.equals("base")) fieldName = "lemma";
+				fieldMap.put("layer", fieldName);
 			}
-			fieldMap.put("@relation", relation);
+			fieldMap.put("match", relation);
 			// Step II: decide where to put the field map (as the only value of a token or the meta filter or as a part of a group in case of coordinated fields)
 			if (fieldStack.isEmpty()) {
 				if (!inMeta) {
-					tokenStack.getFirst().put("@value", fieldMap);
+					tokenStack.getFirst().put("key", fieldMap);
 				} else {
-					((HashMap<String, Object>) requestMap.get("meta")).put("@value", fieldMap);
+					((HashMap<String, Object>) requestMap.get("meta")).put("key", fieldMap);
 				}
 			} else {
 				fieldStack.getFirst().add(fieldMap);
@@ -511,8 +495,8 @@
 		if (nodeCat.equals("conj_field")) {
 			LinkedHashMap<String,Object> group = new LinkedHashMap<String,Object>(); 
 			ArrayList<Object> groupOperands = new ArrayList<Object>();
-			group.put("@type", "korap:group");
-			group.put("@operands", groupOperands);
+			group.put("type", "group");
+			group.put("operands", groupOperands);
 			fieldStack.push(groupOperands);
 			stackedFields++;
 			// Step I: get operator (& or |)
@@ -522,16 +506,16 @@
 			if (negField) {
 				relation = relation.equals("or") ? "and": "or";
 			}
-			group.put("@relation", relation);
+			group.put("operation", relation);
 			// Step II: decide where to put the group (directly under token or in top meta filter section or embed in super group)
 			if (openNodeCats.get(1).equals("cq_segment")) {
-				tokenStack.getFirst().put("@value", group);
+				tokenStack.getFirst().put("key", group);
 			} else if (openNodeCats.get(1).equals("meta_field_group")) {
-				((HashMap<String, Object>) requestMap.get("meta")).put("@value", group);
+				((HashMap<String, Object>) requestMap.get("meta")).put("key", group);
 			} else if (openNodeCats.get(2).equals("conj_field")) {
 				fieldStack.get(1).add(group);
 			} else {
-				tokenStack.getFirst().put("@value", group);
+				tokenStack.getFirst().put("key", group);
 			}
 			// skip the operator
 			visited.add(node.getChild(1));
@@ -556,17 +540,17 @@
 			if (node.getText().equals("[]")) {
 				
 			} else {
-				token.put("@type", "korap:token");
+				token.put("type", "token");
 				String word = node.getChild(0).toStringTree(poliqarpParser);
 				LinkedHashMap<String,Object> tokenValues = new LinkedHashMap<String,Object>();
-				token.put("@value", tokenValues);
-				tokenValues.put("@type", "korap:term");
-				tokenValues.put("@value", word);
-				tokenValues.put("@attr", "orth");
-				tokenValues.put("@relation", "=");
+				token.put("key", tokenValues);
+				tokenValues.put("type", "term");
+				tokenValues.put("key", word);
+				tokenValues.put("layer", "orth");
+				tokenValues.put("match", "eq");
 				// add token to sequence only if it is not an only child (in that case, sq_segments has already added the info and is just waiting for the values from "field")
 				if (node.getParent().getChildCount()>1) {
-					ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+					ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 					topSequenceOperands.add(token);
 				}
 			}
@@ -575,22 +559,22 @@
 		
 		if (nodeCat.equals("re_query")) {
 			LinkedHashMap<String,Object> reQuery = new LinkedHashMap<String,Object>();
-			reQuery.put("@subtype", "korap:regex");
+			reQuery.put("@subtype", "regex");
 			String regex = node.getChild(0).toStringTree(poliqarpParser);
-			reQuery.put("@value", regex);
-			reQuery.put("@relation", "=");
+			reQuery.put("key", regex);
+			reQuery.put("match", "eq");
 			
 			// if in field, regex was already added there
 			if (!openNodeCats.get(1).equals("field")) {
 				LinkedHashMap<String,Object> token = new LinkedHashMap<String,Object>();
-				token.put("@type", "korap:token");
-				token.put("@value", reQuery);
-				reQuery.put("@type", "korap:term");
+				token.put("type", "token");
+				token.put("key", reQuery);
+				reQuery.put("type", "term");
 				
 				if (openNodeCats.get(1).equals("query")) {
 					requestMap.put("query", token);
 				} else {
-					ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+					ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 					topSequenceOperands.add(token);
 				}
 			} 
@@ -607,18 +591,18 @@
 			stackedObjects++;
 			// Step I: get info
 			// fill group
-			alignGroup.put("@type", "korap:group");
-			alignGroup.put("@alignment", "left");
-			alignGroup.put("@operands", new ArrayList<Object>());
+			alignGroup.put("type", "group");
+			alignGroup.put("alignment", "left");
+			alignGroup.put("operands", new ArrayList<Object>());
 			// Step II: decide where to put the group
 			// add group to sequence only if it is not an only child (in that case, sq_segments has already added the info and is just waiting for the relevant info)
 			if (node.getParent().getChildCount()>1) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(alignGroup);
 			} else if (openNodeCats.get(2).equals("query")) {
 				requestMap.put("query", alignGroup);	
 			} else {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(alignGroup); 
 			}
 			visited.add(node.getChild(0));
@@ -637,12 +621,12 @@
 			objectStack.push(elem);
 			stackedObjects++;
 			// Step II: fill object (token values) and put into containing sequence
-			elem.put("@type", "korap:span");
+			elem.put("type", "span");
 			String value = node.getChild(1).toStringTree(poliqarpParser);
-			elem.put("@value", value);
+			elem.put("key", value);
 			// add token to sequence only if it is not an only child (in that case, cq_segments has already added the info and is just waiting for the values from "field")
 			if (node.getParent().getChildCount()>1) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(elem);
 			}
 			visited.add(node.getChild(0));
@@ -652,8 +636,8 @@
 		
 		if (nodeCat.equals("spanclass")) {
 			LinkedHashMap<String,Object> span = new LinkedHashMap<String,Object>();
-			span.put("@type", "korap:group");
-			span.put("@relation", "class");
+			span.put("type", "group");
+			span.put("operation", "class");
 			objectStack.push(span);
 			stackedObjects++;
 			ArrayList<Object> spanOperands = new ArrayList<Object>();
@@ -664,7 +648,7 @@
 				try {	
 					classId = Integer.parseInt(ref);
 				} catch (NumberFormatException e) {
-					throw new QueryException("The specified class reference in the shrink/split-Operator is not a number.");
+					throw new QueryException("The specified class reference in the shrink/split-Operator is not a number: "+ref);
 				}
 				// only allow class id up to 255
 				if (classId>255) {
@@ -672,13 +656,13 @@
 				}
 			}
 			span.put("class", classId);
-			span.put("@operands", spanOperands);
+			span.put("operands", spanOperands);
 			// Step II: decide where to put the span
 			// add span to sequence only if it is not an only child (in that case, cq_segments has already added the info and is just waiting for the relevant info)
 			if (openNodeCats.get(2).equals("query") && node.getParent().getChildCount() == 1) {
 				requestMap.put("query", span);	
 			} else if (objectStack.size()>1) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(span); 
 			} 
 			// ignore leading and trailing braces
@@ -696,20 +680,20 @@
 			ArrayList<Object> posOperands = new ArrayList<Object>();
 			// Step I: get info
 			String relation = QueryUtils.getNodeCat(node.getChild(0));
-			positionGroup.put("@type", "korap:group");
-			positionGroup.put("@relation", "position");
-			positionGroup.put("@position", relation.toLowerCase());
+			positionGroup.put("type", "group");
+			positionGroup.put("operation", "position");
+			positionGroup.put("frame", relation.toLowerCase());
 //			positionGroup.put("@subtype", "incl");
-			positionGroup.put("@operands", posOperands);
+			positionGroup.put("operands", posOperands);
 			// Step II: decide where to put the group
 			// add group to sequence only if it is not an only child (in that case, sq_segments has already added the info and is just waiting for the relevant info)
 			if (node.getParent().getChildCount()>1) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(positionGroup); 
 			} else if (openNodeCats.get(2).equals("query")) {
 				requestMap.put("query", positionGroup);	
 			} else {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 				topSequenceOperands.add(positionGroup); 
 			}
 		}
@@ -746,23 +730,25 @@
 			} else {
 				classRefs.add(0);
 			}
-			shrinkGroup.put("@type", "korap:group");
-			shrinkGroup.put("@relation", node.getChild(0).toStringTree(poliqarpParser));
+			shrinkGroup.put("type", "group");
+			String type = node.getChild(0).toStringTree(poliqarpParser);
+			String operation = type.equals("shrink") ? "submatch" : "split";
+			shrinkGroup.put("operation", operation);
 			shrinkGroup.put("classRef", classRefs);
 			if (classRefOp != null) {
 				shrinkGroup.put("classRefOp", classRefOp);
 			}
-			shrinkGroup.put("@operands", shrinkOperands);
+			shrinkGroup.put("operands", shrinkOperands);
 			int i=1;
 			// Step II: decide where to put the group
 			// add group to sequence only if it is not an only child (in that case, sq_segments has already added the info and is just waiting for the relevant info)
 			if (node.getParent().getChildCount()>1) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(i).get("@operands"); // this shrinkGroup is on top
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(i).get("operands"); // this shrinkGroup is on top
 				topSequenceOperands.add(shrinkGroup);
 			} else if (openNodeCats.get(2).equals("query")) {
 				requestMap.put("query", shrinkGroup);	
 			} else if (objectStack.size()>1) {
-				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(i).get("@operands");
+				ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(i).get("operands");
 				topSequenceOperands.add(shrinkGroup); 
 			} 
 			visited.add(node.getChild(0));
@@ -773,7 +759,7 @@
 			ParseTree occChild = node.getChild(0);
 			String repetition = occChild.toStringTree(poliqarpParser);
 			String[] minmax = parseRepetition(repetition);
-			curOccGroup.put("@relation", "repetition");
+			curOccGroup.put("operation", "repetition");
 			curOccGroup.put("@min", minmax[0]);
 			curOccGroup.put("@max", minmax[1]);
 			visited.add(occChild);
@@ -783,14 +769,14 @@
 		if (nodeCat.equals("flag")) {
 			String flag = QueryUtils.getNodeCat(node.getChild(0)).substring(1); //substring removes leading slash '/'
 			// add to current token's value
-			((HashMap<String, Object>) curToken.get("@value")).put("flag", flag);
+			((HashMap<String, Object>) curToken.get("key")).put("flag", flag);
 		}
 		
 		if (nodeCat.equals("meta")) {
 			inMeta=true;
 			LinkedHashMap<String,Object> metaFilter = new LinkedHashMap<String,Object>();
 			requestMap.put("meta", metaFilter);
-			metaFilter.put("@type", "korap:meta");
+			metaFilter.put("type", "meta");
 		}
 		
 		if (nodeCat.equals("within") && !QueryUtils.getNodeCat(node.getParent()).equals("position")) {
@@ -902,9 +888,9 @@
 	@SuppressWarnings("unchecked")
 	private void createOccGroup(ParseTree node) {
 		LinkedHashMap<String,Object> occGroup = new LinkedHashMap<String,Object>();
-		occGroup.put("@type", "korap:group");
+		occGroup.put("type", "group");
 		ArrayList<Object> groupOperands = new ArrayList<Object>();
-		occGroup.put("@operands", groupOperands);
+		occGroup.put("operands", groupOperands);
 		curOccGroup = occGroup;
 		objectStack.push(occGroup);
 		stackedObjects++;
@@ -913,7 +899,7 @@
 				requestMap.put("query", occGroup);
 		// embed in super sequence
 		} else {
-			ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("@operands");
+			ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(1).get("operands");
 			topSequenceOperands.add(occGroup);
 		}		
 	}
@@ -961,28 +947,13 @@
 		 * For testing
 		 */
 		
-//		PoliqarpPlusTree pt1 = new PoliqarpPlusTree("[base=Hund] | [base=Katze][base=Maus]");
-//		PoliqarpPlusTree pt2 = new PoliqarpPlusTree("[base=Hund] | [base=Katze] [base=Maus]");
-//		System.err.println(pt1.getRequestMap().equals(pt2.getRequestMap()));
 		
 		String[] queries = new String[] {
-//				"startswith(<s>,[][base=der][base=Mann])",
-////				"[][base=Mann]",
-//				"[base=Hund][][base=Katze][][][base=Maus]",
-//				"[base=Hund][]?[][base=Katze]",
-//				"split([base=der]{[base=Mann]})",
-//				"[base=Mann&gen=m&cas=N]",
-//				"[base=Hund] | [base=Katze][base=Maus]",
-//				"Baum | Haus",
-//				"Baum | Stein Haus",
-//				"^contains(<s>,<np>)",
-//				"([base=a]^[base=b][base=c])|[base=d]",
-//				"[orth=der]^[orth=große][orth=Mann]",
-//				"([base=a]^[base=b]^[base=c])|[base=d]",
 				"shrink(1|2:{1:[base=der]}{2:[base=Mann]})",
 //				"[base=foo] meta (author=name&year=2000)",
 //				"[base=foo] meta year=2000",
-				"{[base=Mann]}"
+				"{[base=Mann]}",
+				"shrink(1:[orth=Der]{1:[orth=Mann][orth=geht]})"
 		};
 		PoliqarpPlusTree.debug=true;
 		for (String q : queries) {
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java b/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java
index 3252c0f..89db3e7 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/QuerySerializer.java
@@ -45,23 +45,12 @@
 					 * regex
 					 * & field_group
 					 */
-                    "[base=foo]|([base=foo][base=bar])* meta author=Goethe&year=1815",
-                    "([base=foo]|[base=bar])[base=foobar]",
-                    "shrink({[base=Mann]})",
-                    "shrink({[base=foo]}[orth=bar])",
-                    "shrink(1:[base=Der]{1:[base=Mann]})",
-
-                    "[base=Katze]",
-                    "[base!=Katze]",
-                    "[!base=Katze]",
-                    "[base=Katze&orth=Katzen]",
-                    "[base=Katze][orth=und][orth=Hunde]",
-                    "[!(base=Katze&orth=Katzen)]",
-                    "contains(<np>,[base=Mann])",
-                    "startswith(<np>,[!pos=Det])",
-                    "'vers{2,3}uch'",
-                    "[orth='vers.*ch']",
-                    "[(base=bar|base=foo)&orth=foobar]",
+                    "Der Mann",
+    				"Der /+w1:3 Mann",
+    				"Der /+w1:3,s1 Mann",
+    				"(Der /+w1:3,s1 Mann) /+w5 geht",
+    				"(Der /+w1:3,s1 Mann) /-w5 geht",
+    				"(Der /+w1:3,s1 Mann) /+w5 (geht weg)",
 
             };
         } else {
@@ -72,7 +61,7 @@
             i++;
             try {
                 System.out.println(q);
-                jg.run(q, "poliqarp", System.getProperty("user.home") + "/bsp" + i + ".json");
+                jg.run(q, "cosmas", System.getProperty("user.home") + "/bsp" + i + ".json");
                 System.out.println();
             } catch (NullPointerException npe) {
                 npe.printStackTrace();
@@ -105,8 +94,8 @@
             throws JsonGenerationException, JsonMappingException, IOException, QueryException {
         if (queryLanguage.equals("poliqarp")) {
             ast = new PoliqarpPlusTree(query);
-//		} else if (queryLanguage.equals("cosmas")) {
-//			ast = new CosmasTree(query);
+		} else if (queryLanguage.equals("cosmas")) {
+			ast = new CosmasTree(query);
         } else if (queryLanguage.equals("poliqarpplus")) {
             ast = new PoliqarpPlusTree(query);
         } else {
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/QueryUtils.java b/src/main/java/de/ids_mannheim/korap/query/serialize/QueryUtils.java
index 736b875..cee10ef 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/QueryUtils.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/QueryUtils.java
@@ -260,6 +260,77 @@
 
         return request;
     }
+    
+    public static void prepareContext(LinkedHashMap<String, Object> requestMap) {
+		LinkedHashMap<String,Object> context = new LinkedHashMap<String,Object>();
+		
+		LinkedHashMap<String,Object> classMap = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> operands = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> operation = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> frame = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> classRef = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> spanRef = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> classRefOp = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> min = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> max = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> exclude = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> distances = new LinkedHashMap<String,Object>();
+		LinkedHashMap<String,Object> inOrder = new LinkedHashMap<String,Object>();
+		
+		operation.put("@id", "group:operation/");
+		operation.put("@type", "@id");
+		
+		classMap.put("@id", "group:class");
+		classMap.put("@type", "xsd:integer");
+		
+		operands.put("@id", "group:operands");
+		operands.put("@container", "@list");
+		
+		frame.put("@id", "group:frame/");
+		frame.put("@type", "@id");
+		
+		classRef.put("@id", "group:classRef");
+		classRef.put("@type", "xsd:integer");
+		
+		spanRef.put("@id", "group:spanRef");
+		spanRef.put("@type", "xsd:integer");
+		
+		classRefOp.put("@id", "group:classRefOp");
+		classRefOp.put("@type", "@id");
+		
+		min.put("@id", "boundary:min");
+		min.put("@type", "xsd:integer");
+		
+		max.put("@id", "boundary:max");
+		max.put("@type", "xsd:integer");
+		
+		exclude.put("@id", "group:exclude");
+		exclude.put("@type", "xsd:boolean");
+		
+		distances.put("@id", "group:distances");
+		distances.put("@container", "@list");
+		
+		inOrder.put("@id", "group:inOrder");
+		inOrder.put("@type", "xsd:boolean");
+		
+		context.put("korap", "http://korap.ids-mannheim.de/ns/KorAP/json-ld/v0.1/");
+		context.put("boundary", "korap:boundary/");
+		context.put("group", "korap:group/");
+		context.put("operation", operation);
+		context.put("class", classMap);
+		context.put("operands", operands);
+		context.put("frame", frame);
+		context.put("classRef", classRef);
+		context.put("spanRef", spanRef);
+		context.put("classRefOp", classRefOp);
+		context.put("min", min);
+		context.put("max", max);
+		context.put("exclude", exclude);
+		context.put("distances", distances);
+		context.put("inOrder", inOrder);
+		
+		requestMap.put("@context", context);		
+	}