diff --git a/src/main/java/de/ids_mannheim/korap/query/object/KoralOperation.java b/src/main/java/de/ids_mannheim/korap/query/object/KoralOperation.java
index 675b627..5dd557f 100644
--- a/src/main/java/de/ids_mannheim/korap/query/object/KoralOperation.java
+++ b/src/main/java/de/ids_mannheim/korap/query/object/KoralOperation.java
@@ -1,14 +1,16 @@
 package de.ids_mannheim.korap.query.object;
 
-/** Definition of possible operations within koral:group. 
+/**
+ * Definition of possible operations within koral:group.
+ * 
  * @author margaretha
  * 
  */
 public enum KoralOperation {
-    SEQUENCE, POSITION, DISJUNCTION, REPETITION, CLASS, MERGE, RELATION, FOCUS, EXCLUSION;
+    SEQUENCE, POSITION, DISJUNCTION, REPETITION, CLASS, MERGE, RELATION, FOCUS, EXCLUSION, HIERARCHY;
 
     @Override
-    public String toString() {
+    public String toString () {
         return "operation:" + super.toString().toLowerCase();
     }
 
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 a5f269f..5757625 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
@@ -715,6 +715,10 @@
                     group = KoralObjectGenerator.makeGroup(KoralOperation.SEQUENCE);
                     putAllButGroupType(group, operatorGroup);
                 }
+                else if (groupType.equals("hierarchy")) {
+                    group = KoralObjectGenerator.makeGroup(KoralOperation.HIERARCHY);
+                    putAllButGroupType(group, operatorGroup);
+                }
                 else if (groupType.equals("position")) {
                     group = new HashMap<String, Object>();
                     putAllButGroupType(group, operatorGroup);
@@ -851,20 +855,22 @@
         String operator = getNodeCat(operatorNode);
         // DOMINANCE
         if (operator.equals("dominance")) {
-            relation = KoralObjectGenerator.makeRelation();
-            relation.put("groupType", "relation");
-            ParseTree qName = getFirstChildWithCat(operatorNode, "qName");
+//            relation = KoralObjectGenerator.makeRelation();
+            relation = new HashMap<String, Object>();
+            relation.put("groupType", "hierarchy");
+//            ParseTree qName = getFirstChildWithCat(operatorNode, "qName");
             ParseTree edgeSpecNode = getFirstChildWithCat(operatorNode,
                     "edgeSpec");
             ParseTree star = getFirstChildWithCat(operatorNode, "*");
             ParseTree rangeSpec = getFirstChildWithCat(operatorNode,
                     "rangeSpec");
-            Map<String, Object> term = KoralObjectGenerator
-                    .makeTerm();
-            term.put("layer", "c");
-            if (qName != null)
-                term = parseQNameNode(qName);
+            
+//            term.put("layer", "c");
+//            if (qName != null)
+//                term = parseQNameNode(qName);
             if (edgeSpecNode != null) {
+                Map<String, Object> term = KoralObjectGenerator
+                        .makeTerm();
                 Map<String, Object> edgeSpec = parseEdgeSpec(edgeSpecNode);
                 String edgeSpecType = (String) edgeSpec.get("@type");
                 if (edgeSpecType.equals("koral:termGroup")) {
@@ -872,22 +878,23 @@
                     term = edgeSpec;
                 }
                 else {
-                    term = KoralObjectGenerator.makeTermGroup(KoralTermGroupRelation.AND);
-                    ArrayList<Object> termGroupOperands = (ArrayList<Object>) term
-                            .get("operands");
-                    termGroupOperands.add(edgeSpec);
-                    Map<String, Object> constTerm = KoralObjectGenerator
-                            .makeTerm();
-                    constTerm.put("layer", "c");
-                    termGroupOperands.add(constTerm);
+                    term = edgeSpec;
+//                    term = KoralObjectGenerator.makeTermGroup(KoralTermGroupRelation.AND);
+//                    ArrayList<Object> termGroupOperands = (ArrayList<Object>) term
+//                            .get("operands");
+//                    termGroupOperands.add(edgeSpec);
+//                    Map<String, Object> constTerm = KoralObjectGenerator
+//                            .makeTerm();
+//                    constTerm.put("layer", "c");
+//                    termGroupOperands.add(constTerm);
                 }
+                relation.put("label", term);
             }
             if (star != null)
                 relation.put("boundary",
                         KoralObjectGenerator.makeBoundary(0, null));
             if (rangeSpec != null)
                 relation.put("boundary", boundaryFromRangeSpec(rangeSpec));
-            relation.put("wrap", term);
         }
         else if (operator.equals("pointing")) {
             relation = KoralObjectGenerator.makeRelation();
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 6949812..0222864 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
@@ -182,8 +182,7 @@
         group.put("@type", KoralType.RELATION.toString());
         return group;
     }
-
-
+    
     public static Map<String, Object> makeBoundary (Integer min,
             Integer max) {
         Map<String, Object> group = new HashMap<String, Object>();
