adapted Cosmas and PQ to current JSON-LD specifications
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 beb2c38..6f471e4 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
@@ -136,8 +136,8 @@
 		
 		context.put("korap", "http://korap.ids-mannheim.de/ns/query");
 		context.put("@language", "de");
-		context.put("operands", operands);
-		context.put("relation", relation);
+		context.put("@operands", operands);
+		context.put("@relation", relation);
 		context.put("class", classMap);
 		context.put("query", "korap:query");
 		context.put("filter", "korap:filter");
@@ -203,7 +203,7 @@
 						// 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("@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
@@ -230,15 +230,16 @@
 			
 			fieldMap.put("@type", "korap:term");			
 			// make category-specific fieldMap entry
-			String attr = nodeCat.equals("OPWF") ? "orth:" : "base:";
-			String value = attr+node.getChild(0).toStringTree().replaceAll("\"", "");
+			String attr = nodeCat.equals("OPWF") ? "orth" : "lemma";
+			String value = node.getChild(0).toStringTree().replaceAll("\"", "");
 			fieldMap.put("@value", value);
+			fieldMap.put("@attr", attr);
 			
 			// negate field (see above)
 			if (negate) {
-				fieldMap.put("relation", "!=");
+				fieldMap.put("@relation", "!=");
 			} else {
-				fieldMap.put("relation", "=");
+				fieldMap.put("@relation", "=");
 			}
 			//Step II: decide where to put
 			putIntoSuperObject(token, 1);
@@ -248,43 +249,56 @@
 			//Step I: get info
 			LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
 			token.put("@type", "korap:token");
+			LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
+			token.put("@value", fieldMap);
 			
