diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessor.java b/src/main/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessor.java
index 298d45d..dcdb802 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessor.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/AnnisQueryProcessor.java
@@ -98,7 +98,7 @@
     /**
      * Keeps a record of reference-class-mapping, i.e. which 'class' has been 
      * assigned to which #n reference. This is important when introducing 
-     * korap:reference spans to refer back to previously established classes for 
+     * koral:reference spans to refer back to previously established classes for 
      * entities.
      */
     private LinkedHashMap<String, Integer> refClassMapping = 
@@ -393,7 +393,7 @@
         }
         if (node.getChildCount() == 3) {  			
             // (foundry/)?layer=key specification
-            if (object.get("@type").equals("korap:token")) {
+            if (object.get("@type").equals("koral:token")) {
                 HashMap<String, Object> term = (HashMap<String, Object>) 
                         object.get("wrap");
                 term.putAll(parseTextSpec(node.getChild(2)));
@@ -722,10 +722,10 @@
 
     /**
      * Parses a unary_linguistic_operator node. Possible operators are: 
-     * root, arity, tokenarity. Operators are embedded into a korap:term,
-     * in turn wrapped by an 'attr' property in a korap:span.
+     * root, arity, tokenarity. Operators are embedded into a koral:term,
+     * in turn wrapped by an 'attr' property in a koral:span.
      * @param node The unary_linguistic_operator node
-     * @return A map containing the attr key, to be inserted into korap:span 
+     * @return A map containing the attr key, to be inserted into koral:span 
      */
     private LinkedHashMap<String, Object> parseUnaryOperator(ParseTree node) {
         LinkedHashMap<String, Object> term = KoralObjectGenerator.makeTerm();
@@ -763,7 +763,7 @@
                 LinkedHashMap<String,Object> edgeSpec = 
                         parseEdgeSpec(edgeSpecNode);
                 String edgeSpecType = (String) edgeSpec.get("@type");
-                if (edgeSpecType.equals("korap:termGroup")) {
+                if (edgeSpecType.equals("koral:termGroup")) {
                     ((ArrayList<Object>) edgeSpec.get("operands")).add(term);
                     term = edgeSpec;
                 } else {
@@ -899,9 +899,8 @@
 
     private LinkedHashMap<String, Object> parseEdgeAnno(
             ParseTree edgeAnnoSpec) {
-        LinkedHashMap<String, Object> edgeAnno =
-                new LinkedHashMap<String, Object>();
-        edgeAnno.put("@type", "korap:term");
+        LinkedHashMap<String, Object> edgeAnno = 
+                KoralObjectGenerator.makeTerm();
         ParseTree textSpecNode= getFirstChildWithCat(edgeAnnoSpec, "textSpec");
         ParseTree layerNode = getFirstChildWithCat(edgeAnnoSpec, "layer");
         ParseTree foundryNode = getFirstChildWithCat(edgeAnnoSpec, "foundry");
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/Cosmas2QueryProcessor.java b/src/main/java/de/ids_mannheim/korap/query/serialize/Cosmas2QueryProcessor.java
index c5ea126..c3b0e2b 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/Cosmas2QueryProcessor.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/Cosmas2QueryProcessor.java
@@ -314,7 +314,7 @@
                 // Step I: create group
                 String nodeCat = getNodeCat(node);
                 LinkedHashMap<String, Object> beggroup = new LinkedHashMap<String, Object>();
-                beggroup.put("@type", "korap:reference");
+                beggroup.put("@type", "koral:reference");
                 beggroup.put("operation", "operation:focus");
                 ArrayList<Integer> spanRef = new ArrayList<Integer>();
                 if (nodeCat.equals("OPBEG")) {
@@ -684,9 +684,8 @@
 
             private void processOPLABEL(Tree node) {
                 // Step I: create element
-                LinkedHashMap<String, Object> elem = new LinkedHashMap<String, Object>();
-                elem.put("@type", "korap:span");
-                elem.put("key", node.getChild(0).toStringTree().replaceAll("<|>", ""));
+                String key = node.getChild(0).toStringTree().replaceAll("<|>", "");
+                LinkedHashMap<String, Object> elem = KoralObjectGenerator.makeSpan(key);
                 // Step II: decide where to put
                 putIntoSuperObject(elem);
             }
@@ -810,8 +809,7 @@
                         return;
                     }
 
-                    fieldMap = new LinkedHashMap<String, Object>();
-                    fieldMap.put("@type", "korap:term");
+                    fieldMap = KoralObjectGenerator.makeTerm();
 
                     if (m.group(2) != null)
                         fieldMap.put("foundry", m.group(2));
@@ -871,16 +869,12 @@
             private void processOPWF_OPLEM(Tree node) {
                 String nodeCat = getNodeCat(node);
                 // Step I: get info
-                LinkedHashMap<String, Object> token = 
-                        new LinkedHashMap<String, Object>();
-                token.put("@type", "korap:token");
+                LinkedHashMap<String, Object> token = KoralObjectGenerator.makeToken();
                 objectStack.push(token);
                 stackedObjects++;
                 LinkedHashMap<String, Object> fieldMap = 
-                        new LinkedHashMap<String, Object>();
+                        KoralObjectGenerator.makeTerm();
                 token.put("wrap", fieldMap);
-
-                fieldMap.put("@type", "korap:term");
                 // make category-specific fieldMap entry
                 String attr = nodeCat.equals("OPWF") ? "orth" : "lemma";
                 String value = node.getChild(0).toStringTree().replaceAll("\"", "");
@@ -1036,9 +1030,7 @@
                         KoralObjectGenerator.makeSpanClass(128+classCounter++);
                 classGroup.put("operands", distributedOperands);
                 positionGroup.put("operands", posOperands);
-                LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
-                span.put("@type", "korap:span");
-                span.put("key", elem);
+                LinkedHashMap<String, Object> span = KoralObjectGenerator.makeSpan(elem);
                 objectStack.push(classGroup);
                 if (hitSpanRef != null) {
                     LinkedHashMap<String, Object> spanRefAroundHit = 
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/CqlQueryProcessor.java b/src/main/java/de/ids_mannheim/korap/query/serialize/CqlQueryProcessor.java
index 9064a0e..6ed5f6b 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/CqlQueryProcessor.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/CqlQueryProcessor.java
@@ -71,12 +71,12 @@
 
     private Map<String, Object> sentenceWrapper(Map<String, Object> m) {
         Map<String, Object> map = new LinkedHashMap<String, Object>();
-        map.put("@type", "korap:group");
+        map.put("@type", "koral:group");
         map.put("operation", OPERATION_POSITION);
         map.put("frame", "frame:contains");
 
         Map<String, Object> sentence = new LinkedHashMap<String, Object>();
-        sentence.put("@type", "korap:span");
+        sentence.put("@type", "koral:span");
         sentence.put("key", "s");
 
         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
@@ -146,13 +146,13 @@
         checkBooleanModifier(node);
 
         Map<String, Object> map = new LinkedHashMap<String, Object>();
-        map.put("@type", "korap:group");
+        map.put("@type", "koral:group");
         map.put("operation", OPERATION_SEQUENCE);
         map.put("inOrder", false);
 
         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
         Map<String, Object> distanceMap = new LinkedHashMap<String, Object>();
-        distanceMap.put("@type", "korap:distance");
+        distanceMap.put("@type", "koral:distance");
         distanceMap.put("key", "s");
         distanceMap.put("min", "0");
         distanceMap.put("max", "0");
@@ -171,7 +171,7 @@
         checkBooleanModifier(node);
 
         Map<String, Object> map = new LinkedHashMap<String, Object>();
-        map.put("@type", "korap:group");
+        map.put("@type", "koral:group");
         map.put("operation", OPERATION_OR);
 
         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
@@ -184,7 +184,7 @@
 
     private Map<String, Object> writeSequence(String str) {
         Map<String, Object> sequenceMap = new LinkedHashMap<String, Object>();
-        sequenceMap.put("@type", "korap:group");
+        sequenceMap.put("@type", "koral:group");
         sequenceMap.put("operation", OPERATION_SEQUENCE);
 
         List<Map<String, Object>> termList = new ArrayList<Map<String, Object>>();
@@ -199,7 +199,7 @@
 
     private Map<String, Object> writeTerm(String term) {
         Map<String, Object> map = new LinkedHashMap<String, Object>();
-        map.put("@type", "korap:term");
+        map.put("@type", "koral:term");
         if (!isCaseSensitive) {
             map.put("caseInsensitive", "true");
         }
@@ -208,7 +208,7 @@
         map.put("match", "match:eq");
 
         Map<String, Object> tokenMap = new LinkedHashMap<String, Object>();
-        tokenMap.put("@type", "korap:token");
+        tokenMap.put("@type", "koral:token");
         tokenMap.put("wrap", map);
         return tokenMap;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/util/KoralObjectGenerator.java b/src/main/java/de/ids_mannheim/korap/query/serialize/util/KoralObjectGenerator.java
index 8fdf565..5550d51 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/util/KoralObjectGenerator.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/util/KoralObjectGenerator.java
@@ -17,26 +17,26 @@
 
     public static LinkedHashMap<String, Object> makeSpan() {
         LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
-        span.put("@type", "korap:span");
+        span.put("@type", "koral:span");
         return span;
     }
 
     public static LinkedHashMap<String, Object> makeSpan(String key) {
         LinkedHashMap<String, Object> span = new LinkedHashMap<String, Object>();
-        span.put("@type", "korap:span");
+        span.put("@type", "koral:span");
         span.put("key", key);
         return span;
     }
 
     public static LinkedHashMap<String, Object> makeTerm() {
         LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
-        term.put("@type", "korap:term");
+        term.put("@type", "koral:term");
         return term;
     }
 
     public static LinkedHashMap<String, Object> makeTermGroup(String relation) {
         LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
-        term.put("@type", "korap:termGroup");
+        term.put("@type", "koral:termGroup");
         term.put("relation", "relation:" + relation);
         term.put("operands", new ArrayList<Object>());
         return term;
@@ -44,13 +44,13 @@
 
     public static LinkedHashMap<String, Object> makeDoc() {
         LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
-        term.put("@type", "korap:doc");
+        term.put("@type", "koral:doc");
         return term;
     }
 
     public static LinkedHashMap<String, Object> makeDocGroup(String relation) {
         LinkedHashMap<String, Object> term = new LinkedHashMap<String, Object>();
-        term.put("@type", "korap:docGroup");
+        term.put("@type", "koral:docGroup");
         term.put("operation", "operation:" + relation);
         term.put("operands", new ArrayList<Object>());
         return term;
@@ -58,13 +58,13 @@
 
     public static LinkedHashMap<String, Object> makeToken() {
         LinkedHashMap<String, Object> token = new LinkedHashMap<String, Object>();
-        token.put("@type", "korap:token");
+        token.put("@type", "koral:token");
         return token;
     }
 
     public static LinkedHashMap<String, Object> makeGroup(String operation) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:group");
+        group.put("@type", "koral:group");
         group.put("operation", "operation:" + operation);
         group.put("operands", new ArrayList<Object>());
         return group;
@@ -81,7 +81,7 @@
     @Deprecated
     public static LinkedHashMap<String, Object> makePosition(String frame) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:group");
+        group.put("@type", "koral:group");
         group.put("operation", "operation:position");
         group.put("frame", "frame:" + frame);
         group.put("operands", new ArrayList<Object>());
@@ -91,7 +91,7 @@
     public static LinkedHashMap<String, Object> makePosition(
             String[] allowedFrames) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:group");
+        group.put("@type", "koral:group");
         group.put("operation", "operation:position");
         group.put("frames", Arrays.asList(allowedFrames));
         group.put("operands", new ArrayList<Object>());
@@ -106,7 +106,7 @@
     public static LinkedHashMap<String, Object> makeSpanClass(int classId,
             boolean setBySystem) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:group");
+        group.put("@type", "koral:group");
         group.put("operation", "operation:class");
         if (setBySystem) {
             classId += 128;
@@ -122,7 +122,7 @@
     public static LinkedHashMap<String, Object> makeClassRefCheck(
             ArrayList<String> check, Integer[] classIn, int classOut) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:group");
+        group.put("@type", "koral:group");
         group.put("operation", "operation:class");
         group.put("classRefCheck", check);
         group.put("classIn", Arrays.asList(classIn));
@@ -134,7 +134,7 @@
     public static LinkedHashMap<String, Object> makeClassRefOp(
             String operation, Integer[] classIn, int classOut) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:group");
+        group.put("@type", "koral:group");
         group.put("operation", "operation:class");
         group.put("classRefOp", operation);
         group.put("classIn", Arrays.asList(classIn));
@@ -146,7 +146,7 @@
     @Deprecated
     public static LinkedHashMap<String, Object> makeTreeRelation(String reltype) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:treeRelation");
+        group.put("@type", "koral:treeRelation");
         if (reltype != null)
             group.put("reltype", reltype);
         return group;
@@ -154,14 +154,14 @@
 
     public static LinkedHashMap<String, Object> makeRelation() {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:relation");
+        group.put("@type", "koral:relation");
         return group;
     }
 
     public static LinkedHashMap<String, Object> makeBoundary(Integer min,
             Integer max) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:boundary");
+        group.put("@type", "koral:boundary");
         group.put("min", min);
         if (max != null) {
             group.put("max", max);
@@ -173,7 +173,7 @@
             Integer min, Integer max) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
         if (key.equals("w")) {
-            group.put("@type", "korap:distance");
+            group.put("@type", "koral:distance");
         }
         else {
             group.put("@type", "cosmas:distance");
@@ -193,7 +193,7 @@
     public static LinkedHashMap<String, Object> makeReference(
             ArrayList<Integer> classRefs, String operation) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:reference");
+        group.put("@type", "koral:reference");
         group.put("operation", "operation:" + operation);
         if (classRefs != null && !classRefs.isEmpty()) {
             group.put("classRef", classRefs);
@@ -233,7 +233,7 @@
     @Deprecated
     public static LinkedHashMap<String, Object> makeResetReference() {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:reference");
+        group.put("@type", "koral:reference");
         group.put("operation", "operation:focus");
         group.put("reset", true);
         group.put("operands", new ArrayList<Object>());
@@ -243,7 +243,7 @@
     public static LinkedHashMap<String, Object> makeSpanReference(
             Integer[] spanRef, String operation) {
         LinkedHashMap<String, Object> group = new LinkedHashMap<String, Object>();
-        group.put("@type", "korap:reference");
+        group.put("@type", "koral:reference");
         group.put("operation", "operation:" + operation);
         group.put("spanRef", Arrays.asList(spanRef));
         group.put("operands", new ArrayList<Object>());
@@ -257,9 +257,14 @@
   
     public static LinkedHashMap<String, Object> wrapInReference(
             LinkedHashMap<String, Object> group, Integer classId) {
-        return wrapInReference(group, classId, false);
+        LinkedHashMap<String, Object> refGroup = makeReference(classId);
+        ArrayList<Object> operands = new ArrayList<Object>();
+        operands.add(group);
+        refGroup.put("operands", operands);
+        return refGroup;
     }
     
+    @Deprecated
     public static LinkedHashMap<String, Object> wrapInReference(
             LinkedHashMap<String, Object> group, Integer classId, 
             boolean setBySystem) {
