diff --git a/Changes b/Changes
index 0d38ee9..b7222e3 100644
--- a/Changes
+++ b/Changes
@@ -10,6 +10,7 @@
 - Add API version to the search service (#806)
 - Add API version to ResourceParser & ServiceInfo (#806)
 - Update Query QuerySerializer with API version in the test suite (#806)
+- Add API version to KoralCollectionQueryBuilder (#806)
 
 # version 0.79
 
diff --git a/src/main/java/de/ids_mannheim/korap/core/service/BasicService.java b/src/main/java/de/ids_mannheim/korap/core/service/BasicService.java
index da07290..cfd6e1c 100644
--- a/src/main/java/de/ids_mannheim/korap/core/service/BasicService.java
+++ b/src/main/java/de/ids_mannheim/korap/core/service/BasicService.java
@@ -51,9 +51,10 @@
         return user;
     }
     
-	protected String buildKoralQueryFromCorpusQuery (List<String> cqList)
-			throws KustvaktException {
-		KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
+	protected String buildKoralQueryFromCorpusQuery (List<String> cqList,
+			double apiVersion) throws KustvaktException {
+		KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder(
+				apiVersion);
 		String cq = combineMultipleCorpusQuery(cqList);
 		String json = null;
 		if (cq != null && !cq.isEmpty()) {
diff --git a/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java b/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
index 54452fa..aae79dd 100644
--- a/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
+++ b/src/main/java/de/ids_mannheim/korap/core/service/StatisticService.java
@@ -18,9 +18,10 @@
 	private RewriteHandler statisticsRewriteHandler;
 	
 	public String retrieveStatisticsForCorpusQuery (List<String> cqList,
-			String username, HttpHeaders headers) throws KustvaktException {
+			String username, HttpHeaders headers, double apiVersion) 
+					throws KustvaktException {
 
-		String json = buildKoralQueryFromCorpusQuery(cqList);
+		String json = buildKoralQueryFromCorpusQuery(cqList, apiVersion);
 		//System.out.println("Before:" + json + "\n");
 		if (!cqList.isEmpty() && !combineMultipleCorpusQuery(cqList).isEmpty()) {
 			User user = createUser(username, headers);
diff --git a/src/main/java/de/ids_mannheim/korap/core/web/controller/StatisticController.java b/src/main/java/de/ids_mannheim/korap/core/web/controller/StatisticController.java
index 998f48a..466fa24 100644
--- a/src/main/java/de/ids_mannheim/korap/core/web/controller/StatisticController.java
+++ b/src/main/java/de/ids_mannheim/korap/core/web/controller/StatisticController.java
@@ -22,9 +22,11 @@
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.container.ContainerRequestContext;
 import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.PathSegment;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.SecurityContext;
 
@@ -70,16 +72,22 @@
      */
 	@GET
 	public Response getStatistics (@Context SecurityContext securityContext,
+			@Context ContainerRequestContext requestContext,
 			@Context Locale locale, @Context HttpHeaders headers,
 			@QueryParam("cq") List<String> cq) {
 
+		List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
+        
 		TokenContext context = (TokenContext) securityContext
 				.getUserPrincipal();
 
         String stats;
         try {
 			stats = service.retrieveStatisticsForCorpusQuery(cq,
-					context.getUsername(), headers);
+					context.getUsername(), headers, apiVersion);
             if (DEBUG) {
                 jlog.debug("Stats: " + stats);
             }
diff --git a/src/main/java/de/ids_mannheim/korap/service/QueryService.java b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
index 264ae69..5c2bea7 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -110,37 +110,37 @@
         }
     }
 
-    public List<QueryDto> listOwnerQuery (String username, QueryType queryType)
-            throws KustvaktException {
+	public List<QueryDto> listOwnerQuery (String username, QueryType queryType,
+			double apiVersion) throws KustvaktException {
         List<QueryDO> list = queryDao.retrieveOwnerQuery(username, queryType);
-        return createQueryDtos(list, queryType);
+        return createQueryDtos(list, queryType, apiVersion);
     }
 
-    public List<QueryDto> listSystemQuery (QueryType queryType)
-            throws KustvaktException {
+	public List<QueryDto> listSystemQuery (QueryType queryType,
+			double apiVersion) throws KustvaktException {
         List<QueryDO> list = queryDao.retrieveQueryByType(ResourceType.SYSTEM,
                 null, queryType);
-        return createQueryDtos(list, queryType);
+        return createQueryDtos(list, queryType, apiVersion);
     }
 
     public List<QueryDto> listAvailableQueryForUser (String username,
-            QueryType queryType) throws KustvaktException {
+            QueryType queryType, double apiVersion) throws KustvaktException {
         List<QueryDO> list = queryDao.retrieveQueryByUser(username, queryType);
-        return createQueryDtos(list, queryType);
+        return createQueryDtos(list, queryType, apiVersion);
     }
 
     public List<QueryDto> listQueryByType (String createdBy, ResourceType type,
-            QueryType queryType) throws KustvaktException {
+            QueryType queryType, double apiVersion) throws KustvaktException {
 
         List<QueryDO> virtualCorpora = queryDao.retrieveQueryByType(type,
                 createdBy, queryType);
         Collections.sort(virtualCorpora);
-        return createQueryDtos(virtualCorpora, queryType);
+        return createQueryDtos(virtualCorpora, queryType, apiVersion);
 
     }
 
     private ArrayList<QueryDto> createQueryDtos (List<QueryDO> queryList,
-            QueryType queryType) throws KustvaktException {
+            QueryType queryType, double apiVersion) throws KustvaktException {
         ArrayList<QueryDto> dtos = new ArrayList<>(queryList.size());
         QueryDO query;
         Iterator<QueryDO> i = queryList.iterator();
@@ -152,7 +152,7 @@
 				if (query.isCached()) {
 					List<String> cqList = new ArrayList<>(1);
 					cqList.add("referTo " + query.getName());
-					json = buildKoralQueryFromCorpusQuery(cqList);
+					json = buildKoralQueryFromCorpusQuery(cqList, apiVersion);
 				}
 				else {
 					json = query.getKoralQuery();
@@ -232,7 +232,7 @@
         if (corpusQuery != null && !corpusQuery.isEmpty()) {
             koralQuery = serializeCorpusQuery(corpusQuery, apiVersion);
             requiredAccess = determineRequiredAccess(newQuery.isCached(),
-                    queryName, koralQuery);
+                    queryName, koralQuery, apiVersion);
         }
         else if (query != null && !query.isEmpty() && queryLanguage != null
                 && !queryLanguage.isEmpty()) {
@@ -302,7 +302,7 @@
         storeQuery(username, queryName, query.getType(), query.getQueryType(),
                 koralQuery, query.getDefinition(), query.getDescription(),
                 query.getStatus(), query.isCached(), queryCreator,
-                query.getQuery(), query.getQueryLanguage());
+                query.getQuery(), query.getQueryLanguage(), apiVersion);
     }
 
     private boolean checkNumberOfQueryLimit (String username,
@@ -337,17 +337,17 @@
             ResourceType type, QueryType queryType, String koralQuery,
             String definition, String description, String status,
             boolean isCached, String queryCreator, String query,
-            String queryLanguage) throws KustvaktException {
+            String queryLanguage, double apiVersion) throws KustvaktException {
         storeQuery(null, username, queryName, type, queryType, koralQuery,
                 definition, description, status, isCached, queryCreator, query,
-                queryLanguage);
+                queryLanguage, apiVersion);
     }
     
     public void storeQuery (QueryDO existingQuery, String username, String queryName,
             ResourceType type, QueryType queryType, String koralQuery,
             String definition, String description, String status,
             boolean isCached, String queryCreator, String query,
-            String queryLanguage) throws KustvaktException {
+            String queryLanguage, double apiVersion) throws KustvaktException {
         ParameterChecker.checkNameValue(queryName, "queryName");
         ParameterChecker.checkObjectValue(type, "type");
 
@@ -374,7 +374,7 @@
         CorpusAccess requiredAccess = CorpusAccess.FREE;
         if (queryType.equals(QueryType.VIRTUAL_CORPUS)) {
             requiredAccess = determineRequiredAccess(isCached, queryName,
-                    koralQuery);
+                    koralQuery, apiVersion);
         }
 
         if (DEBUG) {
@@ -445,10 +445,11 @@
     }
 
     public CorpusAccess determineRequiredAccess (boolean isCached, String name,
-            String koralQuery) throws KustvaktException {
+            String koralQuery, double apiVersion) throws KustvaktException {
 
         if (isCached) {
-            KoralCollectionQueryBuilder koral = new KoralCollectionQueryBuilder();
+            KoralCollectionQueryBuilder koral = 
+            		new KoralCollectionQueryBuilder(apiVersion);
             koral.with("referTo " + name);
             koralQuery = koral.toJSON();
             if (DEBUG) {
@@ -457,20 +458,23 @@
 
         }
 
-        if (findDocWithLicense(koralQuery, config.getAllOnlyRegex())) {
-            return CorpusAccess.ALL;
-        }
-        else if (findDocWithLicense(koralQuery, config.getPublicOnlyRegex())) {
-            return CorpusAccess.PUB;
+		if (findDocWithLicense(koralQuery, config.getAllOnlyRegex(),
+				apiVersion)) {
+			return CorpusAccess.ALL;
+		}
+		else if (findDocWithLicense(koralQuery, config.getPublicOnlyRegex(),
+				apiVersion)) {
+			return CorpusAccess.PUB;
         }
         else {
             return CorpusAccess.FREE;
         }
     }
 
-    private boolean findDocWithLicense (String koralQuery, String license)
-            throws KustvaktException {
-        KoralCollectionQueryBuilder koral = new KoralCollectionQueryBuilder();
+    private boolean findDocWithLicense (String koralQuery, String license, 
+    		double apiVersion) throws KustvaktException {
+        KoralCollectionQueryBuilder koral = 
+        		new KoralCollectionQueryBuilder(apiVersion);
         koral.setBaseQuery(koralQuery);
         koral.with("availability=/" + license + "/");
         String json = koral.toJSON();
@@ -694,7 +698,8 @@
     }
 
 	public QueryDto retrieveQueryByName (String username, String queryName,
-            String createdBy, QueryType queryType) throws KustvaktException {
+            String createdBy, QueryType queryType, double apiVersion) 
+            		throws KustvaktException {
         QueryDO query = searchQueryByName(username, queryName, createdBy,
                 queryType);
 
@@ -704,7 +709,7 @@
 			if (query.isCached()) {
 				List<String> cqList = new ArrayList<>(1);
 				cqList.add("referTo " + query.getName());
-				json = buildKoralQueryFromCorpusQuery(cqList);
+				json = buildKoralQueryFromCorpusQuery(cqList, apiVersion);
 			}
 			else { 
 				json = query.getKoralQuery();
diff --git a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
index 28e75e9..286920d 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
@@ -30,16 +30,18 @@
     private JsonNode base;
     private StringBuilder builder;
     private String mergeOperator;
+    private double apiVersion;
 
-    public KoralCollectionQueryBuilder () {
-        this(false);
+    public KoralCollectionQueryBuilder (double apiVersion) {
+        this(false, apiVersion);
     }
 
-    public KoralCollectionQueryBuilder (boolean verbose) {
+    public KoralCollectionQueryBuilder (boolean verbose, double apiVersion) {
         this.verbose = verbose;
         this.builder = new StringBuilder();
         this.base = null;
         this.mergeOperator = null;
+        this.apiVersion = apiVersion;
     }
 
     /**
@@ -102,7 +104,7 @@
         JsonNode request = null;
         if (this.builder.length() != 0) {
             CollectionQueryProcessor tree = new CollectionQueryProcessor(
-                    this.verbose);
+                    this.verbose, apiVersion);
             tree.process(this.builder.toString());
             if (tree.getErrors().size() > 0) {
                 // legacy support
@@ -143,11 +145,14 @@
     }
 
     public JsonNode mergeWith (JsonNode node) {
+    	String nodeName = (apiVersion >= 1.1) ? "corpus"
+				: "collection";
+    	
         if (this.base != null) {
             if (node != null) {
-                JsonNode tobase = node.at("/collection");
+                JsonNode tobase = node.at("/"+nodeName);
                 JsonNode base = this.base.deepCopy();
-                JsonNode result = base.at("/collection");
+                JsonNode result = base.at("/"+nodeName);
 
                 if (result.isMissingNode() && !tobase.isMissingNode())
                     result = tobase;
@@ -159,7 +164,7 @@
                                     ? this.mergeOperator.toLowerCase()
                                     : "and", result, tobase);
                 }
-                ((ObjectNode) base).put("collection", result);
+                ((ObjectNode) base).put(nodeName, result);
                 return base;
             }
             return this.base;
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java b/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
index faf2a73..97ffc41 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/QueryReferenceController.java
@@ -130,14 +130,21 @@
             DemoUserFilter.class})
     public QueryDto retrieveQueryByName (
             @Context SecurityContext securityContext,
+            @Context ContainerRequestContext requestContext,
             @PathParam("createdBy") String createdBy,
             @PathParam("qName") String qName) {
+    	
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
             return service.retrieveQueryByName(context.getUsername(), qName,
-                    createdBy, QueryType.QUERY);
+                    createdBy, QueryType.QUERY, apiVersion);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
@@ -194,13 +201,19 @@
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public List<QueryDto> listAvailableQuery (
             @Context SecurityContext securityContext,
+            @Context ContainerRequestContext requestContext,
             @QueryParam("username") String username) {
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
             List<QueryDto> dtos = service.listAvailableQueryForUser(
-                    context.getUsername(), QueryType.QUERY);
+                    context.getUsername(), QueryType.QUERY, apiVersion);
             return dtos;
         }
         catch (KustvaktException e) {
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusAdminController.java b/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusAdminController.java
index 0613a47..86ef738 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusAdminController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusAdminController.java
@@ -20,7 +20,10 @@
 import jakarta.ws.rs.POST;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.PathSegment;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 
@@ -66,11 +69,16 @@
     @Path("list")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
     public List<QueryDto> listVCByType (
+    		@Context ContainerRequestContext requestContext,
             @FormParam("createdBy") String createdBy,
             @FormParam("type") ResourceType type) {
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
         try {
             return service.listQueryByType(createdBy, type,
-                    QueryType.VIRTUAL_CORPUS);
+                    QueryType.VIRTUAL_CORPUS, apiVersion);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java b/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
index 1374278..418b542 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/VirtualCorpusController.java
@@ -150,14 +150,19 @@
     @ResourceFilters({ APIVersionFilter.class, AuthenticationFilter.class,
             DemoUserFilter.class})
     public QueryDto retrieveVCByName (@Context SecurityContext securityContext,
+    		@Context ContainerRequestContext requestContext,
             @PathParam("createdBy") String createdBy,
             @PathParam("vcName") String vcName) {
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
+        List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
             return service.retrieveQueryByName(context.getUsername(), vcName,
-                    createdBy, QueryType.VIRTUAL_CORPUS);
+                    createdBy, QueryType.VIRTUAL_CORPUS, apiVersion);
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
@@ -227,21 +232,27 @@
      */
     @GET
     public List<QueryDto> listAvailableVC (
+    		@Context ContainerRequestContext requestContext,
             @Context SecurityContext securityContext,
             @QueryParam("filter-by") String filter) {
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
+        List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
 
         try {
             scopeService.verifyScope(context, OAuth2Scope.VC_INFO);
             if (filter != null && !filter.isEmpty()) {
                 filter = filter.toLowerCase();
                 if (filter.equals("system")) {
-                    return service.listSystemQuery(QueryType.VIRTUAL_CORPUS);
+                    return service.listSystemQuery(QueryType.VIRTUAL_CORPUS, 
+                    		apiVersion);
                 }
                 else if (filter.equals("own")) {
                     return service.listOwnerQuery(context.getUsername(),
-                            QueryType.VIRTUAL_CORPUS);
+                            QueryType.VIRTUAL_CORPUS, apiVersion);
                 }
                 else {
                     throw new KustvaktException(StatusCodes.UNSUPPORTED_VALUE,
@@ -250,7 +261,7 @@
             }
             else {
                 return service.listAvailableQueryForUser(context.getUsername(),
-                        QueryType.VIRTUAL_CORPUS);
+                        QueryType.VIRTUAL_CORPUS, apiVersion);
             }
         }
         catch (KustvaktException e) {
diff --git a/src/test/java/de/ids_mannheim/korap/misc/CollectionQueryBuilderTest.java b/src/test/java/de/ids_mannheim/korap/misc/CollectionQueryBuilderTest.java
index 7b6c89b..ca675cf 100644
--- a/src/test/java/de/ids_mannheim/korap/misc/CollectionQueryBuilderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/misc/CollectionQueryBuilderTest.java
@@ -20,7 +20,7 @@
 	
     @Test
     public void testsimpleAdd () throws KustvaktException {
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.with("corpusSigle=WPD");
         JsonNode node = JsonUtils.readTree(b.toJSON());
         assertNotNull(node);
@@ -30,7 +30,7 @@
 
     @Test
     public void testSimpleConjunction () throws KustvaktException {
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.with("corpusSigle=WPD & textClass=freizeit");
         JsonNode node = JsonUtils.readTree(b.toJSON());
         assertNotNull(node);
@@ -45,7 +45,7 @@
 
     @Test
     public void testSimpleDisjunction () throws KustvaktException {
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.with("corpusSigle=WPD | textClass=freizeit");
         JsonNode node = JsonUtils.readTree(b.toJSON());
         assertNotNull(node);
@@ -58,7 +58,7 @@
 
     @Test
     public void testComplexSubQuery () throws KustvaktException {
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.with("(corpusSigle=WPD) | (textClass=freizeit & corpusSigle=BRZ13)");
         JsonNode node = JsonUtils.readTree(b.toJSON());
         assertNotNull(node);
@@ -71,9 +71,9 @@
 
     @Test
     public void testAddResourceQueryAfter () throws KustvaktException {
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.with("(textClass=politik & title=\"random title\") | textClass=wissenschaft");
-        KoralCollectionQueryBuilder c = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder c = new KoralCollectionQueryBuilder(apiVersion);
         c.setBaseQuery(b.toJSON());
         c.with("corpusSigle=WPD");
         JsonNode node = JsonUtils.readTree(c.toJSON());
@@ -98,9 +98,9 @@
 
     @Test
     public void testAddComplexResourceQueryAfter () throws KustvaktException {
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.with("(title=\"random title\") | (textClass=wissenschaft)");
-        KoralCollectionQueryBuilder c = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder c = new KoralCollectionQueryBuilder(apiVersion);
         c.setBaseQuery(b.toJSON());
         c.with("(corpusSigle=BRZ13 | corpusSigle=AZPS)");
         JsonNode node = JsonUtils.readTree(c.toJSON());
@@ -130,7 +130,7 @@
         QuerySerializer check = new QuerySerializer(apiVersion);
         check.setQuery(query, "poliqarp");
         check.setCollection(coll);
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.setBaseQuery(check.toJSON());
         b.with("textClass=freizeit");
         JsonNode res = (JsonNode) b.rebaseCollection();
@@ -157,9 +157,9 @@
 
     @Test
     public void testBaseQueryBuild () throws KustvaktException {
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.with("(corpusSigle=ADF) | (textClass=freizeit & corpusSigle=WPD)");
-        KoralCollectionQueryBuilder c = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder c = new KoralCollectionQueryBuilder(apiVersion);
         c.setBaseQuery(b.toJSON());
         c.with("corpusSigle=BRZ13");
         JsonNode base = (JsonNode) c.rebaseCollection();
@@ -180,9 +180,9 @@
         QuerySerializer check = new QuerySerializer(apiVersion);
         check.setQuery(query, "poliqarp");
         check.setCollection(coll);
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.setBaseQuery(check.toJSON());
-        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder(apiVersion);
         test.with("textClass=wissenschaft | textClass=politik");
         JsonNode node = (JsonNode) test.rebaseCollection();
         node = b.mergeWith(node);
@@ -198,9 +198,9 @@
         String query = "[base=Haus]";
         QuerySerializer check = new QuerySerializer(apiVersion);
         check.setQuery(query, "poliqarp");
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.setBaseQuery(check.toJSON());
-        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder(apiVersion);
         test.with("corpusSigle=WPD");
         // String json = test.toJSON();
         // System.out.println(json);
@@ -217,9 +217,9 @@
         String query = "[base=Haus]";
         QuerySerializer check = new QuerySerializer(apiVersion);
         check.setQuery(query, "poliqarp");
-        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder b = new KoralCollectionQueryBuilder(apiVersion);
         b.setBaseQuery(check.toJSON());
-        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder(apiVersion);
         // operator is not supposed to be here!
         test.and().with("corpusSigle=WPD");
         // String json = test.toJSON();
@@ -241,7 +241,7 @@
         QuerySerializer check = new QuerySerializer(apiVersion);
         check.setQuery(query, "poliqarp");
         check.setCollection(coll);
-        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder(apiVersion);
         test.setBaseQuery(check.toJSON());
         test.or().with("textClass=wissenschaft | textClass=politik");
         JsonNode node = (JsonNode) test.rebaseCollection();
@@ -258,7 +258,7 @@
         QuerySerializer check = new QuerySerializer(apiVersion);
         check.setQuery(query, "poliqarp");
         check.setCollection(coll);
-        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder(apiVersion);
         test.setBaseQuery(check.toJSON());
         test.and().with("textClass=wissenschaft | textClass=politik");
         JsonNode node = (JsonNode) test.rebaseCollection();
@@ -276,7 +276,7 @@
         QuerySerializer check = new QuerySerializer(apiVersion);
         check.setQuery(query, "poliqarp");
         check.setCollection(coll);
-        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder test = new KoralCollectionQueryBuilder(apiVersion);
         test.setBaseQuery(check.toJSON());
         test.with("textClass=wissenschaft | textClass=politik");
         JsonNode node = (JsonNode) test.rebaseCollection();
@@ -292,9 +292,9 @@
         // base is missing collection segment
         QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[base=Haus]", "poliqarp");
-        KoralCollectionQueryBuilder total = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder total = new KoralCollectionQueryBuilder(apiVersion);
         total.setBaseQuery(s.toJSON());
-        KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder(apiVersion);
         builder.with("textClass=politik & corpusSigle=WPD");
         JsonNode node = total.and()
                 .mergeWith((JsonNode) builder.rebaseCollection());
@@ -318,9 +318,11 @@
         QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[base=Haus]", "poliqarp");
         s.setCollection("textClass=wissenschaft");
-        KoralCollectionQueryBuilder total = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder total = 
+        		new KoralCollectionQueryBuilder(apiVersion);
         total.setBaseQuery(s.toJSON());
-        KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder builder = 
+        		new KoralCollectionQueryBuilder(apiVersion);
         JsonNode node = total.and()
                 .mergeWith((JsonNode) builder.rebaseCollection());
         assertNotNull(node);