-			List<String> morphValues = QueryUtils.parseMorph(node.getChild(0).toStringTree());
-			if (morphValues.size() == 1) {
-				LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
-				token.put("@value", fieldMap);
-				
-				fieldMap.put("@type", "korap:term");
-				fieldMap.put("@value", morphValues.get(0));
-				// make category-specific fieldMap entry
-				// negate field (see above)
-				if (negate) {
-					fieldMap.put("relation", "!=");
-				} else {
-					fieldMap.put("relation", "=");
-				}
+			fieldMap.put("@type", "korap:term");
+//			fieldMap.put("@value", "morph:"+node.getChild(0).toString().replace(" ", "_"));
+			fieldMap.put("@value", node.getChild(0).toString().replace(" ", "_"));
+			// make category-specific fieldMap entry
+			// negate field (see above)
+			if (negate) {
+				fieldMap.put("@relation", "!=");
 			} else {
-				LinkedHashMap<String, Object> conjGroup = new LinkedHashMap<String, Object>();
-				token.put("@value", conjGroup);
-				ArrayList<Object> conjOperands = new ArrayList<Object>();
-				conjGroup.put("@type", "korap:group");
-				conjGroup.put("relation", "and");
-				conjGroup.put("operands", conjOperands);
-				for (String value : morphValues) {
-					LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
-					token.put("@value", fieldMap);
-					
-					fieldMap.put("@type", "korap:term");
-					fieldMap.put("@value", value);
-					// make category-specific fieldMap entry
-					// negate field (see above)
-					if (negate) {
-						fieldMap.put("relation", "!=");
-					} else {
-						fieldMap.put("relation", "=");
-					}
-				}
+				fieldMap.put("@relation", "=");
 			}
+//			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);
+//				
+//				fieldMap.put("@type", "korap:term");
+//				fieldMap.put("@value", morphValues.get(0));
+//				// make category-specific fieldMap entry
+//				// negate field (see above)
+//				if (negate) {
+//					fieldMap.put("@relation", "!=");
+//				} else {
+//					fieldMap.put("@relation", "=");
+//				}
+//			} else {
+//				LinkedHashMap<String, Object> conjGroup = new LinkedHashMap<String, Object>();
+//				token.put("@value", conjGroup);
+//				ArrayList<Object> conjOperands = new ArrayList<Object>();
+//				conjGroup.put("@type", "korap:group");
+//				conjGroup.put("@relation", "and");
+//				conjGroup.put("@operands", conjOperands);
+//				for (String value : morphValues) {
+//					LinkedHashMap<String, Object> fieldMap = new LinkedHashMap<String, Object>();
+//					token.put("@value", fieldMap);
+//					
+//					fieldMap.put("@type", "korap:term");
+//					fieldMap.put("@value", value);
+//					// make category-specific fieldMap entry
+//					// negate field (see above)
+//					if (negate) {
+//						fieldMap.put("@relation", "!=");
+//					} else {
+//						fieldMap.put("@relation", "=");
+//					}
+//				}
+//			}
 			
 			
 			//Step II: decide where to put
@@ -294,7 +308,7 @@
 		if (nodeCat.equals("OPELEM")) {
 			// Step I: create element
 			LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
-			elem.put("@type", "korap:element");
+			elem.put("@type", "korap:span");
 			elem.put("@value", node.getChild(0).getChild(0).toStringTree().toLowerCase());
 			//Step II: decide where to put
 			putIntoSuperObject(elem);
@@ -303,7 +317,7 @@
 		if (nodeCat.equals("OPLABEL")) {
 			// Step I: create element
 			LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
-			elem.put("@type", "korap:element");
+			elem.put("@type", "korap:span");
 			elem.put("@value", node.getChild(0).toStringTree().replaceAll("<|>", ""));
 			//Step II: decide where to put
 			putIntoSuperObject(elem);
@@ -316,8 +330,8 @@
 			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("@relation", relation);
+			disjunction.put("@operands", new ArrayList<Object>());
 			objectStack.push(disjunction);
 			stackedObjects++;
 			// Step II: decide where to put
@@ -325,25 +339,28 @@
 		}
 		
 		if (nodeCat.equals("OPPROX")) {
+			//TODO direction "both": wrap in "or" group with operands once flipped, once not
 			// collect info
 			Tree prox_opts = node.getChild(0);
 			Tree typ = prox_opts.getChild(0);
 			Tree dist_list = prox_opts.getChild(1);
 			// Step I: create group
-			LinkedHashMap<String, Object> proxGroup = new LinkedHashMap<String, Object>();
-			proxGroup.put("@type", "korap:group");
-			proxGroup.put("relation", "distance");
-			objectStack.push(proxGroup);
+			LinkedHashMap<String, Object> proxSequence = new LinkedHashMap<String, Object>();
+			proxSequence.put("@type", "korap:sequence");
+			objectStack.push(proxSequence);
 			stackedObjects++;
-			if (openNodeCats.get(1).equals("OPALL")) proxGroup.put("match", "all");
-			else if (openNodeCats.get(1).equals("OPNHIT")) proxGroup.put("match", "between");
-			else proxGroup.put("match", "operands");
+//			if (openNodeCats.get(1).equals("OPALL")) proxSequence.put("match", "all");
+//			else if (openNodeCats.get(1).equals("OPNHIT")) proxSequence.put("match", "between");
+//			else proxSequence.put("match", "operands");
 			ArrayList<Object> constraints = new ArrayList<Object>();
-			String subtype = typ.getChild(0).toStringTree().equals("PROX") ? "incl" : "excl"; 
-			proxGroup.put("@subtype", subtype);
-			proxGroup.put("constraint", constraints);
+			boolean exclusion = ! typ.getChild(0).toStringTree().equals("PROX"); 
+			
+			String inOrder = "true";
+			proxSequence.put("@inOrder", inOrder);
+			proxSequence.put("@constraints", constraints);
+			
 			ArrayList<Object> operands = new ArrayList<Object>(); 
-			proxGroup.put("operands", operands);
+			proxSequence.put("@operands", operands);
 			
 			// if only one dist_info, put directly into constraints
 			if (dist_list.getChildCount()==1) {
@@ -357,22 +374,27 @@
 				if (direction.equals("minus")) {
 					direction = "plus";
 					invertedOperandsLists.add(operands);
+				} else if (direction.equals("both")) {
+					inOrder="false";
 				}
 				LinkedHashMap<String, Object> distance = new LinkedHashMap<String, Object>();
 				distance.put("@type", "korap:distance");
-				distance.put("measure", meas);
-				distance.put("direction", direction);
-				distance.put("min", min);
-				distance.put("max", max);
+				distance.put("@measure", meas);
+				distance.put("@min", Integer.parseInt(min));
+				distance.put("@max", Integer.parseInt(max));
+				if (exclusion) {
+					distance.put("@exclude", exclusion);
+				}
 				constraints.add(distance);
+				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("@relation", "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();
@@ -384,32 +406,42 @@
 					}
 					LinkedHashMap<String, Object> distance = new LinkedHashMap<String, Object>();
 					distance.put("@type", "korap:distance");
-					distance.put("measure", meas);
-					distance.put("direction", direction);
-					distance.put("min", min);
-					distance.put("max", max);
+					distance.put("@measure", meas);
+					distance.put("@min", min);
+					distance.put("@max", max);
+					if (exclusion) {
+						distance.put("@exclude", exclusion);
+					}
 					groupOperands.add(distance);
+					if (direction.equals("plus")) {
+						inOrder="true";
+					} else if (direction.equals("minus")) {
+						inOrder="true";
+						invertedOperandsLists.add(operands);
+					}
 				}
+				proxSequence.put("@inOrder", inOrder);
+				
 			}
 			// Step II: decide where to put
-			putIntoSuperObject(proxGroup, 1);
+			putIntoSuperObject(proxSequence, 1);
 		}
 		
 		// inlcusion or overlap
 		if (nodeCat.equals("OPIN") || nodeCat.equals("OPOV")) {
 			// Step I: create group
-			LinkedHashMap<String, Object> shrinkgroup = new LinkedHashMap<String, Object>();
-			shrinkgroup.put("@type", "korap:group");
-			shrinkgroup.put("relation", "shrink");
-			shrinkgroup.put("shrink", "1");
+			LinkedHashMap<String, Object> submatchgroup = new LinkedHashMap<String, Object>();
+			submatchgroup.put("@type", "korap:group");
+			submatchgroup.put("@relation", "submatch");
+			submatchgroup.put("@classRef", "1");
 			
-			ArrayList<Object> shrinkoperands = new ArrayList<Object>(); 
+			ArrayList<Object> submatchoperands = new ArrayList<Object>(); 
 			LinkedHashMap<String, Object> posgroup = new LinkedHashMap<String, Object>();
-			shrinkgroup.put("operands", shrinkoperands);
-			shrinkoperands.add(posgroup);
+			submatchgroup.put("@operands", submatchoperands);
+			submatchoperands.add(posgroup);
 			posgroup.put("@type", "korap:group");
-			String relation = nodeCat.equals("OPIN") ? "position" : "overlap";
-			posgroup.put("relation", relation);
+			String relation = nodeCat.equals("OPIN") ? "position" : "overlaps";
+			posgroup.put("@relation", relation);
 			
 			if (nodeCat.equals("OPIN")) {
 				parseOPINOptions(node, posgroup);
@@ -419,14 +451,14 @@
 			
 			
 			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);
 			stackedObjects++;
 			
 			// Step II: decide where to put
-			putIntoSuperObject(shrinkgroup, 1);
+			putIntoSuperObject(submatchgroup, 1);
 		}
 		
 		
@@ -436,7 +468,7 @@
 			LinkedHashMap<String, Object> classGroup = new LinkedHashMap<String, Object>();
 			classGroup.put("@type", "korap:group");
 			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
@@ -452,10 +484,15 @@
 			// Step I: create group
 			LinkedHashMap<String, Object> beggroup = new LinkedHashMap<String, Object>();
 			beggroup.put("@type", "korap:group");
-			beggroup.put("relation", "shrink");
-			String reduction = nodeCat.equals("OPBEG") ? "first" : "last";
-			beggroup.put("shrink", reduction);
-			beggroup.put("operands", new ArrayList<Object>());
+			beggroup.put("@relation", "submatch");
+			ArrayList<Integer> spanRef = new ArrayList<Integer>();
+			if (nodeCat.equals("OPBEG")) {
+				spanRef.add(0); spanRef.add(1);
+			} else {
+				spanRef.add(-1); spanRef.add(1);
+			}
+			beggroup.put("@spanRef", spanRef);
+			beggroup.put("@operands", new ArrayList<Object>());
 			objectStack.push(beggroup);
 			stackedObjects++;
 			
@@ -471,15 +508,15 @@
 			if (conditions.getChildCount()==1) {
 				LinkedHashMap<String, Object> posgroup = new LinkedHashMap<String, Object>();
 				posgroup.put("@type", "korap:group");
-				posgroup.put("relation", "position");
+				posgroup.put("@relation", "position");
 				CosmasCondition c = new CosmasCondition(conditions.getChild(0));
-				posgroup.put("position", c.position);
-				if (c.negated) posgroup.put("@subtype", "excl");
+				posgroup.put("@position", c.position);
+				if (c.negated) posgroup.put("@relation", "!=");
 				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:element");
+				bedElem.put("@type", "korap:span");
 				bedElem.put("@value", c.elem);
 				objectStack.push(posgroup);
 				stackedObjects++;
@@ -492,9 +529,9 @@
 				// -> 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("@relation", "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++) {
@@ -505,15 +542,15 @@
 					
 					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("@subtype", "excl");
+					posGroup.put("@relation", "position");
+					posGroup.put("@position", 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:element");
+					bedElem.put("@type", "korap:span");
 					bedElem.put("@value", c.elem);
 					
 					
@@ -586,7 +623,7 @@
 		} else {
 			position = "contains";
 		}
-		posgroup.put("position", position);
+		posgroup.put("@position", position);
 		position = openNodeCats.get(1).equals("OPIN") ? "contains" : "full";
 		
 		if (rangenode != null) {
@@ -599,13 +636,14 @@
 				negatePosition = !negatePosition;
 			}
 		}
-		
+		System.err.println(negatePosition);
 		if (negatePosition) {
-			posgroup.put("@subtype", "excl");	
+			posgroup.put("@exclude", "true");	
+//			negate = !negate;
 		}
 		
 		if (groupnode != null) {
-			String grouping = groupnode.getChild(0).toStringTree().equals("MAX") ? "true" : "false";
+			String grouping = groupnode.getChild(0).toStringTree().equals("max") ? "true" : "false";
 			posgroup.put("grouping", grouping);
 		}
 	}
