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 7f5d257..beb2c38 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
@@ -218,7 +218,7 @@
 		}
 		
 		// Nodes introducing tokens. Process all in the same manner, except for the fieldMap entry
-		if (nodeCat.equals("OPWF") || nodeCat.equals("OPLEM") || nodeCat.equals("OPMORPH")) {
+		if (nodeCat.equals("OPWF") || nodeCat.equals("OPLEM")) {
 			
 			//Step I: get info
 			LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
@@ -230,18 +230,10 @@
 			
 			fieldMap.put("@type", "korap:term");			
 			// make category-specific fieldMap entry
-			String value = "";
-			if (nodeCat.equals("OPWF")) {
-				value = "orth:"+node.getChild(0).toStringTree().replaceAll("\"", "");
-			}
-			if (nodeCat.equals("OPLEM")) {
-				value = "base:"+node.getChild(0).toStringTree().replaceAll("\"", "");
-			}
-			if (nodeCat.equals("OPMORPH")) {
-				value = "morph:"+node.toStringTree();
-				//TODO decompose morphology query
-			}
+			String attr = nodeCat.equals("OPWF") ? "orth:" : "base:";
+			String value = attr+node.getChild(0).toStringTree().replaceAll("\"", "");
 			fieldMap.put("@value", value);
+			
 			// negate field (see above)
 			if (negate) {
 				fieldMap.put("relation", "!=");
@@ -252,10 +244,57 @@
 			putIntoSuperObject(token, 1);
 		}
 		
+		if (nodeCat.equals("OPMORPH")) {
+			//Step I: get info
+			LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
+			token.put("@type", "korap:token");
+			
+			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", "=");
+				}
+			} 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
+			putIntoSuperObject(token, 0);
+		}
+		
 		if (nodeCat.equals("OPELEM")) {
 			// Step I: create element
 			LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
-			elem.put("@type", "korap:elem");
+			elem.put("@type", "korap:element");
 			elem.put("@value", node.getChild(0).getChild(0).toStringTree().toLowerCase());
 			//Step II: decide where to put
 			putIntoSuperObject(elem);
@@ -264,7 +303,7 @@
 		if (nodeCat.equals("OPLABEL")) {
 			// Step I: create element
 			LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
-			elem.put("@type", "korap:elem");
+			elem.put("@type", "korap:element");
 			elem.put("@value", node.getChild(0).toStringTree().replaceAll("<|>", ""));
 			//Step II: decide where to put
 			putIntoSuperObject(elem);
@@ -440,7 +479,7 @@
 				posgroup.put("operands", operands);
 				LinkedHashMap<String, Object> bedElem = new LinkedHashMap<String, Object>();
 				operands.add(bedElem);
-				bedElem.put("@type", "korap:elem");
+				bedElem.put("@type", "korap:element");
 				bedElem.put("@value", c.elem);
 				objectStack.push(posgroup);
 				stackedObjects++;
@@ -474,7 +513,7 @@
 					posGroup.put("operands", posOperands);
 					LinkedHashMap<String, Object> bedElem = new LinkedHashMap<String, Object>();
 					posOperands.add(bedElem);
-					bedElem.put("@type", "korap:elem");
+					bedElem.put("@type", "korap:element");
 					bedElem.put("@value", c.elem);
 					
 					
@@ -528,6 +567,8 @@
 	}
 
 	
+	
+
 	private void parseOPINOptions(Tree node, LinkedHashMap<String, Object> posgroup) {
 		Tree posnode = QueryUtils.getFirstChildWithCat(node, "POS");
 		Tree rangenode = QueryUtils.getFirstChildWithCat(node, "RANGE");
@@ -683,6 +724,7 @@
 		 */
 		String[] queries = new String[] {
 				/* COSMAS 2 */
+				"MORPH(V)"
 				};
 		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 bd58449..b10105c 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
@@ -277,13 +277,44 @@
 				}
 				// 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) {
-					sequence.put("@type", "korap:sequence");
-					ArrayList<Object> sequenceOperands = new ArrayList<Object>();
-					sequence.put("operands", sequenceOperands);
-					objectStack.push(sequence);
-					stackedObjects++;
+					ParseTree emptySegments = QueryUtils.getFirstChildWithCat(node, "empty_segments");
+					if (emptySegments != null && emptySegments != node.getChild(0)) {
+						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");
+						ArrayList<Object> constraint = new ArrayList<Object>(); 
+						sequence.put("constraint", constraint);
+						ArrayList<Object> sequenceOperands = new ArrayList<Object>();
+						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 {
+						sequence.put("@type", "korap:sequence");
+						ArrayList<Object> sequenceOperands = new ArrayList<Object>();
+						if (emptySegments != null) {
+							String[] minmax = parseEmptySegments(emptySegments);
+							Integer min = Integer.parseInt(minmax[0]);
+							Integer max = Integer.parseInt(minmax[1]);
+							sequence.put("offset-min", min);
+							sequence.put("offset-max", max);
+						}
+						sequence.put("operands", sequenceOperands);
+						objectStack.push(sequence);
+						stackedObjects++;
+					}
 				} else {
 					// if only child, make the sequence a mere korap:token...
 					// ... but only if it has a real token/element beneath it
@@ -363,15 +394,15 @@
 			// take into account a possible 'occ' child
 			if (node.getParent().getChildCount()>1) {				
 				if (node.getText().equals("[]")) {
-					LinkedHashMap<String, Object> sequence  = objectStack.get(onTopOfObjectStack);
-					String offsetStr = (String) sequence.get("offset");
-					if (offsetStr == null) {
-						sequence.put("offset", "1");
-					} else {
-						Integer offset = Integer.parseInt(offsetStr);
-						sequence.put("offset", offset+1);
-					}
-					
+//					LinkedHashMap<String, Object> sequence  = objectStack.get(onTopOfObjectStack);
+//					String offsetStr = (String) sequence.get("offset");
+//					if (offsetStr == null) {
+//						sequence.put("offset", "1");
+//					} else {
+//						Integer offset = Integer.parseInt(offsetStr);
+//						sequence.put("offset", offset+1);
+//					}
+//					
 				} else {
 					ArrayList<Object> topSequenceOperands = (ArrayList<Object>) objectStack.get(onTopOfObjectStack).get("operands");
 					topSequenceOperands.add(token);
@@ -657,6 +688,7 @@
 			positionGroup.put("@type", "korap:group");
 			positionGroup.put("relation", "position");
 			positionGroup.put("position", relation.toLowerCase());
+//			positionGroup.put("@subtype", "incl");
 			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)
@@ -783,6 +815,47 @@
 		openNodeCats.pop();
 	}
 
+	private String[] parseEmptySegments(ParseTree emptySegments) {
+		String[] minmax = new String[2];
+		Integer min = 0;
+		Integer max = 0;
+		ParseTree child;
+		for (int i=0; i<emptySegments.getChildCount()-1; i++) {
+			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++;
+				} else if (nextSiblingString.startsWith("{")) {
+					String occ = nextSiblingString.substring(1,nextSiblingString.length()-1);
+					System.out.println(occ);
+					if (occ.contains(",")) {
+						String[] minmaxOcc = occ.split(",");
+						min += Integer.parseInt(minmaxOcc[0]);
+						max += Integer.parseInt(minmaxOcc[1]);
+					} else {
+						min += Integer.parseInt(occ);
+						max += Integer.parseInt(occ);
+					}
+				} else {
+					min++;
+					max++;
+				}
+			}
+		}
+		child = emptySegments.getChild(emptySegments.getChildCount()-1);
+		if (child.toStringTree().equals("[]")) {
+			min++;
+			max++;
+		}
+		minmax[0] = min.toString();
+		minmax[1] = max.toString();
+		return minmax;
+	}
+
 	@SuppressWarnings("unchecked")
 	private void createOccGroup(ParseTree node) {
 		LinkedHashMap<String,Object> occGroup = new LinkedHashMap<String,Object>();
@@ -845,27 +918,9 @@
 		 * For testing
 		 */
 		String[] queries = new String[] {
-//				"shrink(startswith(<s>,{<np>}))",
-//				"shrink(1: startswith(<s>,{1:<np>}))",
-//				"contains(<p>, startswith(<s>,<np>))",
-//				"[base=foo]*",
-//				"[base=foo]*[base=bar]",
-//				"[base=bar][base=foo]*",
-//				"([base=bar][base=foo])*",
-//				"([base=bar][base  =  foo])*",
-//				"<s>([base=bar][base=foo])*",
-//				"<s>[orth=Mann]([base=bar][base=foo])*",
-//				"<s><np>([base=bar][base=foo])*",
-//				"shrink(1:contains(<s>,{1:<np>}))",
-//				"contains(<s>,startswith(<np>,[p=Det]))",
-//				"contains(<s>, startswith(<np>,[p=Det]))",base=c]",
-//				
-				"[orth=der]^[orth=Mann]",
-//				"([base=bar][base=foo])*",
-				"([base=a]^[base=b])|[base=c]",
-				"Baum | Stein",
-				"Haus/i",
-				"startswith(<s>,[]+[base=der][base=Mann])",
+				"startswith(<s>,[][base=der][base=Mann])",
+//				"[][base=Mann]",
+				"[base=Hund][][base=Katze][][][base=Maus]",
 		};
 		PoliqarpPlusTree.debug=true;
 		for (String q : queries) {
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 db60b9e..736b875 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
@@ -20,7 +20,7 @@
 public class QueryUtils {
 
 	/**
-	 * Returns the category (or 'label') of the root of a (sub-)ParseTree.
+	 * Returns the category (or 'label') of the root of a ParseTree (ANTLR 4).
 	 * @param node
 	 * @return
 	 */
@@ -35,7 +35,7 @@
 	}
 	
 	/**
-	 * Returns the category (or 'label') of the root of a ParseTree.
+	 * Returns the category (or 'label') of the root of a ParseTree (ANTLR 3).
 	 * @param node
 	 * @return
 	 */
@@ -65,6 +65,19 @@
 		return false;
 	}
 	
+	public static boolean hasDescendant(ParseTree node, String childCat) {
+		for (int i=0; i<node.getChildCount(); i++) {
+			ParseTree child = node.getChild(i);
+			if (getNodeCat(child).equals(childCat)) {
+				return true;
+			}
+			if (hasDescendant(child, childCat)) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
 	public static List<Tree> getChildrenWithCat(Tree node, String nodeCat) {
 		ArrayList<Tree> children = new ArrayList<Tree>();
 		for (int i=0; i<node.getChildCount(); i++) {
@@ -75,6 +88,16 @@
 		return children;
 	}
 	
+	public static List<ParseTree> getChildrenWithCat(ParseTree node, String nodeCat) {
+		ArrayList<ParseTree> children = new ArrayList<ParseTree>();
+		for (int i=0; i<node.getChildCount(); i++) {
+			if (getNodeCat(node.getChild(i)).equals(nodeCat)) {
+				children.add(node.getChild(i));
+			}
+		}
+		return children;
+	}
+	
 	public static Tree getFirstChildWithCat(Tree node, String nodeCat) {
 		for (int i=0; i<node.getChildCount(); i++) {
 			if (getNodeCat(node.getChild(i)).equals(nodeCat)) {
@@ -84,6 +107,15 @@
 		return null;
 	}
 	
+	public static ParseTree getFirstChildWithCat(ParseTree node, String nodeCat) {
+		for (int i=0; i<node.getChildCount(); i++) {
+			if (getNodeCat(node.getChild(i)).equals(nodeCat)) {
+				return node.getChild(i);
+			}
+		}
+		return null;
+	}
+	
 	public static void checkUnbalancedPars(String q) throws QueryException {
 		int openingPars = StringUtils.countMatches(q, "(");
 		int closingPars = StringUtils.countMatches(q, ")");
@@ -98,6 +130,13 @@
 		if (openingBrcs != closingBrcs) throw new QueryException(
 				"Your query string contains an unbalanced number of braces.");
 	}
+	
+	public static List<String> parseMorph(String stringTree) {
+		
+		ArrayList<String> morph = new ArrayList<String>();
+		System.err.println(stringTree);
+		return morph;
+	}
 
 
     public static String buildCypherQuery(String cypher, String ctypel, String ctyper,
@@ -222,6 +261,10 @@
         return request;
     }
 
+	
+
+	
+
 
 
 }
diff --git a/src/test/java/CosmasTreeTest.java b/src/test/java/CosmasTreeTest.java
index e16f8d8..0d7db7a 100644
--- a/src/test/java/CosmasTreeTest.java
+++ b/src/test/java/CosmasTreeTest.java
@@ -56,6 +56,16 @@
 		assertEquals(single3.replaceAll(" ", ""), map.replaceAll(" ", ""));
 	}
 	
+//	@Test
+	public void testMORPH() throws QueryException {
+		query="#MORPH(V)";
+		String morph1 = 
+					"{@type=korap:token, @value={@type=korap:term, @value=pos:v, relation==}}";
+		ppt = new CosmasTree(query);
+		map = ppt.getRequestMap().get("query").toString();
+		assertEquals(morph1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+	}
+	
 	@Test
 	public void testSequence() throws QueryException {
 		query="der Mann";
@@ -281,7 +291,7 @@
 		String opin1 = 
 					"{@type=korap:group, relation=shrink, shrink=1, operands=[" +
 						"{@type=korap:group, relation=position, position=contains, operands=[" +
-							"{@type=korap:elem, @value=s}," +
+							"{@type=korap:element, @value=s}," +
 							"{@type=korap:group, class=1, operands=[" +
 								"{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}" +
 							"]}" +
@@ -295,7 +305,7 @@
 		String opin2 = 
 					"{@type=korap:group, relation=shrink, shrink=1, operands=[" +
 						"{@type=korap:group, relation=position, position=startswith, operands=[" +
-							"{@type=korap:elem, @value=s}," +
+							"{@type=korap:element, @value=s}," +
 							"{@type=korap:group, class=1, operands=[" +
 								"{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}" +
 							"]}" +
@@ -309,7 +319,7 @@
 		String opin3 = 
 					"{@type=korap:group, relation=shrink, shrink=1, operands=[" +
 						"{@type=korap:group, relation=position, position=startswith, @subtype=excl, operands=[" +
-							"{@type=korap:elem, @value=s}," +
+							"{@type=korap:element, @value=s}," +
 							"{@type=korap:group, class=1, operands=[" +
 								"{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}" +
 							"]}" +
@@ -323,7 +333,7 @@
 		String opin4 = 
 					"{@type=korap:group, relation=shrink, shrink=1, operands=[" +
 						"{@type=korap:group, relation=position, position=ident, range=all, @subtype=excl, grouping=false, operands=[" +
-							"{@type=korap:elem, @value=s}," +
+							"{@type=korap:element, @value=s}," +
 							"{@type=korap:group, class=1, operands=[" +
 								"{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}" +
 							"]}" +
@@ -340,7 +350,7 @@
 		String opov1 = 
 					"{@type=korap:group, relation=shrink, shrink=1, operands=[" +
 						"{@type=korap:group, relation=overlap, position=any, operands=[" +
-							"{@type=korap:elem, @value=s}," +
+							"{@type=korap:element, @value=s}," +
 							"{@type=korap:group, class=1, operands=[" +
 								"{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}" +
 							"]}" +
@@ -354,7 +364,7 @@
 		String opov2 = 
 					"{@type=korap:group, relation=shrink, shrink=1, operands=[" +
 						"{@type=korap:group, relation=overlap, position=startswith, operands=[" +
-							"{@type=korap:elem, @value=s}," +
+							"{@type=korap:element, @value=s}," +
 							"{@type=korap:group, class=1, operands=[" +
 								"{@type=korap:token, @value={@type=korap:term, @value=orth:wegen, relation==}}" +
 							"]}" +
@@ -440,7 +450,7 @@
 	public void testELEM() throws QueryException {
 		// http://www.ids-mannheim.de/cosmas2/web-app/hilfe/suchanfrage/eingabe-zeile/syntax/elem.html
 		query="#ELEM(S)";
-		String elem1 = "{@type=korap:elem, @value=s}";
+		String elem1 = "{@type=korap:element, @value=s}";
 		ppt = new CosmasTree(query);
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(elem1.replaceAll(" ", ""), map.replaceAll(" ", ""));
@@ -487,7 +497,7 @@
 		query = "#BED(der , sa)";
 		String bed1 = 
 				"{@type=korap:group, relation=position, position=startswith, operands=[" +
-					"{@type=korap:elem, @value=s}," +
+					"{@type=korap:element, @value=s}," +
 					"{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}" +
 				"]}";
 		ppt = new CosmasTree(query);
@@ -497,7 +507,7 @@
 		query = "#BED(der Mann , +pe)";
 		String bed2 = 
 				"{@type=korap:group, relation=position, position=endswith, operands=[" +
-					"{@type=korap:elem, @value=p}," +
+					"{@type=korap:element, @value=p}," +
 					"{@type=korap:sequence, operands=[" +
 						"{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}," +
 						"{@type=korap:token, @value={@type=korap:term, @value=orth:Mann, relation==}}" +
@@ -511,14 +521,14 @@
 		String bed3 = 
 				"{@type=korap:group, relation=and, operands=[" +
 					"{@type=korap:group, relation=position, position=startswith, operands=[" +
-						"{@type=korap:elem, @value=s}," +
+						"{@type=korap:element, @value=s}," +
 						"{@type=korap:sequence, operands=[" +
 							"{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}," +
 							"{@type=korap:token, @value={@type=korap:term, @value=orth:Mann, relation==}}" +
 						"]}" +
 					"]}," +
 					"{@type=korap:group, relation=position, position=startswith, @subtype=excl, operands=[" +
-						"{@type=korap:elem, @value=p}," +
+						"{@type=korap:element, @value=p}," +
 						"{@type=korap:sequence, operands=[" +
 							"{@type=korap:token, @value={@type=korap:term, @value=orth:der, relation==}}," +
 							"{@type=korap:token, @value={@type=korap:term, @value=orth:Mann, relation==}}" +
diff --git a/src/test/java/PoliqarpPlusTreeTest.java b/src/test/java/PoliqarpPlusTreeTest.java
index 35753d6..5561d16 100644
--- a/src/test/java/PoliqarpPlusTreeTest.java
+++ b/src/test/java/PoliqarpPlusTreeTest.java
@@ -84,7 +84,7 @@
 				"{@type=korap:token, @value={@type=korap:term, @value=base:der, relation==}}," +
 				"{@type=korap:token, @value={@type=korap:term, @value=base:Mann, relation==}}" +
 			"]}";
-		ppt = new PoliqarpPlusTree("[base=der][][base=Mann]");
+		ppt = new PoliqarpPlusTree("[base=der][][][base=Mann]");
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(et2.replaceAll(" ", ""), map.replaceAll(" ", ""));
 		
@@ -101,31 +101,36 @@
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(et3.replaceAll(" ", ""), map.replaceAll(" ", ""));
 		
-		// [base=der][]*[base=Mann]
-		String et4 = 
-			"{@type=korap:group, relation=distance, @subtype=incl, constraint=[" +
-				"{@type=korap:distance, measure=w, direction=plus, min=0, max=INF}" +
-			"], " +
-			"operands=[" +
-				"{@type=korap:token, @value={@type=korap:term, @value=base:der, relation==}}," +
-				"{@type=korap:token, @value={@type=korap:term, @value=base:Mann, relation==}}" +
-			"]}";
-		ppt = new PoliqarpPlusTree("[base=der][]*[base=Mann]");
-		map = ppt.getRequestMap().get("query").toString();
-		assertEquals(et4.replaceAll(" ", ""), map.replaceAll(" ", ""));
 		
 		// startswith(<s>, [][base=Mann]
-		String et5 = 
-			"{@type=korap:group, relation=position, position=startswith, @subtype=incl, operands=[" +
-				"{@type=korap:token, @value={@type=korap:elem, @value=s}," +
-				"{@type=korap:sequence, offset=1, operands=[" +
+		String et4 = 
+			"{@type=korap:group, relation=position, position=startswith, operands=[" +
+				"{@type=korap:element, @value=s}," +
+				"{@type=korap:sequence, offset-min=1, offset-max=1, operands=[" +
 					"{@type=korap:token, @value={@type=korap:term, @value=base:Mann, relation==}}" +
 				"]}" +
 			"]}";
-		ppt = new PoliqarpPlusTree("startswith(<s>, [][base=Mann]");
+		ppt = new PoliqarpPlusTree("startswith(<s>, [][base=Mann])");
+		map = ppt.getRequestMap().get("query").toString();
+		assertEquals(et4.replaceAll(" ", ""), map.replaceAll(" ", ""));
+		
+		String et5 = 
+				"{@type=korap:group, relation=distance, @subtype=incl, constraint=[" +
+					"{@type=korap:distance, measure=w, direction=plus, min=1, max=1}" +
+				"], " +
+				"operands=[" +
+					"{@type=korap:token, @value={@type=korap:term, @value=base:der, relation==}}," +
+					"{@type=korap:group, relation=distance, @subtype=incl, constraint=[" +
+						"{@type=korap:distance, measure=w, direction=plus, min=2, max=2}" +
+					"], " +
+					"operands=[" +
+						"{@type=korap:token, @value={@type=korap:term, @value=base:Mann, relation==}}," +
+						"{@type=korap:token, @value={@type=korap:term, @value=base:Frau, relation==}}" +
+					"]}" +
+				"]}";
+		ppt = new PoliqarpPlusTree("[base=der][][base=Mann][][][base=Frau]");
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(et5.replaceAll(" ", ""), map.replaceAll(" ", ""));
-
 		
 	}
 
