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
index f43ba9e..53c90ab 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaCollectionSerializer.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaCollectionSerializer.java
@@ -112,7 +112,6 @@
     //todo: connection to database module!
     public Map<String, String> getResource(String id) {
         return tester.get(id);
-
     }
 
     private Map<String, Map> tester() {
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
index 6db54f4..60bd4b8 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaQuerySerializer.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaQuerySerializer.java
@@ -18,6 +18,7 @@
  */
 public class MetaQuerySerializer {
 
+
     private ObjectMapper mapper;
     private MetaTypes types;
 
@@ -30,77 +31,142 @@
     //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;
+    public List serializeQueries(Map<String, String> queries, TYPE type) {
+        boolean extend, single = true;
         boolean multypes = queries.keySet().size() > 1;
         List metavalue;
         String def_key = null;
         if (queries.size() > 1)
             single = false;
+        switch (type) {
+            case EXTEND:
+                extend = true;
+                break;
+            default:
+                extend = false;
+                break;
+        }
 
         List value = new ArrayList<>();
+        Map<String, String> dates = new LinkedHashMap<>();
         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);
+            if (key.contains("~") | key.contains(">") |
+                    key.contains("<")) {
+                System.out.println("values " + key);
+                dates.put(key, queries.get(key));
                 continue;
             }
 
+//            if (queries.get(key).contains("~")) {
+//                dr = queries.get(key).split("~");
+//                Map fd = types.createTerm(dr[0].trim(), "korap:date");
+//                Map td = types.createTerm(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(dr[0].trim(), "korap:date");
+//                Map td = types.createTerm(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(dr[0].trim(), "korap:date");
+//                Map td = types.createTerm(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);
+                term = types.createTerm(queries.get(key).trim(), null);
             value.add(term);
         }
 
+        String[] proc = processDates(dates);
+        int idx = 0;
+        if (proc[0] != null && proc[0].equals("r")) {
+            Map term1 = types.createTerm(proc[1], "korap:date");
+            Map term2 = types.createTerm(proc[2], "korap:date");
+            Map group = types.createGroup("between", "pubDate", Arrays.asList(term1, term2));
+            value.add(group);
+            idx = 3;
+        }
+
+        for (int i = idx; i < proc.length; i++) {
+            Map term = types.createTerm("pubDate", null, proc[i], "korap:date");
+            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 {
+        if (single) {
+            if (extend)
+                metavalue = Arrays.asList(types.createMetaExtend((Map) value.get(0)));
+            else
+                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));
+            if (extend)
+                metavalue = Arrays.asList(types.createMetaExtend(group));
+            else
+                metavalue = Arrays.asList(types.createMetaFilter(group));
         }
         return metavalue;
     }
 
-    public String stringify(Map<String, String> queries) throws IOException {
+    //todo: resource id must be added!
+    public String stringify(Map<String, String> queries, TYPE type) throws IOException {
         Map f = new HashMap();
-        f.put("meta", serializeQueries(queries));
+        f.put("meta", serializeQueries(queries, type));
         return mapper.writeValueAsString(f);
     }
 
+    //fixme: only allows for one until and since entry!!
+    private String[] processDates(Map<String, String> dates) {
+        if (dates.isEmpty())
+            return new String[1];
+        boolean until = false, since = false;
+        String[] el = new String[dates.keySet().size() + 1];
+        int idx = 1;
+        for (String key : dates.keySet()) {
+            if (key.contains("<")) {
+                since = true;
+                el[1] = dates.get(key);
+            }
+            if (key.contains(">")) {
+                until = true;
+                el[2] = dates.get(key);
+            } else
+                el[idx] = dates.get(key);
+            idx++;
+        }
+        if (since && until)
+            el[0] = "r";
+        return el;
+    }
+
     public JsonNode jsonify(Map<String, String> queries) {
-        List s = serializeQueries(queries);
+        List s = serializeQueries(queries, TYPE.FILTER);
         return mapper.valueToTree(s);
     }
 
 
+    public enum TYPE {
+        EXTEND, FILTER
+    }
+
+
 }
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
index 887f176..fcabf20 100644
--- a/src/main/java/de/ids_mannheim/korap/query/serialize/MetaTypes.java
+++ b/src/main/java/de/ids_mannheim/korap/query/serialize/MetaTypes.java
@@ -2,6 +2,7 @@
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.joda.time.DateTime;
 
 import java.io.IOException;
 import java.util.LinkedHashMap;