@@ -622,16 +660,16 @@
 		} else {
 			position = "any";
 		}
-		posgroup.put("position", position);
+		posgroup.put("@position", position);
 		position = openNodeCats.get(1).equals("OPIN") ? "contains" : "full";
 		
 		if (exclnode != null) {
 			if (exclnode.getChild(0).toStringTree().equals("YES")) {
-				posgroup.put("@subtype", "excl");
+				posgroup.put("@relation", "!=");
 			}
 		}
 		if (groupnode != null) {
-			String grouping = groupnode.getChild(0).toStringTree().equals("MAX") ? "true" : "false";
+			String grouping = groupnode.getChild(0).toStringTree().equals("@max") ? "true" : "false";
 			posgroup.put("grouping", grouping);
 		}
 		
@@ -681,7 +719,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 {
@@ -724,7 +762,12 @@
 		 */
 		String[] queries = new String[] {
 				/* COSMAS 2 */
-				"MORPH(V)"
+				"MORPH(V)",
+				"MORPH(V PRES)",
+				"wegen #IN(%, L) <s>",
+				"wegen #IN(%) <s>",
+				"(Mann oder Frau) #IN <s>",
+				"#BEG(der /w3:5 Mann) /+w10 kommt"
 				};
 		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 b10105c..530f597 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
@@ -178,8 +178,8 @@
 		
 		context.put("korap", "http://korap.ids-mannheim.de/ns/query");
 		context.put("@language", "de");
-		context.put("operands", operands);
-		context.put("relation", relation);
+		context.put("@operands", operands);
+		context.put("@relation", relation);
 		context.put("class", classMap);
 		context.put("query", "korap:query");
 		context.put("filter", "korap:filter");
@@ -277,7 +277,6 @@
 				}
 				// Step I: decide type of element (one or more elements? -> token or sequence)
 				// take into account a possible 'occ' child with accompanying parantheses, therefore 3 extra children
