diff --git a/pom.xml b/pom.xml
index a408c20..e033deb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -44,7 +44,7 @@
     <dependency>
     	<groupId>KorAP-modules</groupId>
     	<artifactId>KorAP-Cosmas2Parser</artifactId>
-    	<version>0.01</version>
+    	<version>LATEST</version>
     </dependency>
      <dependency>
     	<groupId>KorAP-modules</groupId>
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 2eaff8b..a02450f 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
@@ -388,6 +388,7 @@
 				constraints.add(distance);
 				proxSequence.put("@inOrder", inOrder);
 			}
+			
 			// otherwise, create group and add info there
 			else {
 				LinkedHashMap<String, Object> distanceGroup = new LinkedHashMap<String, Object>();
@@ -421,7 +422,6 @@
 					}
 				}
 				proxSequence.put("@inOrder", inOrder);
-				
 			}
 			// Step II: decide where to put
 			putIntoSuperObject(proxSequence, 1);
@@ -442,21 +442,17 @@
 			posgroup.put("@type", "korap:group");
 //			String relation = nodeCat.equals("OPIN") ? "position" : "overlaps";
 			posgroup.put("@relation", "position");
-			
 			if (nodeCat.equals("OPIN")) {
 				parseOPINOptions(node, posgroup);
 			} else {
 				parseOPOVOptions(node, posgroup);
 			}
-			
-			
 			ArrayList<Object> posoperands = new ArrayList<Object>();
 			posgroup.put("@operands", posoperands);
 			objectStack.push(posgroup);
 			// mark this an inverted list
 			invertedOperandsLists.push(posoperands);
 			stackedObjects++;
-			
 			// Step II: decide where to put
 			putIntoSuperObject(submatchgroup, 1);
 		}
@@ -476,8 +472,21 @@
 		}
 		
 		
