diff --git a/src/test/java/CollectionQueryTreeTest.java b/src/test/java/CollectionQueryTreeTest.java
new file mode 100644
index 0000000..81f6eee
--- /dev/null
+++ b/src/test/java/CollectionQueryTreeTest.java
@@ -0,0 +1,85 @@
+import de.ids_mannheim.korap.query.serialize.CollectionQueryBuilder;
+import de.ids_mannheim.korap.query.serialize.CollectionQueryBuilder2;
+import de.ids_mannheim.korap.query.serialize.CollectionQueryTree;
+import de.ids_mannheim.korap.resource.Relation;
+import de.ids_mannheim.korap.util.QueryException;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import de.ids_mannheim.korap.utils.TimeUtils;
+import org.junit.Test;
+
+public class CollectionQueryTreeTest {
+
+    CollectionQueryTree ef;
+    String map;
+    private String query;
+
+    private boolean equalsQueryContent(String res, String query) throws QueryException {
+        res = res.replaceAll(" ", "");
+        ef = new CollectionQueryTree();
+        ef.process(query);
+        String queryMap = ef.getRequestMap().get("query").toString().replaceAll(" ", "");
+        return res.equals(queryMap);
+    }
+
+    @Test
+    public void testSimple() throws QueryException {
+        query = "textClass=Sport";
+        String regex1 = "{@type=korap:filter, filter={@type=korap:term, attribute=textClass, key=Sport, match=match:eq}}";
+        ef = new CollectionQueryTree();
+        ef.process(query);
+        map = JsonUtils.toJSON(ef.getRequestMap());
+//		assertEquals(regex1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+        System.out.println("THE QUERY: " + map);
+    }
+
+
+    @Test
+    public void testComplex() throws QueryException {
+        query = "(textClass=Sport | textClass=ausland) & corpusID=WPD";
+        String regex1 = "{@type=korap:filter, filter={@type=korap:term, attribute=textClass, key=Sport, match=match:eq}}";
+        ef = new CollectionQueryTree();
+        ef.process(query);
+        map = JsonUtils.toJSON(ef.getRequestMap());
+//		assertEquals(regex1.replaceAll(" ", ""), map.replaceAll(" ", ""));
+        System.out.println("THE QUERY 1: " + map);
+    }
+
+    @Test
+    public void testBuilder() throws QueryException {
+        CollectionQueryBuilder2 builder = new CollectionQueryBuilder2();
+        builder.setQuery("(textClass=Sport | textClass=ausland) & corpusID=WPD");
+        System.out.println("BUILDER RESULT: " + builder.toJSON());
+    }
+
+    @Test
+    public void testSimpleBuilder() {
+        CollectionQueryBuilder b = new CollectionQueryBuilder();
+        b.addMetaFilter("corpusID", "WPD");
+        b.addMetaFilter("textClass", "wissenschaft");
+        b.setFilterAttributeRelation(Relation.AND);
+        System.out.println("SIMPLE BUILDER RESULT: " + b.toCollections());
+    }
+
+    // old builder pubDate query
+    @Test
+    public void testDateQuery() {
+        CollectionQueryBuilder b = new CollectionQueryBuilder();
+        String query = "pubDate=>" + TimeUtils.getNow().getMillis();
+        query = query + " AND pubDate=<" + TimeUtils.getNow().getMillis();
+        b.addMetaFilterQuery(query);
+        b.setFilterAttributeRelation(Relation.AND);
+        System.out.println("FINAL RESOURCE: " + b.toCollections());
+    }
+
+    @Test
+    public void testDateNewQuery() throws QueryException {
+        // search for pubDate between 1990 and 2010!
+        String query = "1990<pubDate<2010 & genre=Sport";
+        CollectionQueryBuilder2 q = new CollectionQueryBuilder2();
+        q.setQuery(query);
+        System.out.println("DATE QUERY RESULT: " + q.toJSON());
+    }
+
+
+}
+
diff --git a/src/test/java/ExpertFilterTest.java b/src/test/java/ExpertFilterTest.java
deleted file mode 100644
index 1182f93..0000000
--- a/src/test/java/ExpertFilterTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-import static org.junit.Assert.*;
-
-import org.junit.Test;
-
-import de.ids_mannheim.korap.query.serialize.ExpertFilter;
-import de.ids_mannheim.korap.util.QueryException;
-
-public class ExpertFilterTest {
-	
-	ExpertFilter ef;
-	String map;
-	private String query;
-
-	private boolean equalsQueryContent(String res, String query) throws QueryException {
-		res = res.replaceAll(" ", "");
-		ef = new ExpertFilter();
-		ef.process(query);
-		String queryMap = ef.getRequestMap().get("query").toString().replaceAll(" ", "");
-		return res.equals(queryMap);
-	}
-	
-	@Test
-	public void testSimple() throws QueryException {
-		query = "textClass=Sport";
-		String regex1 = "{@type=korap:filter, filter={@type=korap:term, attribute=textClass, key=Sport, match=match:eq}}";
-		ef = new ExpertFilter();
-		ef.process(query);
-		map = ef.getRequestMap().toString();
-		assertEquals(regex1.replaceAll(" ", ""), map.replaceAll(" ", ""));
-	}
-	
-	
-}
-