-				// TODO analyse emptysegments
 				int occExtraChildren = cqHasOccChild ? 3:0;
 				if (node.getChildCount()>1 + occExtraChildren) {
 					ParseTree emptySegments = QueryUtils.getFirstChildWithCat(node, "empty_segments");
@@ -285,20 +284,19 @@
 						String[] minmax = parseEmptySegments(emptySegments);
 						Integer min = Integer.parseInt(minmax[0]);
 						Integer max = Integer.parseInt(minmax[1]);
-						sequence.put("@type", "korap:group");
-						sequence.put("relation", "distance");
-						sequence.put("@subtype", "incl");
+						sequence.put("@type", "korap:sequence");
+//						sequence.put("@relation", "distance");
+						sequence.put("@inOrder", "true");
 						ArrayList<Object> constraint = new ArrayList<Object>(); 
-						sequence.put("constraint", constraint);
+						sequence.put("@constraints", 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("measure", "w");
-						distMap.put("direction", "plus");
 						distMap.put("min", min);
 						distMap.put("max", max);
 					} else {
@@ -311,7 +309,7 @@
 							sequence.put("offset-min", min);
 							sequence.put("offset-max", max);
 						}
-						sequence.put("operands", sequenceOperands);
+						sequence.put("@operands", sequenceOperands);
 						objectStack.push(sequence);
 						stackedObjects++;
 					}