-		if (nodeCat.equals("OPALL") || nodeCat.equals("OPNHIT")) {
-//			proxGroupMatching = nodeCat.equals("OPALL") ? "all" : "exlcude";
+		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");
+			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);
+			objectStack.push(exclGroup);
+			stackedObjects++;
+			putIntoSuperObject(exclGroup, 1);
 		}
 		
 		if (nodeCat.equals("OPEND") || nodeCat.equals("OPBEG")) {
@@ -760,13 +769,14 @@
 		 */
 		String[] queries = new String[] {
 				/* COSMAS 2 */
-				"MORPH(V)",
-				"MORPH(V PRES)",
-				"wegen #IN(%, L) <s>",
-				"wegen #IN(%) <s>",
-				"(Mann oder Frau) #IN <s>",
-				"#BEG(der /w3:5 Mann) /+w10 kommt",
-				"&würde /w0 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",
+//				"&würde /w0 MORPH(V)",
+				"#NHIT(gehen /w1:10 voran)"
 				};
 		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 6679466..470603a 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
@@ -140,7 +140,7 @@
 	 * @param query The syntax tree as returned by ANTLR
 	 * @throws QueryException 
 	 */
-	public PoliqarpPlusTree(String query) {
+	public PoliqarpPlusTree(String query) throws QueryException {
 		try {
 			process(query); 
 		} catch (NullPointerException e) {
@@ -194,7 +194,7 @@
 	}
 	
 	@Override
-	public void process(String query) {
+	public void process(String query) throws QueryException {
 		ParseTree tree = null;
 		try {
 			tree = parsePoliqarpQuery(query);
@@ -218,9 +218,10 @@
 	 * respective maps/lists.
 	 *
 	 * @param node The currently processed node. The process(String query) method calls this method with the root.
+	 * @throws QueryException 
 	 */
 	@SuppressWarnings("unchecked")
-	private void processNode(ParseTree node) {
+	private void processNode(ParseTree node) throws QueryException {
 		// Top-down processing
 		if (visited.contains(node)) return;
 		else visited.add(node);
@@ -651,23 +652,26 @@
 		
 		if (nodeCat.equals("spanclass")) {
 			LinkedHashMap<String,Object> span = new LinkedHashMap<String,Object>();
+			span.put("@type", "korap:group");
+			span.put("@relation", "class");
 			objectStack.push(span);
 			stackedObjects++;
 			ArrayList<Object> spanOperands = new ArrayList<Object>();
-			String id = "0";
 			// Step I: get info
-			boolean hasId = false;
+			int classId = 0;
 			if (QueryUtils.getNodeCat(node.getChild(1)).equals("spanclass_id")) {
-				hasId = true;
-				id = node.getChild(1).getChild(0).toStringTree(poliqarpParser);
-				id = id.substring(0, id.length()-1); // remove trailing colon ':'
+				String ref = node.getChild(1).getChild(0).toStringTree(poliqarpParser);
+				try {	
+					classId = Integer.parseInt(ref);
+				} catch (NumberFormatException e) {
+					throw new QueryException("The specified class reference in the shrink/split-Operator is not a number.");
+				}
 				// only allow class id up to 255
-				if (Integer.parseInt(id)>255) {
-					id = "0";
+				if (classId>255) {
+					classId = 0;
 				}
 			}
-			span.put("@type", "korap:group");
-			span.put("class", id);
+			span.put("class", classId);
 			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)
@@ -680,7 +684,7 @@
 			// ignore leading and trailing braces
 			visited.add(node.getChild(0));
 			visited.add(node.getChild(node.getChildCount()-1)); 
-			if (hasId) {
+			if (QueryUtils.getNodeCat(node.getChild(1)).equals("spanclass_id")) {
 				visited.add(node.getChild(1));
 			}
 		}
@@ -716,19 +720,38 @@
 			stackedObjects++;
 			ArrayList<Object> shrinkOperands = new ArrayList<Object>();
 			// Step I: get info
-			String operandClass = "0";
-			String type = QueryUtils.getNodeCat(node.getChild(0));
+			System.out.println("WAAAAAAAHHHHHHHHHHHHHHHHHHHHHH "+node.getChild(2).toStringTree(poliqarpParser));
+			ArrayList<Integer> classRefs = new ArrayList<Integer>();
+			String classRefOp = null;
 			if (QueryUtils.getNodeCat(node.getChild(2)).equals("spanclass_id")) {
-				operandClass = node.getChild(2).getChild(0).toStringTree(poliqarpParser);
-				operandClass = operandClass.substring(0, operandClass.length()-1); // remove trailing colon ':'
-				// only allow class id up to 255
-				if (Integer.parseInt(operandClass)>255) {
-					operandClass = "0";
+				ParseTree spanNode = node.getChild(2);
+				for (int i=0; i<spanNode.getChildCount()-1; i++) {
+					String ref = spanNode.getChild(i).getText();
+					System.err.println("       "+ref);
+					if (ref.equals("|") || ref.equals("&")) {
+						classRefOp = ref.equals("|") ? "intersection" : "union";
+					} else {
+						try {
+							int classRef = Integer.parseInt(ref);
+							// only allow class id up to 255
+							if (classRef>255) {
+								classRef = 0;
+							}
+							classRefs.add(classRef);
+						} catch (NumberFormatException e) {
+							throw new QueryException("The specified class reference in the shrink/split-Operator is not a number.");
+						}
+					}
 				}
+			} else {
+				classRefs.add(0);
 			}
 			shrinkGroup.put("@type", "korap:group");
-			shrinkGroup.put("@relation", type);
-			shrinkGroup.put("classRef", operandClass);
+			shrinkGroup.put("@relation", node.getChild(0).toStringTree(poliqarpParser));
+			shrinkGroup.put("classRef", classRefs);
+			if (classRefOp != null) {
+				shrinkGroup.put("classRefOp", classRefOp);
+			}
 			shrinkGroup.put("@operands", shrinkOperands);
 			int i=1;
 			// Step II: decide where to put the group
@@ -938,9 +961,9 @@
 		 * 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()));
+//		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])",
@@ -954,8 +977,12 @@
 //				"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]"
+//				"[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]}"
 		};
 		PoliqarpPlusTree.debug=true;
 		for (String q : queries) {
diff --git a/src/test/java/CosmasTreeTest.java b/src/test/java/CosmasTreeTest.java
index fac29e7..1933e20 100644
--- a/src/test/java/CosmasTreeTest.java
+++ b/src/test/java/CosmasTreeTest.java
@@ -57,6 +57,11 @@
 	}
 	
 	@Test
+	public void testCaseSensitivityFlag() throws QueryException {
+		//TODO ignorieroperator $ http://www.ids-mannheim.de/cosmas2/web-app/hilfe/suchanfrage/eingabe-zeile/syntax/ignorierung.html
+	}
+	
+	@Test
 	public void testMORPH() throws QueryException {
 		query="#MORPH(V)";
 		String morph1 = 
@@ -474,7 +479,7 @@
 		assertEquals(all1.replaceAll(" ", ""), map.replaceAll(" ", ""));
 	}
 	
-	@Test
+//	@Test
 	public void testOPNHIT() throws QueryException {
 		query="#NHIT(gehen /w1:10 voran)";
 		String nhit1 = 
diff --git a/src/test/java/PoliqarpPlusTreeTest.java b/src/test/java/PoliqarpPlusTreeTest.java
index 078cf8e..70c8231 100644
--- a/src/test/java/PoliqarpPlusTreeTest.java
+++ b/src/test/java/PoliqarpPlusTreeTest.java
@@ -401,13 +401,15 @@
 	@Test 
 	public void testClasses() throws QueryException {
 		// {[base=Mann]}
-		String cls1 = "{@type=korap:group, class=0, @operands=[" +
+		String cls1 = "{@type=korap:group, @relation=class, class=0, @operands=[" +
 				"{@type=korap:token, @value={@type=korap:term, @value=Mann, @attr=base, @relation==}}" +
 				"]}";
-		assertTrue(equalsQueryContent(cls1, "{[base=Mann]}"));
+		ppt = new PoliqarpPlusTree("{[base=Mann]}");
+		map = ppt.getRequestMap().get("query").toString();
+		assertEquals(cls1.replaceAll(" ", ""), map.replaceAll(" ", ""));
 		
 		// {[base=Mann][orth=Frau]}
-		String cls2 = "{@type=korap:group, class=0, @operands=[" +
+		String cls2 = "{@type=korap:group, @relation=class, class=0, @operands=[" +
 				 "{@type=korap:sequence, @operands=[" +
 				  "{@type=korap:token, @value={@type=korap:term, @value=Mann, @attr=base, @relation==}}," +
 				  "{@type=korap:token, @value={@type=korap:term, @value=Frau, @attr=orth, @relation==}}" +
@@ -418,7 +420,7 @@
 		// [p=NN]{[base=Mann][orth=Frau]}
 		String cls3 = "{@type=korap:sequence, @operands=[" +
 						"{@type=korap:token, @value={@type=korap:term, @value=NN, @attr=p, @relation==}}," +
-						"{@type=korap:group, class=0, @operands=[" +
+						"{@type=korap:group, @relation=class, class=0, @operands=[" +
 							"{@type=korap:sequence, @operands=[" +
 								"{@type=korap:token, @value={@type=korap:term, @value=Mann, @attr=base, @relation==}}," +
 								"{@type=korap:token, @value={@type=korap:term, @value=Frau, @attr=orth, @relation==}}" +
@@ -429,7 +431,7 @@
 		
 		// {[base=Mann][orth=Frau]}[p=NN]
 		String cls4 = "{@type=korap:sequence, @operands=[" +
-						"{@type=korap:group, class=0, @operands=[" +
+						"{@type=korap:group, @relation=class, class=0, @operands=[" +
 						   "{@type=korap:sequence, @operands=[" +
 						     "{@type=korap:token, @value={@type=korap:term, @value=Mann, @attr=base, @relation==}}," +
 						     "{@type=korap:token, @value={@type=korap:term, @value=Frau, @attr=orth, @relation==}}" +
@@ -442,9 +444,9 @@
 		assertEquals(cls4.replaceAll(" ", ""), map.replaceAll(" ", ""));
 
 		// {2:{1:[tt/p=ADJA]}[mate/p=NN]}"
-		String cls5 = "{@type=korap:group, class=2, @operands=[" +
+		String cls5 = "{@type=korap:group, @relation=class, class=2, @operands=[" +
 						"{@type=korap:sequence, @operands=[" +
-						   "{@type=korap:group, class=1, @operands=[" +
+						   "{@type=korap:group, @relation=class, class=1, @operands=[" +
 						     "{@type=korap:token, @value={@type=korap:term, @value=ADJA, @attr=p, @foundry=tt, @relation==}}" +
 						   "]}," +
 						   "{@type=korap:token, @value={@type=korap:term, @value=NN, @attr=p, @foundry=mate, @relation==}}" + 
@@ -517,10 +519,10 @@
 	public void testShrinkSplit() throws QueryException {
 		// shrink([orth=Der]{[orth=Mann]})
 		String shr1 = 
-			"{@type=korap:group, @relation=shrink, classRef=0, @operands=[" +
+			"{@type=korap:group, @relation=shrink, classRef=[0], @operands=[" +
 				"{@type=korap:sequence, @operands=[" +
 					"{@type=korap:token, @value={@type=korap:term, @value=Der, @attr=orth, @relation==}}," +
-					"{@type=korap:group, class=0, @operands=[" +
+					"{@type=korap:group, @relation=class, class=0, @operands=[" +
 						"{@type=korap:token, @value={@type=korap:term, @value=Mann, @attr=orth, @relation==}}" +
 					"]}" +
 				"]}" +
@@ -531,10 +533,10 @@
 		
 		// shrink([orth=Der]{[orth=Mann][orth=geht]})
 		String shr2 = 
-			"{@type=korap:group, @relation=shrink, classRef=0, @operands=[" +
+			"{@type=korap:group, @relation=shrink, classRef=[0], @operands=[" +
 				"{@type=korap:sequence, @operands=[" +
 					"{@type=korap:token, @value={@type=korap:term, @value=Der, @attr=orth, @relation==}}," +
-					"{@type=korap:group, class=0, @operands=[" +
+					"{@type=korap:group, @relation=class, class=0, @operands=[" +
 						"{@type=korap:sequence, @operands=[" +
 							"{@type=korap:token, @value={@type=korap:term, @value=Mann, @attr=orth, @relation==}}," +
 							"{@type=korap:token, @value={@type=korap:term, @value=geht, @attr=orth, @relation==}}" +
@@ -548,10 +550,10 @@
 		
 		// shrink(1:[orth=Der]{1:[orth=Mann][orth=geht]})
 		String shr3 = 
-			"{@type=korap:group, @relation=shrink, classRef=1, @operands=[" +
+			"{@type=korap:group, @relation=shrink, classRef=[1], @operands=[" +
 				"{@type=korap:sequence, @operands=[" +
 					"{@type=korap:token, @value={@type=korap:term, @value=Der, @attr=orth, @relation==}}," +
-					"{@type=korap:group, class=1, @operands=[" +
+					"{@type=korap:group, @relation=class, class=1, @operands=[" +
 						"{@type=korap:sequence, @operands=[" +
 							"{@type=korap:token, @value={@type=korap:term, @value=Mann, @attr=orth, @relation==}}," +
 							"{@type=korap:token, @value={@type=korap:term, @value=geht, @attr=orth, @relation==}}" +
@@ -565,10 +567,10 @@
 		
 		// shrink(1:startswith(<s>,{1:<np>}))
 		String shr4 = 
-			"{@type=korap:group, @relation=shrink, classRef=1, @operands=[" +
+			"{@type=korap:group, @relation=shrink, classRef=[1], @operands=[" +
 				"{@type=korap:group, @relation=position, @position=startswith, @operands=[" +
 					"{@type=korap:span, @value=s}," +
-					"{@type=korap:group, class=1, @operands=[" +
+					"{@type=korap:group, @relation=class, class=1, @operands=[" +
 						"{@type=korap:span, @value=np}" +
 					"]}" +
 				"]}" +
@@ -579,16 +581,16 @@
 		
 		// shrink(3: startswith(<s>, {3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) 
 		String shr5 = 
-			"{@type=korap:group, @relation=shrink, classRef=3, @operands=[" +
+			"{@type=korap:group, @relation=shrink, classRef=[3], @operands=[" +
 				"{@type=korap:group, @relation=position, @position=startswith, @operands=[" +
 					"{@type=korap:span, @value=s}," +
-					"{@type=korap:group, class=3, @operands=[" +
+					"{@type=korap:group, @relation=class, class=3, @operands=[" +
 						"{@type=korap:sequence, @operands=[" +
 							"{@type=korap:token, @value={@type=korap:term, @value=der, @attr=base, @relation==}}," +
-							"{@type=korap:group, class=1, @operands=[" +
+							"{@type=korap:group, @relation=class, class=1, @operands=[" +
 								"{@type=korap:sequence, @operands=[" +
 									"{@type=korap:token, @value={@type=korap:term, @value=ADJA, @attr=p, @foundry=mate, @relation==}}," +
-									"{@type=korap:group, class=2, @operands=[" +
+									"{@type=korap:group, @relation=class, class=2, @operands=[" +
 										"{@type=korap:token, @value={@type=korap:term, @value=NN, @attr=p, @foundry=tt, @relation==}}" +
 									"]}" + 
 								"]}" +
@@ -603,16 +605,16 @@
 		
 		// split(3: startswith(<s>, {3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) 
 		String shr6 = 
-			"{@type=korap:group, @relation=split, classRef=3, @operands=[" +
+			"{@type=korap:group, @relation=split, classRef=[3], @operands=[" +
 				"{@type=korap:group, @relation=position, @position=startswith, @operands=[" +
 					"{@type=korap:span, @value=s}," +
-					"{@type=korap:group, class=3, @operands=[" +
+					"{@type=korap:group, @relation=class, class=3, @operands=[" +
 						"{@type=korap:sequence, @operands=[" +
 							"{@type=korap:token, @value={@type=korap:term, @value=der, @attr=base, @relation==}}," +
-							"{@type=korap:group, class=1, @operands=[" +
+							"{@type=korap:group, @relation=class, class=1, @operands=[" +
 								"{@type=korap:sequence, @operands=[" +
 									"{@type=korap:token, @value={@type=korap:term, @value=ADJA, @attr=p, @foundry=mate, @relation==}}," +
-									"{@type=korap:group, class=2, @operands=[" +
+									"{@type=korap:group, @relation=class, class=2, @operands=[" +
 										"{@type=korap:token, @value={@type=korap:term, @value=NN, @attr=p, @foundry=tt, @relation==}}" +
 									"]}" + 
 								"]}" +
@@ -624,6 +626,30 @@
 		ppt = new PoliqarpPlusTree("split(3:startswith(<s>,{3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) ");
 		map = ppt.getRequestMap().get("query").toString();
 		assertEquals(shr6.replaceAll(" ", ""), map.replaceAll(" ", ""));
+		
+		// split(2|3: startswith(<s>, {3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) 
+		String shr7 = 
+			"{@type=korap:group, @relation=split, classRef=[2, 3], classRefOp=intersection, @operands=[" +
+				"{@type=korap:group, @relation=position, @position=startswith, @operands=[" +
+					"{@type=korap:span, @value=s}," +
+					"{@type=korap:group, @relation=class, class=3, @operands=[" +
+						"{@type=korap:sequence, @operands=[" +
+							"{@type=korap:token, @value={@type=korap:term, @value=der, @attr=base, @relation==}}," +
+							"{@type=korap:group, @relation=class, class=1, @operands=[" +
+								"{@type=korap:sequence, @operands=[" +
+									"{@type=korap:token, @value={@type=korap:term, @value=ADJA, @attr=p, @foundry=mate, @relation==}}," +
+									"{@type=korap:group, @relation=class, class=2, @operands=[" +
+										"{@type=korap:token, @value={@type=korap:term, @value=NN, @attr=p, @foundry=tt, @relation==}}" +
+									"]}" + 
+								"]}" +
+							"]}" +
+						"]}" +
+					"]}" +
+				"]}" +
+			"]}";
+		ppt = new PoliqarpPlusTree("split(2|3:startswith(<s>,{3:[base=der]{1:[mate/p=ADJA]{2:[tt/p=NN]}}})) ");
+		map = ppt.getRequestMap().get("query").toString();
+		assertEquals(shr7.replaceAll(" ", ""), map.replaceAll(" ", ""));
 	}
 	
 	
@@ -638,7 +664,7 @@
 	}
 	
 	@Test
-	public void testAlign() {
+	public void testAlign() throws QueryException {
 		// [orth=der]^[orth=Mann]
 		String align1 = 
 				"{@type=korap:sequence, @operands=[" +
@@ -724,7 +750,7 @@
 	}
 	
 	@Test
-	public void testSimpleQueries() {
+	public void testSimpleQueries() throws QueryException {
 		// Baum
 		String simple1 = 
 				"{@type=korap:token, @value={@type=korap:term, @value=Baum, @attr=orth, @relation==}}";