@@ -14,6 +15,9 @@
  */
 public class MetaTypes {
 
+    public static final String Y = "yyyy";
+    public static final String YM = "yyyy-mm";
+    public static final String YMD = "yyyy-mm-dd";
     private ObjectMapper mapper;
 
     public MetaTypes() {
@@ -39,13 +43,17 @@
             type = "korap:term";
         term.put("@type", type);
         if (field != null)
-            term.put("@field", "korap:field#" + field);
+            term.put("field", "korap:field#" + field);
         if (subtype != null)
             term.put("subtype", "korap:value#" + subtype);
         term.put("@value", value);
         return term;
     }
 
+    public Map createTerm(String value, String type) {
+        return createTerm(null, null, value, type);
+    }
+
     public Map createResourceFilter(String resource, Map value) {
         Map meta = new LinkedHashMap();
         meta.put("@type", "korap:meta-filter");
@@ -80,8 +88,18 @@
         return meta;
     }
 
-    public String formatDate(String date) {
-        return "";
+    public String formatDate(long date, String format) {
+        DateTime time = new DateTime(date);
+        switch (format) {
+            case YM:
+                String s = time.getYear() + "-" + time.getMonthOfYear();
+                return s;
+            case YMD:
+                String s1 = time.getYear() + "-" + time.getMonthOfYear() + "-" + time.getDayOfMonth();
+                return s1;
+            default:
+                return String.valueOf(time.getYear());
+        }
     }
 
     public Map mapify(String s) throws IOException {
diff --git a/src/test/java/MetaQuerySerializationTest.java b/src/test/java/MetaQuerySerializationTest.java
index 71ca546..c44d036 100644
--- a/src/test/java/MetaQuerySerializationTest.java
+++ b/src/test/java/MetaQuerySerializationTest.java
@@ -1,11 +1,13 @@
 import de.ids_mannheim.korap.query.serialize.MetaCollectionSerializer;
 import de.ids_mannheim.korap.query.serialize.MetaQuerySerializer;
+import org.joda.time.DateTime;
 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.LinkedHashMap;
 import java.util.Map;
 
 /**
@@ -16,19 +18,21 @@
 @RunWith(JUnit4.class)
 public class MetaQuerySerializationTest {
 
-    private MetaQuerySerializer serializer;
+    private MetaQuerySerializer querySerializer;
+    private MetaCollectionSerializer collSerializer;
 
     public MetaQuerySerializationTest() {
-        serializer = new MetaQuerySerializer();
+        querySerializer = new MetaQuerySerializer();
+        collSerializer = new MetaCollectionSerializer();
     }
 
     @Test
     public void test() throws IOException {
         Map<String, String> j = new HashMap();
         j.put("author", "Goethe");
-        j.put("pubPLace", "Erfurt");
+        j.put("pubPlace", "Erfurt");
         j.put("textClass", "wissenschaft");
-        String s = serializer.stringify(j);
+        String s = querySerializer.stringify(j, MetaQuerySerializer.TYPE.FILTER);
 //        System.out.println("value reference " + s);
     }
 
@@ -36,16 +40,23 @@
     public void testSingle() throws IOException {
         Map<String, String> j = new HashMap();
         j.put("textClass", "wissenschaft");
-        String s = serializer.stringify(j);
+        String s = querySerializer.stringify(j, MetaQuerySerializer.TYPE.FILTER);
 //        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);
+        String s = collSerializer.serialize("25");
+//        System.out.println(" --- RESULT JSON " + s);
+    }
 
-
+    @Test
+    public void testDates() throws IOException {
+        Map<String, String> queries = new LinkedHashMap<>();
+        queries.put("<pubDate", String.valueOf(new DateTime().getMillis()));
+        queries.put(">pubDate", String.valueOf(new DateTime().getMillis()+2));
+        queries.put("author", "Goethe");
+        String f = querySerializer.stringify(queries, MetaQuerySerializer.TYPE.FILTER);
+        System.out.println("value : "+ f);
     }
 }