@@ -334,7 +332,7 @@
 				// 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 {
@@ -350,20 +348,20 @@
 								LinkedHashMap<String,Object> superSequence = new LinkedHashMap<String,Object>();
 								superSequence.put("@type", "korap: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);
 					}
 				}
@@ -404,7 +402,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);
 				}
 			}
@@ -415,13 +413,13 @@
 			LinkedHashMap<String,Object> group = new LinkedHashMap<String,Object>();
 			curOccGroup = group;
 			group.put("@type", "korap:group");
-			group.put("operands", new ArrayList<Object>());
+			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);
@@ -435,13 +433,13 @@
 			stackedObjects++;
 			ArrayList<Object> disjOperands = new ArrayList<Object>();
 			disjunction.put("@type", "korap:group");
-			disjunction.put("relation", "or");
-			disjunction.put("operands", disjOperands);
+			disjunction.put("@relation", "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);
 			}
 		}
@@ -479,8 +477,15 @@
 				value = valNode.getChild(0).toStringTree(poliqarpParser); 				//e.g. (re_query "bar*")
 				fieldMap.put("@subtype", "korap:value#regex");
 			}
-			fieldMap.put("@value", fieldName+":"+value);
-			fieldMap.put("relation", relation);
+			fieldMap.put("@value", value);
+			if (fieldName.contains("/")) {
+				String[] splitted = fieldName.split("/");
+				fieldMap.put("@attr", splitted[1]);
+				fieldMap.put("@foundry", splitted[0]);
+			} else {
+				fieldMap.put("@attr", fieldName);
+			}
+			fieldMap.put("@relation", 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) {
@@ -505,7 +510,7 @@
 			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("@operands", groupOperands);
 			fieldStack.push(groupOperands);
 			stackedFields++;
 			// Step I: get operator (& or |)
@@ -515,7 +520,7 @@
 			if (negField) {
 				relation = relation.equals("or") ? "and": "or";
 			}
-			group.put("relation", relation);
+			group.put("@relation", 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);
@@ -554,15 +559,15 @@
 				LinkedHashMap<String,Object> tokenValues = new LinkedHashMap<String,Object>();
 				token.put("@value", tokenValues);
 				tokenValues.put("@type", "korap:term");
-				tokenValues.put("@value", "orth:"+word);
-				tokenValues.put("relation", "=");
+				tokenValues.put("@value", word);
+				tokenValues.put("@attr", "orth");
+				tokenValues.put("@relation", "=");
 				// 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);
 				}
 			}
-			System.out.println(stackedObjects+" "+objectStack);
 			visited.add(node.getChild(0));
 		}
 		
