diff --git a/src/main/java/de/ids_mannheim/korap/KorapQuery.java b/src/main/java/de/ids_mannheim/korap/KorapQuery.java
index 38e2038..f517c4a 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapQuery.java
@@ -58,7 +58,7 @@
 	STARTSWITH   = SpanWithinQuery.STARTSWITH,
 	MATCH        = SpanWithinQuery.MATCH;
 
-    private static final int MAX_CLASS_NUM = 127;
+    private static final int MAX_CLASS_NUM = 255; // 127;
 
     /**
      * Constructs a new base object for query generation.
@@ -282,8 +282,14 @@
 		    JsonNode distances;
 		    if (firstDistance.get("@type").asText().equals("korap:group"))
 			distances = firstDistance.get("operands");
+
+		    // Support korap distances
 		    else if (firstDistance.get("@type").asText().equals("korap:distance"))
 			distances = json.get("distances");
+
+		    // Support cosmas distances
+		    else if (firstDistance.get("@type").asText().equals("cosmas:distance"))
+			distances = json.get("distances");
 		    else
 			throw new QueryException(612, "No valid distances defined");
 
@@ -292,11 +298,15 @@
 			if (constraint.has("key"))
 			    unit = constraint.get("key").asText();
 
+			/*
 			if (unit.equals("t"))
 			    throw new QueryException(
 				613,
 			        "Text based distances are not supported yet"
                             );
+			*/
+
+
 
 			int min = 0, max = 100;
 			if (constraint.has("boundary")) {
@@ -311,6 +321,20 @@
 				max = constraint.get("max").asInt(100);
 			};
 
