diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaCollectionSerializer.java b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaCollectionSerializer.java
new file mode 100644
index 0000000..f80aa83
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaCollectionSerializer.java
@@ -0,0 +1,142 @@
+package de.ids_mannheim.korap.query.serialize;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author hanl
+ * @date 04/12/2013
+ */
+public class MetaCollectionSerializer {
+
+    public String meta1 = "{\n" +
+            "            \"@type\": \"korap:meta-filter\",\n" +
+            "            \"@id\": \"korap-filter#id-23\",\n" +
+            "            \"@value\": {\n" +
+            "                \"@type\": \"korap:term\",\n" +
+            "                \"@value\": \"wissenschaft\"\n" +
+            "            }\n" +
+            "        }\n";
+    public String meta2 = "{\n" +
+            "        \"@type\": \"korap:meta-filter\",\n" +
+            "        \"@id\": \"korap-filter#id-24\",\n" +
+            "        \"@value\": {\n" +
+            "            \"@type\": \"korap:group\",\n" +
+            "            \"relation\": \"and\",\n" +
+            "            \"operands\": [\n" +
+            "                {\n" +
+            "                    \"@type\": \"korap:term\",\n" +
+            "                    \"@field\": \"korap:field#pubPlace\",\n" +
+            "                    \"@value\": \"Erfurt\"\n" +
+            "                },\n" +
+            "                {\n" +
+            "                    \"@type\": \"korap:term\",\n" +
+            "                    \"@field\": \"korap:field#author\",\n" +
+            "                    \"@value\": \"Hesse\"\n" +
+            "                }\n" +
+            "            ]\n" +
+            "        }\n" +
+            "    }\n";
+    private MetaTypes types;
+    private ObjectMapper mapper;
+    private String meta3 = "{\n" +
+            "            \"@type\": \"korap:meta-extend\",\n" +
+            "            \"@id\": \"korap-filter#id-25\",\n" +
+            "            \"@value\": {\n" +
+            "                \"@type\": \"korap:group\",\n" +
+            "                \"relation\": \"and\",\n" +
+            "                \"operands\": [\n" +
+            "                    {\n" +
+            "                        \"@type\": \"korap:group\",\n" +
+            "                        \"relation\": \"comment: other values can be 'since','until' in combination with a simple korap:term\",\n" +
+            "                        \"relation\": \"between\",\n" +
+            "                        \"@field\": \"korap:field#pubDate\",\n" +
+            "                        \"operands\": [\n" +
+            "                            {\n" +
+            "                                \"@type\": \"korap:date\",\n" +
+            "                                \"@value\": \"comment: either long value or String representation '2013-04-29'\",\n" +
+            "                                \"@value\": \"2011\"\n" +
+            "                            },\n" +
+            "                            {\n" +
+            "                                \"@type\": \"korap:date\",\n" +
+            "                                \"@value\": \"2013\"\n" +
+            "                            }\n" +
+            "                        ]\n" +
+            "                    },\n" +
+            "                    {\n" +
+            "                        \"@type\": \"korap:term\",\n" +
+            "                        \"@field\": \"korap:field#textClass\",\n" +
+            "                        \"@value\": \"freizeit\"\n" +
+            "                    }\n" +
+            "                ]\n" +
+            "            }\n" +
+            "        }";
+    private Map<String, Map> tester;
+
+    public MetaCollectionSerializer() {
+        this.types = new MetaTypes();
+        this.mapper = new ObjectMapper();
+        this.tester = tester();
+    }
+
+    //resources must be ordered: 0 without parent, 1 has 0 as parent, etc.
+    // what about extend?! is that also part of the VC meta query?!
+    public String serialize(String resource) throws IOException {
+        Map metas = new HashMap();
+        Map<String, String> pa = getParents(resource);
+        List<Map> parids = new ArrayList<>();
+        for (String key : pa.keySet()) {
+            Map re = types.mapify(pa.get(key));
+            parids.add(re);
+        }
+        metas.put("meta", parids);
+        return mapper.writeValueAsString(metas);
+    }
+
+    private Map<String, String> getParents(String id) {
+        Map<String, String> cursor = getResource(id);
+        Map<String, String> parents = new HashMap<>();
+
+        if (cursor.get("parent") != null && !cursor.get("parent").isEmpty()) {
+            parents.put(id, cursor.get("query"));
+            parents.putAll(getParents(cursor.get("parent")));
+        } else
+            parents.put(id, cursor.get("query"));
+        return parents;
+
+    }
+
+    //todo: connection to database module!
+    public Map<String, String> getResource(String id) {
+        return tester.get(id);
+
+    }
+
+    private Map<String, Map> tester() {
+        Map<String, Map> l = new HashMap<>();
+        Map<String, String> s = new HashMap<>();
+        s.put("id", "23");
+        s.put("parent", "");
+        s.put("query", meta1);
+
+        Map<String, String> s2 = new HashMap<>();
+        s2.put("id", "24");
+        s2.put("parent", "23");
+        s2.put("query", meta2);
+
+        Map<String, String> s3 = new HashMap<>();
+        s3.put("id", "25");
+        s3.put("parent", "24");
+        s3.put("query", meta3);
+        l.put("23", s);
+        l.put("24", s2);
+        l.put("25", s3);
+        return l;
+    }
+
+}
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaQuerySerializer.java b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaQuerySerializer.java
new file mode 100644
index 0000000..6db54f4
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaQuerySerializer.java
@@ -0,0 +1,106 @@
+package de.ids_mannheim.korap.query.serialize;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * serializes a map of meta queries to JSON-LD. Currently this only works for simple mode queries (simple AND relation, except for date ranges)
+ * Expert mode requires a full blown parser (since different combinations of OR and AND relations are possible)
+ * also normalizes dates to year-month-day
+ * <p/>
+ * <p/>
+ * User: hanl
+ * Date: 11/14/13
+ * Time: 2:03 PM
+ */
+public class MetaQuerySerializer {
+
+    private ObjectMapper mapper;
+    private MetaTypes types;
+
+    public MetaQuerySerializer() {
+        this.mapper = new ObjectMapper();
+        this.types = new MetaTypes();
+    }
+
+    // construct pubdate range query as "pubDate:'<date>' ~ pubDate:'<date>'"
+    //todo: how to handle regex types?
+    // only handles AND relation between query attributes and values!
+    // value pair : pubdate=<date>, pubPlace=<place>, etc.
+    public List serializeQueries(Map<String, String> queries) {
+        boolean single = true;
+        boolean multypes = queries.keySet().size() > 1;
+        List metavalue;
+        String def_key = null;
+        if (queries.size() > 1)
+            single = false;
+
+        List value = new ArrayList<>();
+        for (String key : queries.keySet()) {
+            if (!multypes)
+                def_key = key;
+            String[] dr;
+            if (queries.get(key).contains("~")) {
+                dr = queries.get(key).split("~");
+                Map fd = types.createTerm(null, null, dr[0].trim(), "korap:date");
+                Map td = types.createTerm(null, null, dr[1].trim(), "korap:date");
+                Map dg = types.createGroup("between", key, Arrays.asList(fd, td));
+                value.add(dg);
+                continue;
+            } else if (queries.get(key).contains(">")) {
+                dr = queries.get(key).split(">");
+                Map fd = types.createTerm(null, null, dr[0].trim(), "korap:date");
+                Map td = types.createTerm(null, null, dr[1].trim(), "korap:date");
+                Map dg = types.createGroup("between", key, Arrays.asList(fd, td));
+                value.add(dg);
+                continue;
+            } else if (queries.get(key).contains("<")) {
+                dr = queries.get(key).split("<");
+                Map fd = types.createTerm(null, null, dr[0].trim(), "korap:date");
+                Map td = types.createTerm(null, null, dr[1].trim(), "korap:date");
+                Map dg = types.createGroup("between", key, Arrays.asList(fd, td));
+                value.add(dg);
+                continue;
+            }
+
+            Map term;
+            if (multypes)
+                term = types.createTerm(key, null, queries.get(key).trim(), null);
+            else
+                term = types.createTerm(null, null, queries.get(key).trim(), null);
+            value.add(term);
+        }
+
+        // todo: missing: - takes only one resource, but resources can be chained!
+        // only filters, no extension
+//        metavalue.put("meta", Arrays.asList(types.createMetaFilter(resource, (Map) value.get(0))));
+        if (single)
+            metavalue = Arrays.asList(types.createMetaFilter((Map) value.get(0)));
+        else {
+            Map group;
+            if (!multypes)
+                group = types.createGroup("and", def_key, value);
+            else
+                group = types.createGroup("and", null, value);
+//            metavalue.put("meta", Arrays.asList(types.createMetaFilter(resource, group)));
+            metavalue = Arrays.asList(types.createMetaFilter(group));
+        }
+        return metavalue;
+    }
+
+    public String stringify(Map<String, String> queries) throws IOException {
+        Map f = new HashMap();
+        f.put("meta", serializeQueries(queries));
+        return mapper.writeValueAsString(f);
+    }
+
+    public JsonNode jsonify(Map<String, String> queries) {
+        List s = serializeQueries(queries);
+        return mapper.valueToTree(s);
+    }
+
+
+}
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaSerializer.java b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaSerializer.java
deleted file mode 100644
index 12901f5..0000000
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaSerializer.java
+++ /dev/null
@@ -1,127 +0,0 @@
-package de.ids_mannheim.korap.query.serialize;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import java.io.IOException;
-import java.util.*;
-
-/**
- *
- * serializes a map of meta queries to JSON-LD. Currently this only works for simple mode queries (simple AND relation, except for date ranges)
- * Expert mode requires a full blown parser (since different combinations of OR and AND relations are possible)
- * also normalizes dates to year-month-day
- *
- *
- * User: hanl
- * Date: 11/14/13
- * Time: 2:03 PM
- */
-public class MetaSerializer {
-
-    private ObjectMapper mapper;
-
-    public MetaSerializer() {
-        this.mapper = new ObjectMapper();
-    }
-
-    private Map createGroup(String relation, String field, List terms) {
-        if (relation == null)
-            return null;
-
-        Map kgroup = new LinkedHashMap<>();
-        kgroup.put("@type", "korap:group");
-        if (field != null)
-            kgroup.put("field", "korap:field#" + field);
-        kgroup.put("relation", relation);
-        kgroup.put("operands", terms);
-        return kgroup;
-    }
-
-
-    private Map createTerm(String field, String subtype, String value, String type) {
-        Map term = new LinkedHashMap<>();
-        if (type == null)
-            type = "korap:term";
-        term.put("@type", type);
-        if (field != null)
-            term.put("@field", "korap:field#" + field);
-        if (subtype != null)
-            term.put("subtype", "korap:value#" + subtype);
-        term.put("@value", value);
-        return term;
-    }
-
-    private Map createMeta(String resource, Map value) {
-        Map meta = new LinkedHashMap();
-        meta.put("@type", "korap:meta-filter");
-        meta.put("@id", "korap-filter#" + resource);
-        meta.put("@value", value);
-        return meta;
-    }
-
-    private Map createMetaFilter(String resource, Map value) {
-        return null;
-    }
-
-
-    // construct pubdate range query as "pubDate:'<date>' ~ pubDate:'<date>'"
-    //todo: how to handle regex types?
-    // only handles AND relation between query attributes!
-    // value pair : pubdate=<date>, pubPlace=<place>, etc.
-    private Map serialize(String resource, Map<String, String> queries) {
-        boolean single = true;
-        boolean multypes = new HashSet<>(queries.keySet()).size() > 1;
-        Map metavalue = new LinkedHashMap<>();
-        String def_key = null;
-        if (queries.size() > 1)
-            single = false;
-
-        List value = new ArrayList<>();
-        for (String key : queries.keySet()) {
-            if (!multypes)
-                def_key = key;
-            if (queries.get(key).contains("~")) {
-                String[] dr = queries.get(key).split("~");
-                Map fd = createTerm(null, null, dr[0].trim(), "korap:date");
-                Map td = createTerm(null, null, dr[1].trim(), "korap:date");
-                Map dg = createGroup("between", key, Arrays.asList(fd, td));
-                value.add(dg);
-                continue;
-            }
-
-            Map term;
-            if (multypes)
-                term = createTerm(key, null, queries.get(key).trim(), null);
-            else
-                term = createTerm(null, null, queries.get(key).trim(), null);
-            value.add(term);
-        }
-
-        if (single)
-            metavalue.put("meta", Arrays.asList(createMeta(resource, (Map) value.get(0))));
-        else {
-            Map group;
-            if (!multypes)
-                group = createGroup("and", def_key, value);
-            else
-                group = createGroup("and", null, value);
-            metavalue.put("meta", Arrays.asList(createMeta(resource, group)));
-        }
-        return metavalue;
-    }
-
-    private String formatDate(String date) {
-        return "";
-    }
-
-
-    public String stringify(String resource, Map<String, String> queries) throws IOException {
-        Map s = serialize(resource, queries);
-        return mapper.writeValueAsString(s);
-    }
-
-
-
-
-
-}
diff --git a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaTypes.java b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaTypes.java
new file mode 100644
index 0000000..887f176
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaTypes.java
@@ -0,0 +1,95 @@
+package de.ids_mannheim.korap.query.serialize;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.io.IOException;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author hanl
+ * @date 04/12/2013
+ */
+public class MetaTypes {
+
+    private ObjectMapper mapper;
+
+    public MetaTypes() {
+        this.mapper = new ObjectMapper();
+    }
+
+    public Map createGroup(String relation, String field, List terms) {
+        if (relation == null)
+            return null;
+
+        Map kgroup = new LinkedHashMap<>();
+        kgroup.put("@type", "korap:group");
+        if (field != null)
+            kgroup.put("field", "korap:field#" + field);
+        kgroup.put("relation", relation);
+        kgroup.put("operands", terms);
+        return kgroup;
+    }
+
+    public Map createTerm(String field, String subtype, String value, String type) {
+        Map term = new LinkedHashMap<>();
+        if (type == null)
+            type = "korap:term";
+        term.put("@type", type);
+        if (field != null)
+            term.put("@field", "korap:field#" + field);
+        if (subtype != null)
+            term.put("subtype", "korap:value#" + subtype);
+        term.put("@value", value);
+        return term;
+    }
+
+    public Map createResourceFilter(String resource, Map value) {
+        Map meta = new LinkedHashMap();
+        meta.put("@type", "korap:meta-filter");
+        meta.put("@id", "korap-filter#" + resource);
+        meta.put("@value", value);
+        return meta;
+    }
+
+    public Map createResourceFilter(String resource, String value) throws IOException {
+        return createResourceFilter(resource, mapify(value));
+    }
+
+    public Map createResourceExtend(String resource, Map value) {
+        Map meta = new LinkedHashMap();
+        meta.put("@type", "korap:meta-extend");
+        meta.put("@id", "korap-filter#" + resource);
+        meta.put("@value", value);
+        return meta;
+    }
+
+    public Map createMetaFilter(Map value) {
+        Map meta = new LinkedHashMap();
+        meta.put("@type", "korap:meta-filter");
+        meta.put("@value", value);
+        return meta;
+    }
+
+    public Map createMetaExtend(Map value) {
+        Map meta = new LinkedHashMap();
+        meta.put("@type", "korap:meta-extend");
+        meta.put("@value", value);
+        return meta;
+    }
+
+    public String formatDate(String date) {
+        return "";
+    }
+
+    public Map mapify(String s) throws IOException {
+        return mapper.readValue(s, Map.class);
+    }
+
+    public String stringify(Map m) throws JsonProcessingException {
+        return mapper.writeValueAsString(m);
+    }
+
+}
diff --git a/src/test/java/MetaQuerySerializationTest.java b/src/test/java/MetaQuerySerializationTest.java
new file mode 100644
index 0000000..71ca546
--- /dev/null
+++ b/src/test/java/MetaQuerySerializationTest.java
@@ -0,0 +1,51 @@
+import de.ids_mannheim.korap.query.serialize.MetaCollectionSerializer;
+import de.ids_mannheim.korap.query.serialize.MetaQuerySerializer;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author hanl
+ * @date 04/12/2013
+ */
+
+@RunWith(JUnit4.class)
+public class MetaQuerySerializationTest {
+
+    private MetaQuerySerializer serializer;
+
+    public MetaQuerySerializationTest() {
+        serializer = new MetaQuerySerializer();
+    }
+
+    @Test
+    public void test() throws IOException {
+        Map<String, String> j = new HashMap();
+        j.put("author", "Goethe");
+        j.put("pubPLace", "Erfurt");
+        j.put("textClass", "wissenschaft");
+        String s = serializer.stringify(j);
+//        System.out.println("value reference " + s);
+    }
+
+    @Test
+    public void testSingle() throws IOException {
+        Map<String, String> j = new HashMap();
+        j.put("textClass", "wissenschaft");
+        String s = serializer.stringify(j);
+//        System.out.println("value reference test single " + s);
+    }
+
+    @Test
+    public void testResourceMeta() throws IOException {
+        MetaCollectionSerializer ser = new MetaCollectionSerializer();
+        String s = ser.serialize("25");
+        System.out.println(" --- RESULT JSON " + s);
+
+
+    }
+}