@@ -571,7 +576,7 @@
 			reQuery.put("@subtype", "korap:regex");
 			String regex = node.getChild(0).toStringTree(poliqarpParser);
 			reQuery.put("@value", regex);
-			reQuery.put("relation", "=");
+			reQuery.put("@relation", "=");
 			
 			// if in field, regex was already added there
 			if (!openNodeCats.get(1).equals("field")) {
@@ -583,7 +588,7 @@
 				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);
 				}
 			} 
@@ -600,17 +605,17 @@
 			// Step I: get info
 			// fill group
 			alignGroup.put("@type", "korap:group");
-			alignGroup.put("relation", "left-align");
-			alignGroup.put("operands", new ArrayList<Object>());
+			alignGroup.put("@relation", "left-align");
+			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));
@@ -629,12 +634,12 @@
 			objectStack.push(elem);
 			stackedObjects++;
 			// Step II: fill object (token values) and put into containing sequence
-			elem.put("@type", "korap:element");
+			elem.put("@type", "korap:span");
 			String value = node.getChild(1).toStringTree(poliqarpParser);
 			elem.put("@value", 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));
@@ -661,13 +666,13 @@
 			}
 			span.put("@type", "korap:group");
 			span.put("class", id);
-			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
@@ -686,19 +691,19 @@
 			// 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("@relation", "position");
+			positionGroup.put("@position", 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); 
 			}
 		}
@@ -720,19 +725,19 @@
 				}
 			}
 			shrinkGroup.put("@type", "korap:group");
-			shrinkGroup.put("relation", "shrink");
-			shrinkGroup.put(type, operandClass);
-			shrinkGroup.put("operands", shrinkOperands);
+			shrinkGroup.put("@relation", type);
+			shrinkGroup.put("classRef", operandClass);
+			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));
@@ -742,8 +747,10 @@
 		if (nodeCat.equals("occ")) {
 			ParseTree occChild = node.getChild(0);
 			String repetition = occChild.toStringTree(poliqarpParser);
-			curOccGroup.put("relation", "repetition");
-			curOccGroup.put("quantifier", repetition);
+			String[] minmax = parseRepetition(repetition);
+			curOccGroup.put("@relation", "repetition");
+			curOccGroup.put("@min", minmax[0]);
+			curOccGroup.put("@max", minmax[1]);
 			visited.add(occChild);
 		}
 				
@@ -815,6 +822,19 @@
 		openNodeCats.pop();
 	}
 
+	private String[] parseRepetition(String repetition) {
+		if (repetition.equals("*")) {
+			return new String[] {"0", "100"};
+		} else if (repetition.equals("+")) {
+			return new String[] {"1", "100"};
+		} else if (repetition.equals("?")) {
+			return new String[] {"0", "1"};
+		} else {
+			repetition = repetition.substring(1, repetition.length()-1); // remove braces
+			return repetition.split(",");
+		}
+	}
+
 	private String[] parseEmptySegments(ParseTree emptySegments) {
 		String[] minmax = new String[2];
 		Integer min = 0;
@@ -824,8 +844,6 @@
 			child = emptySegments.getChild(i);
 			ParseTree nextSibling = emptySegments.getChild(i+1);
 			String nextSiblingString = nextSibling.toStringTree(); 
-			System.err.println("FOO "+child.toStringTree());
-			System.out.println("FOO "+nextSiblingString);
 			if (child.toStringTree().equals("[]")) {
 				if (nextSiblingString.equals("?")) {
 					max++;
@@ -861,7 +879,7 @@
 		LinkedHashMap<String,Object> occGroup = new LinkedHashMap<String,Object>();
 		occGroup.put("@type", "korap:group");
 		ArrayList<Object> groupOperands = new ArrayList<Object>();
-		occGroup.put("operands", groupOperands);
+		occGroup.put("@operands", groupOperands);
 		curOccGroup = occGroup;
 		objectStack.push(occGroup);
 		stackedObjects++;
@@ -870,7 +888,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);
 		}		
 	}
@@ -921,6 +939,9 @@
 				"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]"
 		};
 		PoliqarpPlusTree.debug=true;
 		for (String q : queries) {