+			// Add foundry and layer to the unit for new indices
+			if (constraint.has("foundry") &&
+			    constraint.has("layer") &&
+			    constraint.get("foundry").asText().length() > 0 &&
+			    constraint.get("layer").asText().length() > 0) {
+
+			    StringBuilder value = new StringBuilder();
+			    value.append(constraint.get("foundry").asText());
+			    value.append('/');
+			    value.append(constraint.get("layer").asText());
+			    value.append(':').append(unit);
+			    unit = value.toString();
+			};
+
 			// Sanitize boundary
 			if (max < min)
 			    max = min;
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java
index 16730ce..e493c9e 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanClassQuery.java
@@ -24,22 +24,18 @@
 public class SpanClassQuery extends SpanQuery {
     public String field;
     protected byte number;
-    protected SpanQuery highlight;
+    protected SpanQuery operand;
 
-    public SpanClassQuery (SpanQuery highlight, byte number) {
-	this.field = highlight.getField();
-	this.highlight = highlight;
-	if (number <= 15) {
-	    this.number = number;
-	} else{
-	    this.number = (byte) 0;
-	};
+    public SpanClassQuery (SpanQuery operand, byte number) {
+	this.field = operand.getField();
+	this.operand = operand;
+	this.number = number;
     };
 
-    public SpanClassQuery (SpanQuery highlight) {
-	this.field = highlight.getField();
-	this.highlight = highlight;
-	this.number = (byte) 0;
+    public SpanClassQuery (SpanQuery operand) {
+	this.field = operand.getField();
+	this.operand = operand;
+	this.number = (byte) 1;
     };
 
     public byte number () {
@@ -51,14 +47,15 @@
 
     @Override
     public void extractTerms (Set<Term> terms) {
-	this.highlight.extractTerms(terms);
+	this.operand.extractTerms(terms);
     };
 
     @Override
     public String toString (String field) {
 	StringBuffer buffer = new StringBuffer("{");
-	buffer.append((int) this.number).append(": ");
-        buffer.append(this.highlight.toString()).append('}');
+	short classNr = (short) this.number;
+	buffer.append(classNr & 0xFF).append(": ");
+        buffer.append(this.operand.toString()).append('}');
 	buffer.append(ToStringUtils.boost(getBoost()));
 	return buffer.toString();
     };
@@ -68,7 +65,7 @@
 			   Bits acceptDocs,
 			   Map<Term,TermContext> termContexts) throws IOException {
 	return (Spans) new ClassSpans(
-	    this.highlight,
+	    this.operand,
 	    context,
 	    acceptDocs,
 	    termContexts,
@@ -79,12 +76,12 @@
     @Override
     public Query rewrite (IndexReader reader) throws IOException {
 	SpanClassQuery clone = null;
-	SpanQuery query = (SpanQuery) this.highlight.rewrite(reader);
+	SpanQuery query = (SpanQuery) this.operand.rewrite(reader);
 
-	if (query != this.highlight) {
+	if (query != this.operand) {
 	    if (clone == null)
 		clone = this.clone();
-	    clone.highlight = query;
+	    clone.operand = query;
 	};
 
 	if (clone != null)
@@ -96,7 +93,7 @@
     @Override
     public SpanClassQuery clone() {
 	SpanClassQuery spanClassQuery = new SpanClassQuery(
-	    (SpanQuery) this.highlight.clone(),
+	    (SpanQuery) this.operand.clone(),
 	    this.number
         );
 	spanClassQuery.setBoost(getBoost());
@@ -112,7 +109,7 @@
 	
 	final SpanClassQuery spanClassQuery = (SpanClassQuery) o;
 	
-	if (!highlight.equals(spanClassQuery.highlight)) return false;
+	if (!this.operand.equals(spanClassQuery.operand)) return false;
 
 	if (this.number != spanClassQuery.number) return false;
 
@@ -124,7 +121,7 @@
     @Override
     public int hashCode() {
 	int result = 1;
-	result = highlight.hashCode();
+	result = operand.hashCode();
 	result += (int) number;
 	result ^= (result << 15) | (result >>> 18);
 	result += Float.floatToRawIntBits(getBoost());
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanMatchModifyClassQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanMatchModifyClassQuery.java
index d507c07..b86b818 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanMatchModifyClassQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanMatchModifyClassQuery.java
@@ -24,21 +24,21 @@
 public class SpanMatchModifyClassQuery extends SpanClassQuery {
     private boolean divide = false;
 
-    public SpanMatchModifyClassQuery (SpanQuery highlight, byte number, boolean divide) {
-	super(highlight, number);
+    public SpanMatchModifyClassQuery (SpanQuery operand, byte number, boolean divide) {
+	super(operand, number);
 	this.divide = divide;
     };
 
-    public SpanMatchModifyClassQuery (SpanQuery highlight, boolean divide) {
-	this(highlight, (byte) 0, divide);
+    public SpanMatchModifyClassQuery (SpanQuery operand, boolean divide) {
+	this(operand, (byte) 1, divide);
     };
 
-    public SpanMatchModifyClassQuery (SpanQuery highlight, byte number) {
-	this(highlight, number, false);
+    public SpanMatchModifyClassQuery (SpanQuery operand, byte number) {
+	this(operand, number, false);
     };
 
-    public SpanMatchModifyClassQuery (SpanQuery highlight) {
-	this(highlight, (byte) 0, false);
+    public SpanMatchModifyClassQuery (SpanQuery operand) {
+	this(operand, (byte) 1, false);
     };
 
     @Override
@@ -50,8 +50,9 @@
 	else {
 	    buffer.append("shrink(");
 	};
-	buffer.append((int) this.number).append(": ");
-        buffer.append(this.highlight.toString());
+	short classNr = (short) this.number;
+	buffer.append(classNr & 0xFF).append(": ");
+        buffer.append(this.operand.toString());
 	buffer.append(')');
 
 	buffer.append(ToStringUtils.boost(getBoost()));
@@ -60,18 +61,18 @@
 
     @Override
     public Spans getSpans (final AtomicReaderContext context, Bits acceptDocs, Map<Term,TermContext> termContexts) throws IOException {
-	return (Spans) new MatchModifyClassSpans(this.highlight, context, acceptDocs, termContexts, number, divide);
+	return (Spans) new MatchModifyClassSpans(this.operand, context, acceptDocs, termContexts, number, divide);
     };
 
     @Override
     public Query rewrite (IndexReader reader) throws IOException {
 	SpanMatchModifyClassQuery clone = null;
-	SpanQuery query = (SpanQuery) this.highlight.rewrite(reader);
+	SpanQuery query = (SpanQuery) this.operand.rewrite(reader);
 
-	if (query != this.highlight) {
+	if (query != this.operand) {
 	    if (clone == null)
 		clone = this.clone();
-	    clone.highlight = query;
+	    clone.operand = query;
 	};
 
 	if (clone != null)
@@ -83,7 +84,7 @@
     @Override
     public SpanMatchModifyClassQuery clone() {
 	SpanMatchModifyClassQuery spanMatchQuery = new SpanMatchModifyClassQuery(
-	    (SpanQuery) this.highlight.clone(),
+	    (SpanQuery) this.operand.clone(),
 	    this.number,
 	    this.divide
         );
@@ -100,7 +101,7 @@
 	
 	final SpanMatchModifyClassQuery spanMatchModifyClassQuery = (SpanMatchModifyClassQuery) o;
 	
-	if (!highlight.equals(spanMatchModifyClassQuery.highlight)) return false;
+	if (!this.operand.equals(spanMatchModifyClassQuery.operand)) return false;
 	if (this.number != spanMatchModifyClassQuery.number) return false;
 	if (this.divide != spanMatchModifyClassQuery.divide) return false;
 	return getBoost() == spanMatchModifyClassQuery.getBoost();
@@ -111,7 +112,7 @@
     @Override
     public int hashCode() {
 	int result = 1;
-	result = highlight.hashCode();
+	result = operand.hashCode();
 	result += number + 33_333;
 	result += divide ? 1 : 0;
 	result ^= (result << 15) | (result >>> 18);
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
index cf12852..4b087cd 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ClassSpans.java
@@ -24,7 +24,7 @@
     private List<byte[]> highlightedPayload;
     private final Spans spans;
     private byte number;
-    private SpanQuery highlight;
+    private SpanQuery operand;
     private Boolean hasmorespans = false;
 
     private ByteBuffer bb = ByteBuffer.allocate(9);
@@ -33,14 +33,14 @@
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
-    public ClassSpans (SpanQuery highlight,
+    public ClassSpans (SpanQuery operand,
 		       AtomicReaderContext context,
 		       Bits acceptDocs,
 		       Map<Term,TermContext> termContexts,
 		       byte number) throws IOException {
-	spans = highlight.getSpans(context, acceptDocs, termContexts);
+	spans = operand.getSpans(context, acceptDocs, termContexts);
 	this.number = number;
-	this.highlight = highlight;
+	this.operand = operand;
 	this.highlightedPayload = new ArrayList<byte[]>(6);
     };
 
@@ -131,7 +131,7 @@
 
     @Override
     public String toString() {
-	return getClass().getName() + "(" + this.highlight.toString() + ")@" +
+	return getClass().getName() + "(" + this.operand.toString() + ")@" +
 	    (doc() + ":" + start() + "-" + end());
     };
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/MatchModifyClassSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/MatchModifyClassSpans.java
index a45e1ee..d6a6318 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/MatchModifyClassSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/MatchModifyClassSpans.java
@@ -37,7 +37,7 @@
     private final Logger log = LoggerFactory.getLogger(MatchModifyClassSpans.class);
 
     // This advices the java compiler to ignore all loggings
-    public static final boolean DEBUG = false;
+    public static final boolean DEBUG = true;
 
     private int start = -1, end;
     private int tempStart = 0, tempEnd = 0;
@@ -53,7 +53,7 @@
 	this.number    = number;
 	this.divide    = divide;
 	this.wrapQuery = wrapQuery;
-	this.bb        = ByteBuffer.allocate(9);
+	this.bb        = ByteBuffer.allocate(20);
 	this.wrappedPayload = new ArrayList<byte[]>(6);
     };
 
@@ -114,7 +114,7 @@
 		    if (payload.length == 9 && bb.get() == this.number) {
 			bb.rewind();
 			tempStart = bb.getInt();
-			tempEnd = bb.getInt();
+			tempEnd   = bb.getInt();
 
 			if (DEBUG)
 			    log.trace("Found matching class {}-{}", tempStart, tempEnd);
diff --git a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanMatchModifyQueryWrapper.java b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanMatchModifyQueryWrapper.java
index 7faadf8..bfdcdbf 100644
--- a/src/main/java/de/ids_mannheim/korap/query/wrap/SpanMatchModifyQueryWrapper.java
+++ b/src/main/java/de/ids_mannheim/korap/query/wrap/SpanMatchModifyQueryWrapper.java
@@ -31,7 +31,7 @@
 
     public SpanMatchModifyQueryWrapper (SpanQueryWrapper subquery) {
 	this.subquery = subquery;
-	this.number = (byte) 0;
+	this.number = (byte) 1;
     };
 
     public SpanQuery toQuery () throws QueryException {
