diff --git a/Changes b/Changes
index 31334b6..23235d7 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,21 @@
+# version 0.80-SNAPSHOT
+
+- Introduced APIDeprecationFilter (#759)
+- Deprecated matchInfo web-service has been removed for API v1.1.
+- Remove deprecated Authorization Post web-service for API v1.1 (#767)
+- Remove deprecated user-group web-services for API v1.1 (#769)
+- Remove deprecated vc web-services for API v1.1 (#771)
+- Remove deprecated authorized_only parameter in the client list API for v1.1 (#760)
+- Add API version to the QueryService (#806)
+- 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)
+- Clean up collection node from Krill response (#806)
+- Add API version to NamedVCLoader (#806)
+- Add corpus support at VirtualCorpusRewrite (#806)
+- Add apiVersion to rewrite (#806)
+
 # version 0.79.1
 
 - Bug fixes & Spring 6.2.11 upgrade (kupietz)
diff --git a/pom.xml b/pom.xml
index bcb7165..fdec52f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.ids-mannheim.korap.kustvakt</groupId>
 	<artifactId>Kustvakt</artifactId>
-	<version>0.79.1</version>
+	<version>0.80-SNAPSHOT</version>
 	<properties>
 		<java.version>17</java.version>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -18,7 +18,7 @@
 		<flyway.version>11.13.2</flyway.version>
 		<log4j.version>2.25.2</log4j.version>
 		<krill.version>[0.64.4,)</krill.version>
-		<koral.version>0.46</koral.version>
+		<koral.version>[0.47,)</koral.version>
 		<!-- Align JBoss Logging with Hibernate Validator 9 requirements -->
 		<jboss.logging.version>3.6.1.Final</jboss.logging.version>
 	</properties>
@@ -611,6 +611,11 @@
 			<artifactId>commons-text</artifactId>
 			<version>1.14.0</version>
 		</dependency>
+		<dependency>
+		  <groupId>org.apache.commons</groupId>
+		  <artifactId>commons-lang3</artifactId>
+		  <version>3.18.0</version>
+		</dependency>
 
 		<!-- LDAP -->
 		<dependency>
diff --git a/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java b/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java
index 7f741a1..fb9eed0 100644
--- a/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java
+++ b/src/main/java/de/ids_mannheim/korap/annotation/ResourceParser.java
@@ -44,6 +44,8 @@
     public static String RESOURCE_FILE = "resources.json";
     public static ObjectMapper mapper = new ObjectMapper();
 
+    private double apiVersion = 1.0;
+    
     public void run () throws IOException, KustvaktException {
         InputStream is = null;
         File f = new File("data/"+RESOURCE_FILE);
@@ -69,11 +71,11 @@
             if (requiredAccess.isEmpty()){
 				if (!corpusQuery.isEmpty()) {
 					String koralQuery = queryService
-							.serializeCorpusQuery(corpusQuery);
+							.serializeCorpusQuery(corpusQuery, apiVersion);
 					// assume all vc are not cached and use the given koralQuery
 					// for cached-vc, the koralQuery should contain referTo
 					CorpusAccess access = queryService.determineRequiredAccess(
-							false, resourceId, koralQuery);
+							false, resourceId, koralQuery, apiVersion);
 					requiredAccess = access.name();
 				}
             }
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/SearchService.java b/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
index 4f96816..4624720 100644
--- a/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
+++ b/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
@@ -80,9 +80,10 @@
     @SuppressWarnings("unchecked")
     public String serializeQuery (String q, String ql, String v, String cq,
             Integer pageIndex, Integer startPage, Integer pageLength,
-            String context, Boolean cutoff, boolean accessRewriteDisabled)
+            String context, Boolean cutoff, boolean accessRewriteDisabled,
+            double apiVersion)
             throws KustvaktException {
-        QuerySerializer ss = new QuerySerializer().setQuery(q, ql, v);
+        QuerySerializer ss = new QuerySerializer(apiVersion).setQuery(q, ql, v);
         if (cq != null)
             ss.setCollection(cq);
 
@@ -101,11 +102,12 @@
         // return ss.toJSON();
 
         String query = ss.toJSON();
-        query = rewriteHandler.processQuery(ss.toJSON(), null);
+        query = rewriteHandler.processQuery(ss.toJSON(), null, apiVersion);
         return query;
     }
 
-    public String search (String jsonld, String username, HttpHeaders headers)
+    public String search (String jsonld, String username, HttpHeaders headers, 
+    		double apiVersion)
             throws KustvaktException {
 
         User user = createUser(username, headers);
@@ -116,7 +118,7 @@
             user.setCorpusAccess(CorpusAccess.ALL);
         }
 
-        String query = this.rewriteHandler.processQuery(jsonld, user);
+        String query = this.rewriteHandler.processQuery(jsonld, user, apiVersion);
         // MH: todo: should be possible to add the meta part to
         // the query serialization
         // User user = controller.getUser(ctx.getUsername());
@@ -125,7 +127,8 @@
     }
 
     @SuppressWarnings("unchecked")
-	public String search (String engine, String username, HttpHeaders headers,
+	public String search (double apiVersion, String engine, 
+			String username, HttpHeaders headers,
 			String q, String ql, String v, List<String> cqList, String fields,
 			String pipes, String responsePipes, Integer pageIndex,
 			Integer pageInteger, String ctx, Integer pageLength, Boolean cutoff,
@@ -147,7 +150,7 @@
             user.setCorpusAccess(CorpusAccess.ALL);
         }
 
-        QuerySerializer serializer = new QuerySerializer();
+        QuerySerializer serializer = new QuerySerializer(apiVersion);
         serializer.setQuery(q, ql, v);
         String cq = combineMultipleCorpusQuery(cqList);
         if (cq != null)
@@ -168,7 +171,6 @@
         }
 
         String query = serializer.toJSON();
-
         if (accessRewriteDisabled && showTokens) {
             query = addWarning(query, StatusCodes.NOT_ALLOWED,
                     "Tokens cannot be shown without access.");
@@ -177,7 +179,7 @@
         // Query pipe rewrite
         query = runPipes(query, pipes);
 
-        query = this.rewriteHandler.processQuery(query, user);
+        query = this.rewriteHandler.processQuery(query, user, apiVersion);
         if (DEBUG) {
             jlog.debug("the serialized query " + query);
         }
@@ -187,7 +189,7 @@
         if (config.isTotalResultCacheEnabled() && !hasCutOff) {
             query = precheckTotalResultCache(hashedKoralQuery, query);
         }
-
+        
         KustvaktConfiguration.BACKENDS searchEngine = this.config
                 .chooseBackend(engine);
         String result;
@@ -210,12 +212,27 @@
             result = removeCutOff(result);
         }
         
+        checkApiVersion(result, apiVersion);
+        
         // Response pipe rewrite
         result = runPipes(result, responsePipes);
         return result;
 
     }
     
+    private String checkApiVersion (String result, double apiVersion) 
+    		throws KustvaktException {
+    	ObjectNode resultNode = (ObjectNode) JsonUtils.readTree(result);
+    	if (apiVersion >=1.1) {
+    		resultNode.remove("collection");
+    	}
+    	else {
+    		resultNode.remove("corpus");
+            // add API deprecation warning ?
+    	}
+        return resultNode.toString();
+	}
+    
     private String removeCutOff (String result) throws KustvaktException {
         ObjectNode resultNode = (ObjectNode) JsonUtils.readTree(result);
         ObjectNode meta = (ObjectNode) resultNode.at("/meta");
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..173981b 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,13 +18,14 @@
 	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);
-			json = statisticsRewriteHandler.processQuery(json, user);
+			json = statisticsRewriteHandler.processQuery(json, user, apiVersion);
 		}
 		//System.out.println("After:" + json);
 		String stats = searchKrill.getStatistics(json);
diff --git a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
index 19aea8e..e2613ce 100644
--- a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
+++ b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
@@ -23,6 +23,7 @@
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.utils.ServiceInfo;
 import de.ids_mannheim.korap.web.KustvaktResponseHandler;
+import de.ids_mannheim.korap.web.filter.APIDeprecationFilter;
 import de.ids_mannheim.korap.web.filter.APIVersionFilter;
 import de.ids_mannheim.korap.web.filter.AdminFilter;
 import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
@@ -37,9 +38,11 @@
 import jakarta.ws.rs.PathParam;
 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;
 
@@ -126,6 +129,7 @@
     //    @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public Response serializeQuery (@Context Locale locale,
             @Context SecurityContext securityContext, @QueryParam("q") String q,
+            @Context ContainerRequestContext requestContext,
             @QueryParam("ql") String ql, @QueryParam("v") String v,
             @QueryParam("context") String context,
             @QueryParam("cutoff") Boolean cutoff,
@@ -134,12 +138,18 @@
             @QueryParam("page") Integer startPage,
             @QueryParam("access-rewrite-disabled") boolean accessRewriteDisabled,
             @QueryParam("cq") String cq) {
+    	
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double apiVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext ctx = (TokenContext) securityContext.getUserPrincipal();
         try {
             scopeService.verifyScope(ctx, OAuth2Scope.SERIALIZE_QUERY);
             String result = searchService.serializeQuery(q, ql, v, cq,
                     pageIndex, startPage, pageLength, context, cutoff,
-                    accessRewriteDisabled);
+                    accessRewriteDisabled, apiVersion);
             if (DEBUG) {
                 jlog.debug("Query: " + result);
             }
@@ -156,6 +166,7 @@
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     //@SearchResourceFilters
     public Response searchPost (@Context SecurityContext context,
+    		@Context ContainerRequestContext requestContext,
             @Context Locale locale, @Context HttpHeaders headers,
             String jsonld) {
 
@@ -163,11 +174,16 @@
             jlog.debug("Serialized search: " + jsonld);
         }
 
+        List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext ctx = (TokenContext) context.getUserPrincipal();
         try {
             scopeService.verifyScope(ctx, OAuth2Scope.SEARCH);
             String result = searchService.search(jsonld, ctx.getUsername(),
-                    headers);
+                    headers, requestedVersion);
             return Response.ok(result).build();
         }
         catch (KustvaktException e) {
@@ -216,6 +232,7 @@
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     //@SearchResourceFilters
     public Response searchGet (@Context SecurityContext securityContext,
+    		@Context ContainerRequestContext requestContext,
             @Context HttpServletRequest request, @Context HttpHeaders headers,
             @Context Locale locale, @QueryParam("q") String q,
             @QueryParam("ql") String ql, @QueryParam("v") String v,
@@ -233,13 +250,19 @@
             @QueryParam("cq") List<String> cq,
             @QueryParam("engine") String engine) {
 
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
 
         String result;
         try {
             scopeService.verifyScope(context, OAuth2Scope.SEARCH);
-            result = searchService.search(engine, context.getUsername(),
+            result = searchService.search(requestedVersion, 
+            		engine, context.getUsername(),
                     headers, q, ql, v, cq, fields, pipes, responsePipes, 
                     pageIndex, pageInteger, ctx, pageLength, cutoff, 
                     accessRewriteDisabled, showTokens, showSnippet);
@@ -257,6 +280,8 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
     @Path("{version}/corpus/{corpusId}/{docId}/{textId}/{matchId}/matchInfo")
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, DemoUserFilter.class})
     //@SearchResourceFilters
     public Response getMatchInfo (@Context SecurityContext ctx,
             @Context HttpHeaders headers, @Context Locale locale,
@@ -315,7 +340,7 @@
 
     @GET
     @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
-    @Path("{version}/corpus/{corpusId}/{docId}/{textId}/{matchId}")
+    @Path("{version}/corpus/{corpusId}/{docId}/{textId}/{matchId}")    
     //@SearchResourceFilters
     public Response retrieveMatchInfo (@Context SecurityContext ctx,
             @Context HttpHeaders headers, @Context Locale locale,
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/init/Initializator.java b/src/main/java/de/ids_mannheim/korap/init/Initializator.java
index 02a141d..e2fddc3 100644
--- a/src/main/java/de/ids_mannheim/korap/init/Initializator.java
+++ b/src/main/java/de/ids_mannheim/korap/init/Initializator.java
@@ -44,6 +44,8 @@
     private OAuth2InitClientService clientService;
     @Autowired
     private QueryService queryService;
+    
+    private double apiVersion = 1.1;
 
     public Initializator () {}
 
@@ -58,6 +60,7 @@
                     OAuth2InitClientService.OUTPUT_FILENAME);
         }
 
+        vcLoader.apiVersion = apiVersion;
         Thread t = new Thread(vcLoader);
         t.start();
     }
@@ -70,6 +73,7 @@
 		if (config.createInitialSuperClient()) {
 			clientService.createInitialTestSuperClient();
 		}
+		vcLoader.apiVersion = apiVersion;
 		vcLoader.loadVCToCache("system-vc", "/vc/system-vc.jsonld");
 		adminDao.addAccount(new KorAPUser("admin"));
 		
@@ -79,7 +83,8 @@
 		q.setQuery("[]");
 		q.setDescription("\"system\" query");
 		q.setQueryType(QueryType.QUERY);
-		queryService.handlePutRequest("system", "system", "system-q", q);
+		queryService.handlePutRequest("system", "system", "system-q", q, 
+				apiVersion);
 	}
 
     public void initResourceTest () throws IOException, KustvaktException {
diff --git a/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java b/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
index 294c7f8..55c10f6 100644
--- a/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
@@ -54,6 +54,8 @@
 
     public static Logger jlog = LogManager.getLogger(NamedVCLoader.class);
     public static boolean DEBUG = false;
+    
+    public double apiVersion;
 
     @Override
     public void run () {
@@ -69,11 +71,11 @@
         }
     }
 
-    public void loadVCToCache (String filename, String filePath)
-            throws IOException, QueryException, KustvaktException {
-        loadVCToCache(filename,filePath,null);
-    }
-    
+	public void loadVCToCache (String filename, String filePath)
+			throws IOException, QueryException, KustvaktException {
+		loadVCToCache(filename, filePath, null);
+	}
+
     /**
      * Used for testing
      * 
@@ -83,14 +85,14 @@
      * @throws QueryException
      * @throws KustvaktException
      */
-    public void loadVCToCache (String filename, String filePath, String json)
-            throws IOException, QueryException {
+    public void loadVCToCache (String filename, String filePath, String json) 
+    		throws IOException, QueryException {
 
         if (json==null || json.isEmpty()) {
             InputStream is = NamedVCLoader.class.getResourceAsStream(filePath);
             json = IOUtils.toString(is, "utf-8");
         }
-        processVC(filename, json);
+        processVC(filename, json, apiVersion);
     }
 
     public void loadVCToCache () throws IOException, QueryException {
@@ -116,7 +118,7 @@
             filename = strArr[0];
             String json = strArr[1];
             if (json != null) {
-                processVC(filename, json);
+                processVC(filename, json, this.apiVersion);
             }
         }
     }
@@ -142,7 +144,7 @@
      * @throws IOException
      * @throws QueryException
      */
-    private void processVC (String vcId, String json)
+    private void processVC (String vcId, String json, double apiVersion)
             throws IOException, QueryException {
         boolean updateCache = false;
         try {
@@ -155,13 +157,13 @@
             if (json.hashCode() != koralQuery.hashCode()) {
                 updateCache = true;
                 // updateVCinDB
-                storeVCinDB(vcId, json, existingVC);
+                storeVCinDB(vcId, json, existingVC, apiVersion);
             }
         }
         catch (KustvaktException e) {
             // VC doesn't exist in the DB
             if (e.getStatusCode() == StatusCodes.NO_RESOURCE_FOUND) {
-                storeVCinDB(vcId, json, null);
+                storeVCinDB(vcId, json, null, apiVersion);
             }
             else {
                 throw new RuntimeException(e);
@@ -244,14 +246,15 @@
      * @param vcId
      * @param koralQuery
      */
-    private void storeVCinDB (String vcId, String koralQuery, QueryDO existingVC) {
+    private void storeVCinDB (String vcId, String koralQuery, 
+    		QueryDO existingVC, double apiVersion) {
         try {
             String info = (existingVC == null) ? "Storing" : "Updating";
             jlog.info("{} {} in the database ", info, vcId);
             
             vcService.storeQuery(existingVC, "system", vcId, ResourceType.SYSTEM,
                     QueryType.VIRTUAL_CORPUS, koralQuery, null, null, null,
-                    true, "system", null, null);
+                    true, "system", null, null, apiVersion);
         }
         catch (Exception e) {
             jlog.error("Failed storing VC: "+vcId, e);
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java
index 934efd0..764abc8 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/AvailabilityRewrite.java
@@ -3,7 +3,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.text.CaseUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
@@ -44,7 +43,7 @@
 public class AvailabilityRewrite implements RewriteTask.RewriteQuery {
 
     public static Logger jlog = LogManager.getLogger(AvailabilityRewrite.class);
-
+    
     public AvailabilityRewrite () {
         super();
     }
@@ -104,10 +103,11 @@
         return actualAvailabilities;
     }
 
-    @Override
-    public KoralNode rewriteQuery (KoralNode koralNode, KustvaktConfiguration config,
-            User user) throws KustvaktException {
-        JsonNode jsonNode = koralNode.rawNode();
+	@Override
+	public KoralNode rewriteQuery (KoralNode koralNode,
+			KustvaktConfiguration config, User user, double apiVersion) 
+			throws KustvaktException {
+		JsonNode jsonNode = koralNode.rawNode();
 
         FullConfiguration fullConfig = (FullConfiguration) config;
         CorpusAccess corpusAccess = user.getCorpusAccess();
@@ -117,16 +117,21 @@
 
         String availabilityQuery = getCorpusQuery(corpusAccess, fullConfig);
         
-        if (jsonNode.has("collection")) {
+        String collectionNodeName = (apiVersion >= 1.1) ? "corpus"
+				: "collection";
+        
+        if (jsonNode.has(collectionNodeName)) {
             if (jsonNode.toString().contains("availability")) {
             	List<String> actualAvalability = new ArrayList<>();
                 actualAvalability.addAll(availabilityRules);
 
-                actualAvalability = checkAvailability(jsonNode.at("/collection"),
-                		availabilityRules, actualAvalability, false);
-                if (!actualAvalability.isEmpty()) {
-                	createOperationAnd(availabilityQuery, jsonNode,
-    						corpusAccessName, koralNode);
+				actualAvalability = checkAvailability(
+						jsonNode.at("/" + collectionNodeName),
+						availabilityRules, actualAvalability, false);
+				if (!actualAvalability.isEmpty()) {
+					createOperationAnd(availabilityQuery, jsonNode,
+							corpusAccessName, koralNode, apiVersion,
+							collectionNodeName);
                 	
 //                    builder.with(availabilityQuery);
 //                    builder.setBaseQuery(builder.toJSON());
@@ -136,45 +141,49 @@
 			}
 			else {
 				createOperationAnd(availabilityQuery, jsonNode,
-						corpusAccessName, koralNode);
+						corpusAccessName, koralNode, apiVersion,
+						collectionNodeName);
 			}
         }
 		else {
 			KoralCollectionQueryBuilder builder = 
-					new KoralCollectionQueryBuilder();
+					new KoralCollectionQueryBuilder(apiVersion);
 			builder.with(availabilityQuery);
 			JsonNode rewrittenNode = JsonUtils.readTree(builder.toJSON())
-					.at("/collection");
+					.at("/"+collectionNodeName);
 			
 			RewriteIdentifier identifier = new RewriteIdentifier(null, null,
-						corpusAccessName + " corpus access policy has been added.");
-			koralNode.set("collection", rewrittenNode, identifier);
+					corpusAccessName + " corpus access policy has been added.");
+			koralNode.set(collectionNodeName, rewrittenNode, identifier);
 		}
 
-        koralNode = koralNode.at("/collection");
+        koralNode = koralNode.at("/"+collectionNodeName);
         return koralNode;
     }
     
     private void createOperationAnd (String availabilityQuery,
-			JsonNode jsonNode, String corpusAccessName, KoralNode node)
+			JsonNode jsonNode, String corpusAccessName, KoralNode node,
+			double apiVersion, String collectionNodeName)
 			throws KustvaktException {
 
 		KoralCollectionQueryBuilder availabilityBuilder = 
-				new KoralCollectionQueryBuilder();
+				new KoralCollectionQueryBuilder(apiVersion);
 		availabilityBuilder.with(availabilityQuery);
 		JsonNode availabilityNode = JsonUtils
 				.readTree(availabilityBuilder.toJSON());
 
-		String source = jsonNode.at("/collection").toString();
+		String source = jsonNode.at("/"+collectionNodeName).toString();
 		JsonNode sourceNode = JsonUtils.readTree(source);
 
-		KoralCollectionQueryBuilder builder = new KoralCollectionQueryBuilder();
-		// Base query must contains collection
+		KoralCollectionQueryBuilder builder = 
+				new KoralCollectionQueryBuilder(apiVersion);
+		// Base query must contains collection or corpus node
 		builder.setBaseQuery(availabilityNode);
-		JsonNode rewrittenNode = builder.mergeWith(jsonNode).at("/collection");
+		JsonNode rewrittenNode = builder.mergeWith(jsonNode)
+				.at("/" + collectionNodeName);
 		RewriteIdentifier identifier = new RewriteIdentifier(null, sourceNode,
 				corpusAccessName + " corpus access policy has been added.");
-		node.replace("collection", rewrittenNode, identifier);
+		node.replace(collectionNodeName, rewrittenNode, identifier);
 	}
     
     private List<String> getAvailabilityRules (CorpusAccess access,
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
index 5aacdd5..3955209 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
@@ -13,6 +13,8 @@
  * EM: not used anymore. This rewrite was to remove an empty koral:doc
  * group in operands.
  * 
+ * EM: legacy "collection" term should be replaced with "corpus".
+ * 
  * @author hanl
  * @date 28/07/2015
  */
@@ -20,7 +22,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         JsonNode jsonNode = process(node.rawNode());
         return node.wrapNode(jsonNode);
     }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java
index 979602e..cc9b774 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionConstraint.java
@@ -10,6 +10,8 @@
  * EM: not used anymore. This rewrite was meant to remove doc from
  * a collection by checking user access to the doc.
  * 
+ * EM: legacy "collection" term should be replaced with "corpus".
+ * 
  * @author hanl
  * @date 03/07/2015
  */
@@ -17,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         if (node.get("@type").equals("koral:doc")) {
             if (node.get("key").equals(Attributes.CORPUS_SIGLE)) {
                 String id = node.get("value");
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java
index 846d2e5..f57bbeb 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryInject.java
@@ -20,14 +20,14 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode koralNode, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
 
     	// EM: I don't know the purpose of the following code and it is not 
     	// tested
         if (koralNode.get("@type").equals("koral:span")) {
             if (!koralNode.isMissingNode("/wrap")) {
                 koralNode = koralNode.at("/wrap");
-                JsonNode term = rewriteQuery(koralNode, config, user).rawNode();
+                JsonNode term = rewriteQuery(koralNode, config, user, apiVersion).rawNode();
                 koralNode.replaceAt("/wrap", term,
                         new RewriteIdentifier("koral:term", "replace", ""));
             }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java
index c59097c..743daf0 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/FoundryRewrite.java
@@ -19,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
         String username = user.getUsername();
         String jsonSettings = settingService.retrieveDefaultSettings(username);
         if (jsonSettings != null) {
@@ -27,6 +27,6 @@
                     jsonSettings);
             user.setUserSettingProcessor(processor);
         }
-        return super.rewriteQuery(node, config, user);
+        return super.rewriteQuery(node, config, user, apiVersion);
     }
 }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java b/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
index 113c176..bc98530 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
@@ -1,8 +1,7 @@
 package de.ids_mannheim.korap.rewrite;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import de.ids_mannheim.korap.config.BeanInjectable;
-import de.ids_mannheim.korap.config.ContextHolder;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.user.User;
 
@@ -20,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         if (node.get("@type").equals("koral:token")) {
             String s = extractToken(node.rawNode());
             if (s != null && !s.isEmpty())
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java b/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java
index 2838f67..a3c17d9 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/MetaConstraint.java
@@ -1,7 +1,7 @@
 package de.ids_mannheim.korap.rewrite;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import de.ids_mannheim.korap.config.BeanInjectable;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.user.User;
 
@@ -13,7 +13,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         // redundant
         if (node.rawNode().has("meta")) {
             JsonNode meta = node.rawNode().path("meta");
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java
index e5f3bee..6e7fa1c 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/QueryContextRewrite.java
@@ -19,7 +19,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
         
         if (config.getMaxTokenContext() > 0) {
             boolean isContextCut = false;
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
index e5f6a36..7b4d2b3 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/QueryReferenceRewrite.java
@@ -31,7 +31,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
+            User user, double apiVersion) throws KustvaktException {
         if (node.has("query")) {
             node = node.at("/query");
             findQueryRef(user.getUsername(), node);
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
index 6bad856..29e27cb 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
@@ -99,7 +99,7 @@
      * @return boolean if rewriter class was successfully added to
      *         rewrite handler!
      */
-    @Deprecated
+    // EM: MH marked this as @Deprecated
     public boolean add (Class<? extends RewriteTask> rewriter) {
         RewriteTask task;
         try {
@@ -114,27 +114,27 @@
         return addProcessor(task);
     }
 
-    public String processQuery (JsonNode root, User user)
+    public String processQuery (JsonNode root, User user, double apiVersion)
             throws KustvaktException {
         RewriteProcess process = new RewriteProcess(root, user);
-        JsonNode pre = process.start(false);
+        JsonNode pre = process.start(false, apiVersion);
         return JsonUtils.toJSON(pre);
     }
 
-    public String processQuery (String json, User user)
+    public String processQuery (String json, User user, double apiVersion)
             throws KustvaktException {
-        return processQuery(JsonUtils.readTree(json), user);
+        return processQuery(JsonUtils.readTree(json), user, apiVersion);
     }
 
-    public String processResult (String json, User user)
+    public String processResult (String json, User user, double apiVersion)
             throws KustvaktException {
-        return processResult(JsonUtils.readTree(json), user);
+        return processResult(JsonUtils.readTree(json), user, apiVersion);
     }
 
-    public String processResult (JsonNode node, User user)
+    public String processResult (JsonNode node, User user, double apiVersion)
             throws KustvaktException {
         RewriteProcess process = new RewriteProcess(node, user);
-        JsonNode pre = process.start(true);
+        JsonNode pre = process.start(true, apiVersion);
         return JsonUtils.toJSON(pre);
     }
 
@@ -161,7 +161,7 @@
         }
 
         private KoralNode processNode (String key, JsonNode value,
-                boolean result) throws KustvaktException {
+                boolean result, double apiVersion) throws KustvaktException {
             KoralNode kroot = KoralNode.wrapNode(value);
             if (value.isObject()) {
                 if (value.has("operands")) {
@@ -169,7 +169,7 @@
                     Iterator<JsonNode> it = ops.elements();
                     while (it.hasNext()) {
                         JsonNode next = it.next();
-                        KoralNode kn = processNode(key, next, result);
+                        KoralNode kn = processNode(key, next, result, apiVersion);
                         if (kn.isRemove())
                             it.remove();
                     }
@@ -177,19 +177,19 @@
                 else if (value.path("@type").asText().equals("koral:token")) {
                     // todo: koral:token nodes cannot be flagged for deletion --> creates the possibility for empty koral:token nodes
                     rewrite(key, kroot,
-                            RewriteHandler.this.token_node_processors, result);
-                    return processNode(key, value.path("wrap"), result);
+                            RewriteHandler.this.token_node_processors, result, apiVersion);
+                    return processNode(key, value.path("wrap"), result, apiVersion);
                 }
                 else {
                     return rewrite(key, kroot,
-                            RewriteHandler.this.node_processors, result);
+                            RewriteHandler.this.node_processors, result, apiVersion);
                 }
             }
             else if (value.isArray()) {
                 Iterator<JsonNode> it = value.elements();
                 while (it.hasNext()) {
                     JsonNode next = it.next();
-                    KoralNode kn = processNode(key, next, result);
+                    KoralNode kn = processNode(key, next, result, apiVersion);
                     if (kn.isRemove())
                         it.remove();
                 }
@@ -197,7 +197,7 @@
             return kroot;
         }
 
-        private JsonNode start (boolean result) throws KustvaktException {
+        private JsonNode start (boolean result, double apiVersion) throws KustvaktException {
             if (DEBUG) {
                 jlog.debug("Running rewrite process on query " + root);
             }
@@ -205,10 +205,10 @@
                 Iterator<Map.Entry<String, JsonNode>> it = root.fields();
                 while (it.hasNext()) {
                     Map.Entry<String, JsonNode> next = it.next();
-                    processNode(next.getKey(), next.getValue(), result);
+                    processNode(next.getKey(), next.getValue(), result, apiVersion);
                 }
                 processFixedNode(root, RewriteHandler.this.query_processors,
-                        result);
+                        result, apiVersion);
             }
             return root;
         }
@@ -216,12 +216,13 @@
         /**
          * @param node
          * @param tasks
+         * @param apiVersion 
          * @return boolean true if node is to be removed from parent!
          *         Only
          *         applies if parent is an array node
          */
         private KoralNode rewrite (String rootNode, KoralNode node,
-                Collection<? extends RewriteTask> tasks, boolean result)
+                Collection<? extends RewriteTask> tasks, boolean result, double apiVersion)
                 throws KustvaktException {
             if (RewriteHandler.this.config == null)
                 throw new RuntimeException(
@@ -249,7 +250,7 @@
                 }
                 if (!result && task instanceof RewriteTask.RewriteQuery) {
                     ((RewriteTask.RewriteQuery) task).rewriteQuery(node,
-                            RewriteHandler.this.config, this.user);
+                            RewriteHandler.this.config, this.user, apiVersion);
                 }
                 else if (task instanceof RewriteTask.RewriteResult) {
                     ((RewriteTask.RewriteResult) task).rewriteResult(node);
@@ -267,7 +268,7 @@
 
         // fixme: merge with processNode!
         private void processFixedNode (JsonNode node,
-                Collection<RewriteTask> tasks, boolean post)
+                Collection<RewriteTask> tasks, boolean post, double apiVersion)
                 throws KustvaktException {
             for (RewriteTask task : tasks) {
                 KoralNode next = KoralNode.wrapNode(node);
@@ -280,7 +281,7 @@
 
                 if (!post & task instanceof RewriteTask.RewriteQuery)
                     next = ((RewriteTask.RewriteQuery) task).rewriteQuery(next,
-                            RewriteHandler.this.config, user);
+                            RewriteHandler.this.config, user, apiVersion);
                 else if (task instanceof RewriteTask.RewriteResult)
                     ((RewriteTask.RewriteResult) task).rewriteResult(next);
                 next.buildRewrites();
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java
index b015c0e..feec93a 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteTask.java
@@ -26,10 +26,12 @@
          *            injected by rewrite handler if available. Might
          *            cause {@link NullPointerException} if not
          *            checked properly
+         * @param apiVersion
+         *            the version of the API
          * @return
          */
         KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-                User user) throws KustvaktException;
+                User user, double apiVersion) throws KustvaktException;
 
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java
index 1cdfd2f..eddfcd3 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/TimeoutRewrite.java
@@ -9,7 +9,7 @@
 
 	@Override
 	public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-			User user) throws KustvaktException {
+			User user, double apiVersion) throws KustvaktException {
 		CorpusAccess access = user.getCorpusAccess();
 		if (node.has("meta")) {
             node = node.at("/meta");
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java b/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
index 81f254a..a7d0983 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/TreeConstraint.java
@@ -59,7 +59,7 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) {
+            User user, double apiVersion) {
         System.out.println("FIND PATH " + node.rawNode().findParent(pointer));
 
         return node;
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
index ca8673e..7792c88 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewrite.java
@@ -31,8 +31,13 @@
 
     @Override
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
-            User user) throws KustvaktException {
-        if (node.has("collection")) {
+            User user, double apiVersion) throws KustvaktException {
+    	if (node.has("corpus")) {
+            node = node.at("/corpus");
+            findVCRef(user.getUsername(), node);
+        }
+    	// EM: legacy
+    	else if (node.has("collection")) {
             node = node.at("/collection");
             findVCRef(user.getUsername(), node);
         }
@@ -106,8 +111,14 @@
     protected void rewriteVC (QueryDO vc, KoralNode koralNode)
             throws KustvaktException {
         String koralQuery = vc.getKoralQuery();
-        JsonNode newKoralQuery = JsonUtils.readTree(koralQuery).at("/collection");
-        
+        JsonNode queryNode = JsonUtils.readTree(koralQuery);
+        JsonNode newKoralQuery;
+        if (queryNode.has("collection")) {
+        	newKoralQuery = JsonUtils.readTree(koralQuery).at("/collection");
+        }
+        else {
+        	newKoralQuery = JsonUtils.readTree(koralQuery).at("/corpus");
+        }
         String source = koralNode.rawNode().toString();
         JsonNode sourceNode = JsonUtils.readTree(source);
         
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 5a8bbf7..70af091 100644
--- a/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -110,50 +110,52 @@
         }
     }
 
-    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();
         while (i.hasNext()) {
             query = i.next();
-            String statistics = computeStatisticsForVC(query, queryType);
+            String statistics = computeStatisticsForVC(query, queryType,
+            		apiVersion);
 			QueryDto dto = converter.createQueryDto(query, statistics);
 			dtos.add(dto);
 		}
 		return dtos;
     }
     
-	private String computeStatisticsForVC (QueryDO query, QueryType queryType)
+	private String computeStatisticsForVC (QueryDO query, QueryType queryType, 
+			double apiVersion)
 			throws KustvaktException {
 		if (config.isVcListStatisticsEnabled() && 
 				queryType.equals(QueryType.VIRTUAL_CORPUS)) {		
@@ -161,7 +163,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();
@@ -223,23 +225,27 @@
     }
 
     public Status handlePutRequest (String username, String queryCreator,
-            String queryName, QueryJson queryJson) throws KustvaktException {
+            String queryName, QueryJson queryJson, double apiVersion) 
+            		throws KustvaktException {
 
         verifyUsername(username, queryCreator);
         QueryDO query = queryDao.retrieveQueryByName(queryName, queryCreator);
 
         if (query == null) {
-            storeQuery(queryJson, queryName, queryCreator, username);
+            storeQuery(queryJson, queryName, queryCreator, username, 
+            		apiVersion);
             return Status.CREATED;
         }
         else {
-            editQuery(query, queryJson, queryName, username);
+            editQuery(query, queryJson, queryName, username, 
+            		apiVersion);
             return Status.NO_CONTENT;
         }
     }
 
     public void editQuery (QueryDO existingQuery, QueryJson newQuery,
-            String queryName, String username) throws KustvaktException {
+            String queryName, String username, double apiVersion) 
+    		throws KustvaktException {
 
         if (!username.equals(existingQuery.getCreatedBy())
                 && !adminDao.isAdmin(username)) {
@@ -253,13 +259,13 @@
         String query = newQuery.getQuery();
         String queryLanguage = newQuery.getQueryLanguage();
         if (corpusQuery != null && !corpusQuery.isEmpty()) {
-            koralQuery = serializeCorpusQuery(corpusQuery);
+            koralQuery = serializeCorpusQuery(corpusQuery, apiVersion);
             requiredAccess = determineRequiredAccess(newQuery.isCached(),
-                    queryName, koralQuery);
+                    queryName, koralQuery, apiVersion);
         }
         else if (query != null && !query.isEmpty() && queryLanguage != null
                 && !queryLanguage.isEmpty()) {
-            koralQuery = serializeQuery(query, queryLanguage);
+            koralQuery = serializeQuery(query, queryLanguage, apiVersion);
         }
 
         ResourceType type = newQuery.getType();
@@ -311,7 +317,8 @@
     }
 
     public void storeQuery (QueryJson query, String queryName,
-            String queryCreator, String username) throws KustvaktException {
+            String queryCreator, String username, double apiVersion) 
+            		throws KustvaktException {
         QueryType queryType = query.getQueryType();
         if (!checkNumberOfQueryLimit(username, queryType)) {
             String type = queryType.displayName().toLowerCase();
@@ -320,11 +327,11 @@
                             + type + " has been reached.");
         }
 
-        String koralQuery = computeKoralQuery(query);
+        String koralQuery = computeKoralQuery(query, apiVersion);
         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,
@@ -336,19 +343,20 @@
             return false;
     }
 
-    private String computeKoralQuery (QueryJson query)
+    private String computeKoralQuery (QueryJson query, double apiVersion)
             throws KustvaktException {
         if (query.getQueryType().equals(QueryType.VIRTUAL_CORPUS)) {
             ParameterChecker.checkStringValue(query.getCorpusQuery(),
                     "corpusQuery");
-            return serializeCorpusQuery(query.getCorpusQuery());
+            return serializeCorpusQuery(query.getCorpusQuery(), apiVersion);
         }
 
         if (query.getQueryType().equals(QueryType.QUERY)) {
             ParameterChecker.checkStringValue(query.getQuery(), "query");
             ParameterChecker.checkStringValue(query.getQueryLanguage(),
                     "queryLanguage");
-            return serializeQuery(query.getQuery(), query.getQueryLanguage());
+            return serializeQuery(query.getQuery(), query.getQueryLanguage(), 
+            		apiVersion);
         }
 
         return null;
@@ -358,17 +366,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");
 
@@ -395,7 +403,7 @@
         CorpusAccess requiredAccess = CorpusAccess.FREE;
         if (queryType.equals(QueryType.VIRTUAL_CORPUS)) {
             requiredAccess = determineRequiredAccess(isCached, queryName,
-                    koralQuery);
+                    koralQuery, apiVersion);
         }
 
         if (DEBUG) {
@@ -434,9 +442,9 @@
         }
     }
 
-    public String serializeCorpusQuery (String corpusQuery)
+    public String serializeCorpusQuery (String corpusQuery, double apiVersion)
             throws KustvaktException {
-        QuerySerializer serializer = new QuerySerializer();
+        QuerySerializer serializer = new QuerySerializer(apiVersion);
         serializer.setCollection(corpusQuery);
         String koralQuery;
         try {
@@ -452,9 +460,10 @@
         return koralQuery;
     }
 
-    private String serializeQuery (String query, String queryLanguage)
+    private String serializeQuery (String query, String queryLanguage, double 
+    		apiVersion)
             throws KustvaktException {
-        QuerySerializer serializer = new QuerySerializer();
+        QuerySerializer serializer = new QuerySerializer(apiVersion);
         String koralQuery;
         koralQuery = serializer.setQuery(query, queryLanguage).toJSON();
         if (DEBUG) {
@@ -465,10 +474,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) {
@@ -477,20 +487,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();
@@ -714,7 +727,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);
 
@@ -724,7 +738,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/utils/ServiceInfo.java b/src/main/java/de/ids_mannheim/korap/utils/ServiceInfo.java
index 43a127b..518dae6 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/ServiceInfo.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/ServiceInfo.java
@@ -57,7 +57,7 @@
 
 //            this.krillVersion = (String) props.get("krill.version");
 
-            QuerySerializer s = new QuerySerializer();
+            QuerySerializer s = new QuerySerializer(1.1);
             this.koralVersion = s.getVersion();
         }
         catch (IOException e) {
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java b/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java
index 60dd425..d0fedcf 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/OAuth2Controller.java
@@ -32,9 +32,11 @@
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.utils.ParameterChecker;
 import de.ids_mannheim.korap.web.OAuth2ResponseHandler;
+import de.ids_mannheim.korap.web.filter.APIDeprecationFilter;
 import de.ids_mannheim.korap.web.filter.APIVersionFilter;
 import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
 import de.ids_mannheim.korap.web.filter.BlockingFilter;
+import de.ids_mannheim.korap.web.filter.DemoUserFilter;
 import de.ids_mannheim.korap.web.utils.ResourceFilters;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.constraints.NotEmpty;
@@ -106,6 +108,8 @@
     @POST
     @Path("authorize")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, DemoUserFilter.class})
     public Response requestAuthorizationCode (
             @Context HttpServletRequest request,
             @Context SecurityContext context, @FormParam("scope") String scope,
diff --git a/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java b/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
index 1c41998..c0dcd8f 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
@@ -27,8 +27,10 @@
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.PathParam;
 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.SecurityContext;
 
@@ -218,11 +220,17 @@
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
     public List<OAuth2ClientInfoDto> listUserClients (
             @Context SecurityContext context,
+            @Context ContainerRequestContext requestContext,
             @FormParam("super_client_id") String superClientId,
             @FormParam("super_client_secret") String superClientSecret,
             @FormParam("authorized_only") boolean authorizedOnly, // deprecated
             @FormParam("filter_by") String filterBy) {
 
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext tokenContext = (TokenContext) context.getUserPrincipal();
         String username = tokenContext.getUsername();
 
@@ -234,28 +242,34 @@
             
             List<OAuth2ClientInfoDto> clients = null; 
             
-            if (authorizedOnly) {
-                clients = clientService.listUserAuthorizedClients(username);
+        	if (requestedVersion == 1) {
+        		if (authorizedOnly) {
+            		clients = clientService.listUserAuthorizedClients(username);
+            		return clients;
+            	}
+            }
+            
+        	if (filterBy !=null && !filterBy.isEmpty()) {
+                if (filterBy.equals("authorized_only")) {
+                    clients = clientService.listUserAuthorizedClients(username);
+                }
+                else if (filterBy.equals("owned_only")) {
+                    clients = clientService.listUserRegisteredClients(username); 
+                }
+                else {
+                    throw new KustvaktException(
+                            StatusCodes.UNSUPPORTED_VALUE, "filter_by");
+                }
             }
             else {
-                if (filterBy !=null && !filterBy.isEmpty()) {
-                    if (filterBy.equals("authorized_only")) {
-                        clients = clientService.listUserAuthorizedClients(username);
-                    }
-                    else if (filterBy.equals("owned_only")) {
-                        clients = clientService.listUserRegisteredClients(username); 
-                    }
-                    else {
-                        throw new KustvaktException(
-                                StatusCodes.UNSUPPORTED_VALUE, "filter_by");
-                    }
-                }
-                else {               
-//                    clients = clientService.listUserAuthorizedClients(username);
-//                    clients.addAll(clientService.listUserRegisteredClients(username));
-                
-                    clients = clientService.listUserRegisteredClients(username);
-                }
+            	if (requestedVersion == 1) {
+            		clients = clientService.listUserRegisteredClients(username);
+            	}
+				else {
+					clients = clientService.listUserAuthorizedClients(username);
+					clients.addAll(
+							clientService.listUserRegisteredClients(username));
+				}
             }
             
             return clients;
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 0be121d..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
@@ -28,8 +28,10 @@
 import jakarta.ws.rs.PathParam;
 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.MediaType;
+import jakarta.ws.rs.core.PathSegment;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.SecurityContext;
@@ -83,10 +85,16 @@
     @Path("/~{qCreator}/{qName}")
     @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public Response createQuery (@Context SecurityContext securityContext,
+    		@Context ContainerRequestContext requestContext,
             @PathParam("qCreator") String qCreator,
             @PathParam("qName") String qName, QueryJson query)
             throws KustvaktException {
 
+    	List<PathSegment> pathSegments = requestContext.getUriInfo()
+    			.getPathSegments();
+        String version = pathSegments.get(0).getPath();
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        
         TokenContext context = (TokenContext) securityContext
                 .getUserPrincipal();
 
@@ -97,7 +105,7 @@
                 query.setQueryType(QueryType.QUERY);
             }
             Status status = service.handlePutRequest(context.getUsername(),
-                    qCreator, qName, query);
+                    qCreator, qName, query, requestedVersion);
             return Response.status(status).build();
         }
         catch (KustvaktException e) {
@@ -122,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);
@@ -186,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/UserGroupController.java b/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
index fa3607c..6e7d1fd 100644
--- a/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
+++ b/src/main/java/de/ids_mannheim/korap/web/controller/UserGroupController.java
@@ -15,6 +15,7 @@
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.service.UserGroupService;
 import de.ids_mannheim.korap.web.KustvaktResponseHandler;
+import de.ids_mannheim.korap.web.filter.APIDeprecationFilter;
 import de.ids_mannheim.korap.web.filter.APIVersionFilter;
 import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
 import de.ids_mannheim.korap.web.filter.BlockingFilter;
@@ -203,6 +204,8 @@
     @POST
     @Path("@{groupName}/invite")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response inviteGroupMembers (
             @Context SecurityContext securityContext,
             @PathParam("groupName") String groupName,
@@ -251,6 +254,8 @@
     @POST
     @Path("@{groupName}/role/add")
     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response addMemberRoles (@Context SecurityContext securityContext,
             @PathParam("groupName") String groupName,
             @FormParam("memberUsername") String memberUsername,
@@ -350,6 +355,8 @@
     @Deprecated
     @POST
     @Path("@{groupName}/subscribe")
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response subscribeToGroup (@Context SecurityContext securityContext,
             @PathParam("groupName") String groupName) {
         throw kustvaktResponseHandler.throwit(new KustvaktException(
@@ -373,6 +380,8 @@
     @Deprecated
     @DELETE
     @Path("@{groupName}/unsubscribe")
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response unsubscribeFromGroup (
             @Context SecurityContext securityContext,
             @PathParam("groupName") String groupName) {
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 d379114..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
@@ -9,8 +9,8 @@
 
 import de.ids_mannheim.korap.constant.OAuth2Scope;
 import de.ids_mannheim.korap.constant.QueryType;
-import de.ids_mannheim.korap.dto.RoleDto;
 import de.ids_mannheim.korap.dto.QueryDto;
+import de.ids_mannheim.korap.dto.RoleDto;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.oauth2.service.OAuth2ScopeService;
@@ -18,6 +18,7 @@
 import de.ids_mannheim.korap.service.QueryService;
 import de.ids_mannheim.korap.utils.ParameterChecker;
 import de.ids_mannheim.korap.web.KustvaktResponseHandler;
+import de.ids_mannheim.korap.web.filter.APIDeprecationFilter;
 import de.ids_mannheim.korap.web.filter.APIVersionFilter;
 import de.ids_mannheim.korap.web.filter.AdminFilter;
 import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
@@ -35,8 +36,10 @@
 import jakarta.ws.rs.PathParam;
 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.MediaType;
+import jakarta.ws.rs.core.PathSegment;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 import jakarta.ws.rs.core.SecurityContext;
@@ -101,12 +104,18 @@
     @Path("/~{vcCreator}/{vcName}")
     @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
     public Response createUpdateVC (@Context SecurityContext securityContext,
+    		@Context ContainerRequestContext requestContext,
             @PathParam("vcCreator") String vcCreator,
             @PathParam("vcName") String vcName, QueryJson vc)
             throws KustvaktException {
         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.CREATE_VC);
             ParameterChecker.checkObjectValue(vc, "request entity");
@@ -114,7 +123,7 @@
                 vc.setQueryType(QueryType.VIRTUAL_CORPUS);
             }
             Status status = service.handlePutRequest(context.getUsername(),
-                    vcCreator, vcName, vc);
+                    vcCreator, vcName, vc, apiVersion);
             return Response.status(status).build();
         }
         catch (KustvaktException e) {
@@ -141,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);
@@ -218,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,
@@ -241,7 +261,7 @@
             }
             else {
                 return service.listAvailableQueryForUser(context.getUsername(),
-                        QueryType.VIRTUAL_CORPUS);
+                        QueryType.VIRTUAL_CORPUS, apiVersion);
             }
         }
         catch (KustvaktException e) {
@@ -271,6 +291,8 @@
     @Deprecated
     @GET
     @Path("~{createdBy}")
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public List<QueryDto> listUserOrSystemVC (
             @PathParam("createdBy") String createdBy,
             @Context SecurityContext securityContext) {
@@ -390,6 +412,8 @@
     @Deprecated
     @DELETE
     @Path("access/{accessId}")
+    @ResourceFilters({APIDeprecationFilter.class, 
+    	AuthenticationFilter.class, BlockingFilter.class})
     public Response deleteAccessById (
             @Context SecurityContext securityContext,
             @PathParam("accessId") int accessId) {
diff --git a/src/main/java/de/ids_mannheim/korap/web/filter/APIDeprecationFilter.java b/src/main/java/de/ids_mannheim/korap/web/filter/APIDeprecationFilter.java
new file mode 100644
index 0000000..bd0a7e5
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/web/filter/APIDeprecationFilter.java
@@ -0,0 +1,33 @@
+package de.ids_mannheim.korap.web.filter;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import de.ids_mannheim.korap.config.KustvaktConfiguration;
+import jakarta.annotation.Priority;
+import jakarta.ws.rs.NotFoundException;
+import jakarta.ws.rs.container.ContainerRequestContext;
+import jakarta.ws.rs.container.ContainerRequestFilter;
+import jakarta.ws.rs.core.PathSegment;
+
+@Priority(Integer.MIN_VALUE +1)
+public class APIDeprecationFilter implements ContainerRequestFilter {
+
+    @Autowired
+    private KustvaktConfiguration config;
+
+    public void filter (ContainerRequestContext request) {
+        List<PathSegment> pathSegments = request.getUriInfo().getPathSegments();
+        String version = pathSegments.get(0).getPath();
+
+        double requestedVersion = Double.parseDouble(version.substring(1));
+        if (requestedVersion > 1) {
+            throw new NotFoundException();
+            // throw kustvaktResponseHandler.throwit(
+            // new
+            // KustvaktException(StatusCodes.UNSUPPORTED_API_VERSION,
+            // "API " + version + " is unsupported.", version));
+        }
+	}
+}
diff --git a/src/test/java/de/ids_mannheim/korap/authentication/APIAuthenticationTest.java b/src/test/java/de/ids_mannheim/korap/authentication/APIAuthenticationTest.java
index 9a22d24..113b4c4 100644
--- a/src/test/java/de/ids_mannheim/korap/authentication/APIAuthenticationTest.java
+++ b/src/test/java/de/ids_mannheim/korap/authentication/APIAuthenticationTest.java
@@ -24,7 +24,7 @@
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.utils.TimeUtils;
-import de.ids_mannheim.korap.web.controller.OAuth2TestBase;
+import de.ids_mannheim.korap.web.controller.oauth2.OAuth2TestBase;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 
diff --git a/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java b/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java
index 8fa72e5..810dacd 100644
--- a/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java
+++ b/src/test/java/de/ids_mannheim/korap/authentication/LdapOAuth2Test.java
@@ -29,7 +29,7 @@
 import de.ids_mannheim.korap.oauth2.entity.OAuth2Client;
 import de.ids_mannheim.korap.oauth2.entity.RefreshToken;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.web.controller.OAuth2TestBase;
+import de.ids_mannheim.korap.web.controller.oauth2.OAuth2TestBase;
 import de.ids_mannheim.korap.web.input.OAuth2ClientJson;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Response;
diff --git a/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java b/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java
index 4334b97..dc2e429 100644
--- a/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java
+++ b/src/test/java/de/ids_mannheim/korap/config/SpringJerseyTest.java
@@ -23,7 +23,13 @@
 @ContextConfiguration("classpath:test-config.xml")
 public abstract class SpringJerseyTest extends JerseyTest {
 
-    public final static String API_VERSION = "v1.0";
+    public final static String API_VERSION = "v1.1";
+    public final static String API_VERSION_V1_0 = "v1.0";
+    
+    protected final static double API_VERSION_DOUBLE = 
+    		Double.parseDouble(API_VERSION.substring(1));
+    protected final static String COLLECTION_NODE_NAME = 
+    		(API_VERSION_DOUBLE >= 1.1) ? "corpus" : "collection";
 
     protected final static String allCorpusAccess = "All corpus access policy "
 			+ "has been added.";
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 9a9e6ca..c611cbc 100644
--- a/src/test/java/de/ids_mannheim/korap/misc/CollectionQueryBuilderTest.java
+++ b/src/test/java/de/ids_mannheim/korap/misc/CollectionQueryBuilderTest.java
@@ -16,9 +16,11 @@
  */
 public class CollectionQueryBuilderTest {
 
+	private double apiVersion = 1.0;
+	
     @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);
@@ -28,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);
@@ -43,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);
@@ -56,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);
@@ -69,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());
@@ -95,9 +97,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());
@@ -120,10 +122,10 @@
     public void testBuildQuery () throws KustvaktException {
         String coll = "corpusSigle=WPD";
         String query = "[base=Haus]";
-        QuerySerializer check = new QuerySerializer();
+        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();
@@ -150,9 +152,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();
@@ -170,12 +172,12 @@
     public void testNodeMergeWithBase () throws KustvaktException {
         String coll = "corpusSigle=WPD";
         String query = "[base=Haus]";
-        QuerySerializer check = new QuerySerializer();
+        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);
@@ -189,11 +191,11 @@
     @Test
     public void testNodeMergeWithoutBase () throws KustvaktException {
         String query = "[base=Haus]";
-        QuerySerializer check = new QuerySerializer();
+        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);
@@ -208,11 +210,11 @@
     public void testNodeMergeWithoutBaseWrongOperator ()
             throws KustvaktException {
         String query = "[base=Haus]";
-        QuerySerializer check = new QuerySerializer();
+        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();
@@ -231,10 +233,10 @@
     public void testAddOROperator () throws KustvaktException {
         String coll = "corpusSigle=WPD";
         String query = "[base=Haus]";
-        QuerySerializer check = new QuerySerializer();
+        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();
@@ -248,10 +250,10 @@
     public void testAddANDOperator () throws KustvaktException {
         String coll = "corpusSigle=WPD";
         String query = "[base=Haus]";
-        QuerySerializer check = new QuerySerializer();
+        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();
@@ -266,10 +268,10 @@
     public void testAddDefaultOperator () throws KustvaktException {
         String coll = "corpusSigle=WPD";
         String query = "[base=Haus]";
-        QuerySerializer check = new QuerySerializer();
+        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();
@@ -283,11 +285,11 @@
     @Test
     public void testBaseCollectionNull () throws KustvaktException {
         // base is missing collection segment
-        QuerySerializer s = new QuerySerializer();
+        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());
@@ -308,12 +310,14 @@
     @Test
     public void testMergeCollectionNull () throws KustvaktException {
         // merge json is missing collection segment
-        QuerySerializer s = new QuerySerializer();
+        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);
diff --git a/src/test/java/de/ids_mannheim/korap/misc/LocalQueryTest.java b/src/test/java/de/ids_mannheim/korap/misc/LocalQueryTest.java
index 9591a0e..d0edbf0 100644
--- a/src/test/java/de/ids_mannheim/korap/misc/LocalQueryTest.java
+++ b/src/test/java/de/ids_mannheim/korap/misc/LocalQueryTest.java
@@ -24,6 +24,8 @@
 public class LocalQueryTest extends SpringJerseyTest {
 
     private static String index;
+    
+    private double apiVersion = 1.0;
 
     @Autowired
     KustvaktConfiguration config;
@@ -40,7 +42,8 @@
         // qstring = "textType = Aphorismus";
         // qstring = "title ~ \"Werther\"";
         SearchKrill krill = new SearchKrill(index);
-        KoralCollectionQueryBuilder coll = new KoralCollectionQueryBuilder();
+        KoralCollectionQueryBuilder coll = 
+        		new KoralCollectionQueryBuilder(apiVersion);
         coll.with(qstring);
         String stats = krill.getStatistics(coll.toJSON());
         assert stats != null && !stats.isEmpty() && !stats.equals("null");
@@ -49,7 +52,7 @@
     @Test
     public void testCollQuery () throws IOException, KustvaktException {
         String qstring = "creationDate since 1800 & creationDate until 1820";
-        CollectionQueryProcessor processor = new CollectionQueryProcessor();
+        CollectionQueryProcessor processor = new CollectionQueryProcessor(1.0);
         processor.process(qstring);
         String s = JsonUtils.toJSON(processor.getRequestMap());
         KrillCollection c = new KrillCollection(s);
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java
index 91ac2e5..648292f 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/AvailabilityRewriteTest.java
@@ -3,6 +3,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -22,54 +23,61 @@
 
     @Autowired
     public KustvaktConfiguration config;
+    
+    private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
+    private String collectionNodeName = (apiVersion >= 1.1) ? "corpus"
+			: "collection";
 
+    @Disabled
     @Test
     public void testCollectionNodeRemoveCorpusIdNoErrors ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection("textClass=politik & corpusSigle=WPD");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
-        assertEquals(1, node.at("/collection/operands").size());
+        assertEquals(1, node.at("/"+collectionNodeName+"/operands").size());
     }
 
     @Test
     public void testCollectionNodeDeletionNotification () {}
 
+    @Disabled
     @Test
     public void testCollectionNodeRemoveAllCorpusIdNoErrors ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection("corpusSigle=BRZ13 & corpusSigle=WPD");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals(0, node.at("/collection/operands").size());
         assertEquals("koral:rewrite",
             node.at("/collection/rewrites/0/@type").asText());
     }
-
+    
+    @Disabled
     @Test
     public void testCollectionNodeRemoveGroupedCorpusIdNoErrors ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection(
                 "(corpusSigle=BRZ13 & textClass=Wissenschaft) & corpusSigle=WPD");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:docGroup",
             node.at("/collection/operands/0/@type").asText());
@@ -80,19 +88,20 @@
     }
 
     // fixme: will probably fail when one doc groups are being refactored
+    @Disabled
     @Test
     public void testCollectionCleanEmptyDocGroupNoErrors ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
         handler.add(CollectionCleanRewrite.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection(
                 "(corpusSigle=BRZ13 & corpusSigle=WPD) & textClass=Wissenschaft & textClass=Sport");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:docGroup", node.at("/collection/@type").asText());
         assertEquals(2, node.at("/collection/operands").size());
@@ -104,18 +113,19 @@
             node.at("/collection/rewrites/0/@type").asText());
     }
 
+    @Disabled
     @Test
     public void testCollectionCleanMoveOneDocFromGroupUpNoErrors ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
         handler.add(CollectionCleanRewrite.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection("(corpusSigle=BRZ13 & textClass=wissenschaft)");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:doc", node.at("/collection/@type").asText());
         assertEquals("textClass", node.at("/collection/key").asText());
@@ -124,19 +134,20 @@
             node.at("/collection/rewrites/0/@type").asText());
     }
 
+    @Disabled
     @Test
     public void testCollectionCleanEmptyGroupAndMoveOneFromGroupUpNoErrors ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
         handler.add(CollectionCleanRewrite.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection(
                 "(corpusSigle=BRZ13 & corpusSigle=WPD) & textClass=Wissenschaft");
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:doc", node.at("/collection/@type").asText());
         assertEquals("textClass", node.at("/collection/key").asText());
@@ -144,19 +155,20 @@
             node.at("/collection/rewrites/0/@type").asText());
     }
 
+    @Disabled
     @Test
     public void testCollectionRemoveAndMoveOneFromGroupUpNoErrors ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
         handler.add(CollectionCleanRewrite.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection(
                 "(docID=random & textClass=Wissenschaft) & corpusSigle=WPD");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals("koral:docGroup", node.at("/collection/@type").asText());
         assertEquals(2, node.at("/collection/operands").size());
@@ -169,35 +181,16 @@
     }
 
     @Test
-    public void testPublicCollectionRewriteEmptyAdd ()
-            throws KustvaktException {
-        RewriteHandler handler = new RewriteHandler(config);
-        handler.add(AvailabilityRewrite.class);
-        QuerySerializer s = new QuerySerializer();
-        s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
-        String org = s.toJSON();
-        JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
-        assertNotNull(node);
-        assertEquals("availability", node.at("/collection/key").asText());
-        assertEquals("CC.*", node.at("/collection/value").asText());
-        assertEquals("koral:rewrite",
-            node.at("/collection/rewrites/0/@type").asText());
-        assertEquals(freeCorpusAccess,
-        		node.at("/collection/rewrites/0/_comment").asText());
-    }
-
-    @Test
     public void testPublicCollectionRewriteNonEmptyAdd ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(AvailabilityRewrite.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection("(docSigle=WPD_AAA & textClass=wissenschaft)");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
         assertEquals(2, node.at("/collection/operands").size());
         assertEquals("availability",
@@ -213,20 +206,42 @@
 //        assertEquals(node.at("/collection/rewrites/0/scope").asText(),
 //                "availability(FREE)");
     }
+    
+    @Test
+    public void testPublicCollectionRewriteEmptyAdd ()
+            throws KustvaktException {
+        RewriteHandler handler = new RewriteHandler(config);
+        handler.add(AvailabilityRewrite.class);
+        QuerySerializer s = new QuerySerializer(apiVersion);
+        s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
+        String org = s.toJSON();
+        JsonNode node = JsonUtils.readTree(handler.processQuery(org,
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
+        assertNotNull(node);
+        assertEquals(node.at("/"+collectionNodeName+"/key").asText(), "availability");
+        assertEquals(node.at("/"+collectionNodeName+"/value").asText(), "CC.*");
+        assertEquals(node.at("/"+collectionNodeName+"/rewrites/0/@type").asText(),
+                "koral:rewrite");
+        assertEquals(freeCorpusAccess,
+        		node.at("/"+collectionNodeName+"/rewrites/0/_comment").asText());
+    }
 
+
+    @Disabled
     @Test
     public void testRemoveCorpusFromDifferentGroups ()
             throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         handler.add(CollectionConstraint.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection(
                 "(corpusSigle=BRZ14 & textClass=wissenschaft) | (corpusSigle=AZPR | textClass=freizeit)");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
+
         assertEquals("koral:docGroup", node.at("/collection/@type").asText());
         assertEquals(2, node.at("/collection/operands").size());
         assertEquals("koral:docGroup",
@@ -239,6 +254,7 @@
             node.at("/collection/rewrites/0/@type").asText());
     }
 
+    @Disabled
     @Test
     public void testRemoveOneCorpusAndMoveDocFromTwoGroups ()
             throws KustvaktException {
@@ -246,14 +262,15 @@
         handler.add(CollectionConstraint.class);
         // todo: use this collection query also to test clean up filter! after reduction of corpusSigle (wiss | freizeit)!
         handler.add(CollectionCleanRewrite.class);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setCollection(
                 "(corpusSigle=BRZ14 & textClass=wissenschaft) | (corpusSigle=AZPR | textClass=freizeit)");
         String org = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(org,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         assertNotNull(node);
+
         assertEquals("koral:docGroup", node.at("/collection/@type").asText());
         assertEquals(2, node.at("/collection/operands").size());
         assertEquals("koral:doc",
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
index a672616..bdc5ba6 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/FoundryRewriteTest.java
@@ -85,10 +85,10 @@
 		assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
 
         String username = "bubbles";
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[pos=ADJA]", "poliqarp");
         String result = rewriteHandler.processQuery(s.toJSON(),
-                new KorAPUser(username));
+                new KorAPUser(username), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertEquals("corenlp", node.at("/query/wrap/foundry").asText());
         assertEquals("foundry",
@@ -100,10 +100,10 @@
 
     private void testRewriteLemmaFoundryWithUserSetting (String username)
             throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[base=Haus]", "poliqarp");
         String result = rewriteHandler.processQuery(s.toJSON(),
-                new KorAPUser(username));
+                new KorAPUser(username), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         // EM: only for testing, in fact, opennlp lemma does not
         // exist!
@@ -124,9 +124,10 @@
     @Test
     public void testDefaultFoundryInjectLemmaThrowsNoError ()
             throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[base=Haus]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
@@ -141,9 +142,10 @@
     @Test
     public void testDefaultFoundryInjectPOSNoErrors ()
             throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[pos=ADJA]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
@@ -158,9 +160,10 @@
     @Test
     public void testFoundryInjectJoinedQueryNoErrors ()
             throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[orth=laufe/i & base!=Lauf]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertEquals("koral:termGroup", node.at("/query/wrap/@type").asText());
@@ -173,9 +176,10 @@
     @Test
     public void testFoundryInjectGroupedQueryNoErrors ()
             throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[(base=laufen | tt/pos=VVFIN)]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertEquals("koral:termGroup", node.at("/query/wrap/@type").asText());
@@ -187,9 +191,10 @@
 
     @Test
     public void testFoundryBaseRewrite () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(1.1);;
         s.setQuery("[orth=laufen]", "poliqarp");
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertEquals("koral:term", node.at("/query/wrap/@type").asText());
         assertFalse(node.at("/query/wrap/foundry").isMissingNode());
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java
index ef33982..4f28de8 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/IdRewriteTest.java
@@ -6,13 +6,13 @@
 
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import com.fasterxml.jackson.databind.JsonNode;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
-import de.ids_mannheim.korap.rewrite.IdWriter;
-import de.ids_mannheim.korap.rewrite.RewriteHandler;
 import de.ids_mannheim.korap.user.KorAPUser;
 import de.ids_mannheim.korap.utils.JsonUtils;
 
@@ -30,9 +30,10 @@
         RewriteHandler handler = new RewriteHandler(config);
         assertTrue(handler.add(IdWriter.class));
         String query = "[surface=Wort]";
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery(query, "poliqarp");
-        String value = handler.processQuery(s.toJSON(), new KorAPUser());
+        String value = handler.processQuery(s.toJSON(), new KorAPUser(), 
+        		API_VERSION_DOUBLE);
         JsonNode result = JsonUtils.readTree(value);
         assertNotNull(result);
         assertTrue(result.path("query").has("idn"));
@@ -42,9 +43,10 @@
     public void testIdWriterTest () throws KustvaktException {
         RewriteHandler handler = new RewriteHandler(config);
         assertTrue(handler.add(IdWriter.class));
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery("[base=Haus]", "poliqarp");
-        String result = handler.processQuery(s.toJSON(), new KorAPUser());
+        String result = handler.processQuery(s.toJSON(), new KorAPUser(), 
+        		API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         assertNotNull(node);
         assertFalse(node.at("/query/wrap").isMissingNode());
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
index 04bcf43..5a596c2 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/QueryContextRewriteTest.java
@@ -47,7 +47,7 @@
 
     @Test
     public void testMetaRewrite () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery("Schnee within s", "poliqarp");
         
         MetaQueryBuilder meta = new MetaQueryBuilder();
@@ -61,7 +61,8 @@
         assertEquals(60, context.at("/left/1").asInt());
         assertEquals(60, context.at("/right/1").asInt());
         
-        String result = rewriteHandler.processQuery(s.toJSON(), new KorAPUser("test"));
+        String result = rewriteHandler.processQuery(s.toJSON(), 
+        		new KorAPUser("test"), API_VERSION_DOUBLE);
         JsonNode node = JsonUtils.readTree(result);
         
         context = node.at("/meta/context");
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
index a7507fd..92a07bf 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/ResultRewriteTest.java
@@ -4,11 +4,10 @@
 
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import de.ids_mannheim.korap.config.SpringJerseyTest;
 import de.ids_mannheim.korap.config.TestVariables;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.rewrite.AvailabilityRewrite;
-import de.ids_mannheim.korap.rewrite.RewriteHandler;
 import de.ids_mannheim.korap.utils.JsonUtils;
 
 /**
@@ -24,7 +23,8 @@
     public void testPostRewriteNothingToDo () throws KustvaktException {
         assertEquals(true, rewriteHandler.add(AvailabilityRewrite.class),
                 "Handler could not be added to rewrite handler instance!");
-        String v = rewriteHandler.processResult(TestVariables.RESULT, null);
+        String v = rewriteHandler.processResult(TestVariables.RESULT, null, 
+        		API_VERSION_DOUBLE);
         assertEquals(JsonUtils.readTree(TestVariables.RESULT),
                 JsonUtils.readTree(v), "results do not match");
     }
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java
index 35df9d3..45d9dc3 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/RewriteHandlerTest.java
@@ -1,16 +1,15 @@
 package de.ids_mannheim.korap.rewrite;
 
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
 
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
 /**
  * EM: to do: Fix tests
  * New DB does not save users.
@@ -91,11 +90,11 @@
     public void testRewriteConfigThrowsException () {
         assertThrows(RuntimeException.class, () -> {
             RewriteHandler handler = new RewriteHandler();
-            QuerySerializer s = new QuerySerializer();
+            QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
             s.setQuery("[(base=laufen | base=gehen) & tt/pos=VVFIN]",
                     "poliqarp");
             assertTrue(handler.add(FoundryInject.class));
-            handler.processQuery(s.toJSON(), null);
+            handler.processQuery(s.toJSON(), null, API_VERSION_DOUBLE);
         });
     }
     // @Deprecated
diff --git a/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java b/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java
index 84a3d5a..99563a2 100644
--- a/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java
+++ b/src/test/java/de/ids_mannheim/korap/rewrite/TimeoutRewriteTest.java
@@ -32,12 +32,12 @@
         Map<String, Object> map = new HashMap<String,Object>();
         map.put("count", 25);
         map.put("timeout", 1000);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setMeta(map);
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         
         node = node.at("/meta"); 
         assertEquals(1000, node.at("/timeout").asInt());
@@ -52,12 +52,12 @@
         Map<String, Object> map = new HashMap<String,Object>();
         map.put("count", 25);
         map.put("timeout", 50000);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setMeta(map);
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         
         node = node.at("/meta"); 
         assertEquals(10000, node.at("/timeout").asInt());
@@ -71,12 +71,12 @@
         
         Map<String, Object> map = new HashMap<String,Object>();
         map.put("count", 25);
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery(TestVariables.SIMPLE_ADD_QUERY, "poliqarp");
         s.setMeta(map);
         String result = s.toJSON();
         JsonNode node = JsonUtils.readTree(handler.processQuery(result,
-                User.UserFactory.getUser("test_user")));
+                User.UserFactory.getUser("test_user"), API_VERSION_DOUBLE));
         
         node = node.at("/meta"); 
         assertEquals(10000, node.at("/timeout").asInt());
diff --git a/src/test/java/de/ids_mannheim/korap/web/InitialSuperClientTest.java b/src/test/java/de/ids_mannheim/korap/web/InitialSuperClientTest.java
index 1c5374e..afa723d 100644
--- a/src/test/java/de/ids_mannheim/korap/web/InitialSuperClientTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/InitialSuperClientTest.java
@@ -17,7 +17,7 @@
 import de.ids_mannheim.korap.oauth2.entity.OAuth2Client;
 import de.ids_mannheim.korap.oauth2.service.OAuth2InitClientService;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.web.controller.OAuth2TestBase;
+import de.ids_mannheim.korap.web.controller.oauth2.OAuth2TestBase;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/SearchKrillTest.java b/src/test/java/de/ids_mannheim/korap/web/SearchKrillTest.java
index 8164c30..7339292 100644
--- a/src/test/java/de/ids_mannheim/korap/web/SearchKrillTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/SearchKrillTest.java
@@ -57,7 +57,7 @@
 
     @Test
     public void testSearch () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery("[orth=der]", "poliqarp");
         String result = krill.search(s.toJSON());
         JsonNode node = JsonUtils.readTree(result);
@@ -67,7 +67,7 @@
 
     @Test
     public void testTimeOut () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         s.setQuery("[orth=der]", "poliqarp");
         // s.setQuery("node ->malt/d[func=/.*/] node", "annis");
         MetaQueryBuilder meta = new MetaQueryBuilder();
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/InfoControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/InfoControllerTest.java
index ab60ba3..d8e5416 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/InfoControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/InfoControllerTest.java
@@ -39,7 +39,7 @@
                 node.at("/kustvakt_version").asText());
         assertEquals(krill.getIndex().getVersion(),
                 node.at("/krill_version").asText());
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(API_VERSION_DOUBLE);
         assertEquals(s.getVersion(), node.at("/koral_version").asText());
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/MatchInfoControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/MatchInfoControllerTest.java
index 2f3f74d..41b27f7 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/MatchInfoControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/MatchInfoControllerTest.java
@@ -55,8 +55,8 @@
     }
     
     @Test
-    public void testUsingDeprecatedMatchInfoService () throws KustvaktException {
-        Response response = target().path(API_VERSION).path("corpus")
+    public void testDeprecatedMatchInfoWithV1_0 () throws KustvaktException {
+        Response response = target().path(API_VERSION_V1_0).path("corpus")
                 .path("GOE").path("AGA").path("01784").path("p36-100")
                 .path("matchInfo")
                 .queryParam("foundry", "*").request().get();
@@ -70,6 +70,15 @@
                 + "{textId}/{matchId}",
                 node.at("/warnings/0/1").asText());
     }
+    
+    @Test
+    public void testDeprecatedMatchInfo () throws KustvaktException {
+        Response response = target().path(API_VERSION).path("corpus")
+                .path("GOE").path("AGA").path("01784").path("p36-100")
+                .path("matchInfo")
+                .queryParam("foundry", "*").request().get();
+        assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+    }
 
     @Test
     public void testGetMatchInfoWithAuthentication () throws KustvaktException {
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java
index fd2bd2d..05378f7 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/MultipleCorpusQueryTest.java
@@ -11,7 +11,6 @@
 
 import de.ids_mannheim.korap.config.SpringJerseyTest;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.utils.JsonUtils;
 
 public class MultipleCorpusQueryTest extends SpringJerseyTest {
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
index 538833e..55a31b6 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchControllerTest.java
@@ -6,16 +6,12 @@
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response.Status;
-
-import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.net.HttpHeaders;
-import jakarta.ws.rs.core.Response;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
@@ -25,7 +21,10 @@
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import org.springframework.beans.factory.annotation.Autowired;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
 
 /**
  * @author hanl, margaretha
@@ -35,6 +34,8 @@
 
     @Autowired
     private FullConfiguration config;
+    
+    private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
 
     private JsonNode requestSearchWithFields (String fields)
             throws KustvaktException {
@@ -49,7 +50,7 @@
     }
 
     private String createJsonQuery () {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[orth=der]", "poliqarp");
         s.setCollection("corpusSigle=GOE");
         s.setQuery("Wasser", "poliqarp");
@@ -139,7 +140,7 @@
         assertEquals(302, node.at("/errors/0/0").asInt());
         assertEquals(302, node.at("/errors/1/0").asInt());
         assertTrue(node.at("/errors/2").isMissingNode());
-        assertFalse(node.at("/collection").isMissingNode());
+        assertFalse(node.at("/"+COLLECTION_NODE_NAME).isMissingNode());
         assertEquals(13, node.at("/meta/count").asInt());
     }
 
@@ -397,7 +398,7 @@
     @Disabled
     @Test
     public void testSearchSimpleCQL () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("(der) or (das)", "CQL");
         Response response = target().path(API_VERSION).path("search").request()
                 .post(Entity.json(s.toJSON()));
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java
index 31abd44..db5b538 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPublicMetadataTest.java
@@ -22,6 +22,8 @@
 
 public class SearchPublicMetadataTest extends VirtualCorpusTestBase {
 
+	private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
+
     @Test
     public void testSearchPublicMetadata () throws KustvaktException {
         Response response = target().path(API_VERSION).path("search")
@@ -92,7 +94,7 @@
     @Disabled
     @Test
     public void testSearchPostPublicMetadata () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[orth=der]", "poliqarp");
         s.setCollection("corpusSigle=GOE");
         s.setQuery("Wasser", "poliqarp");
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java
index 065fcd9..97b50c6 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/StatisticsControllerTest.java
@@ -13,6 +13,7 @@
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.utils.JsonUtils;
+import de.ids_mannheim.korap.web.controller.oauth2.OAuth2TestBase;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.HttpHeaders;
 import jakarta.ws.rs.core.MediaType;
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
index 3a0c7c4..5598ce9 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
@@ -11,6 +11,7 @@
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.oauth2.constant.OAuth2ClientType;
 import de.ids_mannheim.korap.utils.JsonUtils;
+import de.ids_mannheim.korap.web.controller.oauth2.OAuth2TestBase;
 import de.ids_mannheim.korap.web.input.OAuth2ClientJson;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AccessTokenTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AccessTokenTest.java
similarity index 95%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AccessTokenTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AccessTokenTest.java
index 29c850d..bfe5fff 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AccessTokenTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AccessTokenTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -40,7 +40,7 @@
         Response response = requestTokenWithDoryPassword(superClientId,
                 clientSecret);
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
-        assertEquals("all", node.at("/scope").asText());
+        assertEquals(node.at("/scope").asText(), "all");
         String accessToken = node.at("/access_token").asText();
         
         createDoryGroup();
@@ -120,8 +120,8 @@
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(StatusCodes.AUTHORIZATION_FAILED,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Scope vc_info is not authorized",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Scope vc_info is not authorized");
     }
 
     private void testScopeNotAuthorize2 (String accessToken)
@@ -135,8 +135,8 @@
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(StatusCodes.AUTHORIZATION_FAILED,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Scope vc_access_info is not authorized",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Scope vc_access_info is not authorized");
     }
 
     @Test
@@ -149,8 +149,8 @@
         JsonNode node = JsonUtils.readTree(ent);
         assertEquals(StatusCodes.INVALID_ACCESS_TOKEN,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Access token is invalid",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Access token is invalid");
     }
 
     @Test
@@ -222,8 +222,8 @@
         node = JsonUtils.readTree(response.readEntity(String.class));
         assertEquals(StatusCodes.AUTHORIZATION_FAILED,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Scope authorize is not authorized",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Scope authorize is not authorized");
 
         revokeToken(userAuthToken, confidentialClientId, clientSecret,
                 ACCESS_TOKEN_TYPE);
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AdminControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AdminControllerTest.java
similarity index 96%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AdminControllerTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AdminControllerTest.java
index 35bfadf..80fe019 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AdminControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AdminControllerTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -165,8 +165,8 @@
         node = JsonUtils.readTree(entity);
         assertEquals(StatusCodes.AUTHORIZATION_FAILED,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Scope vc_info is not authorized",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Scope vc_info is not authorized");
         // search
         response = searchWithAccessToken(accessToken);
         assertEquals(Status.OK.getStatusCode(), response.getStatus());
@@ -182,7 +182,7 @@
         node = JsonUtils.readTree(entity);
         assertEquals(StatusCodes.INVALID_ACCESS_TOKEN,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Access token is invalid",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Access token is invalid");
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AuthorizationPostTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AuthorizationPostTest.java
similarity index 70%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AuthorizationPostTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AuthorizationPostTest.java
index 4251fc0..da1deab 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AuthorizationPostTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AuthorizationPostTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -33,6 +33,37 @@
                 .createBasicAuthorizationHeaderValue("dory", "password");
     }
 
+    @Test
+    public void testAuthorizeConfidentialClient() throws KustvaktException {
+        Form form = new Form();
+        form.param("response_type", "code");
+        form.param("client_id", confidentialClientId);
+        form.param("state", "thisIsMyState");
+        form.param("scope", "search");
+        Response response = requestAuthorizationCode(form, userAuthHeader);
+        assertEquals(Status.NOT_FOUND.getStatusCode(),
+                response.getStatus());
+    }
+
+    @Test
+    public void testAuthorizeConfidentialClientV1_0 () throws KustvaktException {
+        Form form = new Form();
+        form.param("response_type", "code");
+        form.param("client_id", confidentialClientId);
+        form.param("state", "thisIsMyState");
+        form.param("scope", "search");
+        Response response = requestAuthorizationCodeV1_0(form, userAuthHeader);
+        assertEquals(Status.TEMPORARY_REDIRECT.getStatusCode(),
+                response.getStatus());
+        URI redirectUri = response.getLocation();
+        MultiValueMap<String, String> params = UriComponentsBuilder
+                .fromUri(redirectUri).build().getQueryParams();
+        assertNotNull(params.getFirst("code"));
+        assertEquals(params.getFirst("state"), "thisIsMyState");
+        
+        testRequestTokenAuthorizationConfidential(redirectUri);
+    }
+    
     private Response requestAuthorizationCode (Form form, String authHeader)
             throws KustvaktException {
         return target().path(API_VERSION).path("oauth2").path("authorize")
@@ -43,38 +74,24 @@
                 .post(Entity.form(form));
     }
 
-    @Test
-    public void testAuthorizeConfidentialClient () throws KustvaktException {
-        Form form = new Form();
-        form.param("response_type", "code");
-        form.param("client_id", confidentialClientId);
-        form.param("state", "thisIsMyState");
-        form.param("scope", "search");
-        Response response = requestAuthorizationCode(form, userAuthHeader);
-        assertEquals(Status.TEMPORARY_REDIRECT.getStatusCode(),
-                response.getStatus());
-        URI redirectUri = response.getLocation();
-        MultiValueMap<String, String> params = UriComponentsBuilder
-                .fromUri(redirectUri).build().getQueryParams();
-        assertNotNull(params.getFirst("code"));
-        assertEquals("thisIsMyState", params.getFirst("state"));
-    }
-
-    @Test
-    public void testRequestTokenAuthorizationConfidential ()
+    private Response requestAuthorizationCodeV1_0 (Form form, String authHeader)
             throws KustvaktException {
-        Form authForm = new Form();
-        authForm.param("response_type", "code");
-        authForm.param("client_id", confidentialClientId);
-        authForm.param("scope", "search");
-        Response response = requestAuthorizationCode(authForm, userAuthHeader);
-        URI redirectUri = response.getLocation();
+        return target().path(API_VERSION_V1_0).path("oauth2").path("authorize")
+                .request().header(Attributes.AUTHORIZATION, authHeader)
+                .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
+                .header(HttpHeaders.CONTENT_TYPE,
+                        ContentType.APPLICATION_FORM_URLENCODED)
+                .post(Entity.form(form));
+    }
+    
+	private void testRequestTokenAuthorizationConfidential (URI redirectUri)
+			throws KustvaktException {
 
         MultivaluedMap<String, String> params = UriComponent
                 .decodeQuery(redirectUri, true);
         String code = params.get("code").get(0);
 
-        response = requestTokenWithAuthorizationCodeAndForm(
+        Response response = requestTokenWithAuthorizationCodeAndForm(
                 confidentialClientId, clientSecret, code);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AuthorizationTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AuthorizationTest.java
similarity index 97%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AuthorizationTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AuthorizationTest.java
index fba0ef1..917017e 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2AuthorizationTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2AuthorizationTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -88,9 +88,9 @@
                 response.getStatus());
 
         URI redirectUri = response.getLocation();
-        assertEquals("https", redirectUri.getScheme());
-        assertEquals("third.party.com", redirectUri.getHost());
-        assertEquals("/confidential/redirect", redirectUri.getPath());
+        assertEquals(redirectUri.getScheme(), "https");
+        assertEquals(redirectUri.getHost(), "third.party.com");
+        assertEquals(redirectUri.getPath(), "/confidential/redirect");
 
         String[] queryParts = redirectUri.getQuery().split("&");
         assertEquals("error_description=scope+is+required", queryParts[1]);
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ClientControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2ClientControllerTest.java
similarity index 92%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ClientControllerTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2ClientControllerTest.java
index 7980bca..ea17d10 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ClientControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2ClientControllerTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -49,8 +49,8 @@
         // public client plugin
         JsonNode clientInfo = retrieveClientInfo(publicClientId, "system");
         assertEquals(publicClientId, clientInfo.at("/client_id").asText());
-        assertEquals("public client plugin with redirect uri",
-            clientInfo.at("/client_name").asText());
+        assertEquals(clientInfo.at("/client_name").asText(),
+                "public client plugin with redirect uri");
         assertNotNull(clientInfo.at("/client_description"));
         assertNotNull(clientInfo.at("/client_url"));
         assertEquals("PUBLIC", clientInfo.at("/client_type").asText());
@@ -59,8 +59,8 @@
         clientInfo = retrieveClientInfo(confidentialClientId, "system");
         assertEquals(confidentialClientId,
                 clientInfo.at("/client_id").asText());
-        assertEquals("non super confidential client",
-            clientInfo.at("/client_name").asText());
+        assertEquals(clientInfo.at("/client_name").asText(),
+                "non super confidential client");
         assertNotNull(clientInfo.at("/client_url"));
         assertNotNull(clientInfo.at("/redirect_uri"));
         assertEquals(false, clientInfo.at("/super").asBoolean());
@@ -102,9 +102,9 @@
         Response response = registerClient(username, clientJson);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("client_name must contain at least 3 characters",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "client_name must contain at least 3 characters");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -116,9 +116,9 @@
         Response response = registerClient(username, clientJson);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("client_name must contain at least 3 characters",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "client_name must contain at least 3 characters");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -130,9 +130,9 @@
         Response response = registerClient(username, clientJson);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("client_name is null",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "client_name is null");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -144,9 +144,9 @@
         Response response = registerClient(username, clientJson);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("client_description is null",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "client_description is null");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -158,9 +158,9 @@
         Response response = registerClient(username, clientJson);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("client_type is null",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "client_type is null");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -201,7 +201,7 @@
         clientJson.setRefreshTokenExpiry(31535000);
         Response response = registerClient(username, clientJson);
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -230,9 +230,9 @@
         clientJson.setRefreshTokenExpiry(31537000);
         Response response = registerClient(username, clientJson);
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
-        assertEquals("Maximum refresh token expiry is 31536000 seconds (1 year)",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Maximum refresh token expiry is 31536000 seconds (1 year)");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -258,7 +258,7 @@
             throws KustvaktException {
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Invalid URL", node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(), "Invalid URL");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), status);
     }
 
@@ -299,7 +299,7 @@
         Response response = requestTokenWithAuthorizationCodeAndForm(clientId,
                 clientSecret, code);
         JsonNode node = JsonUtils.readTree(response.readEntity(String.class));
-        assertEquals("match_info search", node.at("/scope").asText());
+        assertEquals(node.at("/scope").asText(), "match_info search");
         String accessToken = node.at("/access_token").asText();
         OAuth2ClientJson clientJson = createOAuth2ClientJson("R client",
                 OAuth2ClientType.PUBLIC, null);
@@ -312,8 +312,8 @@
         node = JsonUtils.readTree(entity);
         assertEquals(StatusCodes.AUTHORIZATION_FAILED,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Scope register_client is not authorized",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Scope register_client is not authorized");
         assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
     }
 
@@ -416,8 +416,8 @@
         node = JsonUtils.readTree(response.readEntity(String.class));
         assertEquals(StatusCodes.INVALID_ACCESS_TOKEN,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Access token is invalid",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Access token is invalid");
     }
 
     private void testDeregisterPublicClientMissingUserAuthentication (
@@ -468,8 +468,8 @@
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Operation is not allowed for public clients",
-            node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Operation is not allowed for public clients");
     }
 
     private String testResetConfidentialClientSecret (String clientId,
@@ -513,9 +513,9 @@
         assertEquals(2, node.size());
         assertEquals(confidentialClientId, node.at("/0/client_id").asText());
         assertEquals(publicClientId, node.at("/1/client_id").asText());
-        assertEquals("non super confidential client",
-            node.at("/0/client_name").asText());
-        assertEquals("CONFIDENTIAL", node.at("/0/client_type").asText());
+        assertEquals(node.at("/0/client_name").asText(),
+                "non super confidential client");
+        assertEquals(node.at("/0/client_type").asText(), "CONFIDENTIAL");
         assertFalse(node.at("/0/client_url").isMissingNode());
         assertFalse(node.at("/0/client_description").isMissingNode());
     }
@@ -547,7 +547,7 @@
         JsonNode node = listUserClients(username,"");
         assertEquals(1, node.size());
         assertEquals(clientId, node.at("/0/client_id").asText());
-        assertEquals("OAuth2ClientTest", node.at("/0/client_name").asText());
+        assertEquals(node.at("/0/client_name").asText(), "OAuth2ClientTest");
         assertEquals(OAuth2ClientType.CONFIDENTIAL.name(),
                 node.at("/0/client_type").asText());
         assertNotNull(node.at("/0/client_description"));
@@ -684,12 +684,12 @@
                         ContentType.APPLICATION_FORM_URLENCODED)
                 .post(Entity.form(form));
         assertEquals(Status.OK.getStatusCode(), response.getStatus());
-        assertEquals("SUCCESS", response.readEntity(String.class));
+        assertEquals(response.readEntity(String.class), "SUCCESS");
         response = searchWithAccessToken(accessToken);
         node = JsonUtils.readTree(response.readEntity(String.class));
         assertEquals(StatusCodes.INVALID_ACCESS_TOKEN,
                 node.at("/errors/0/0").asInt());
-        assertEquals("Access token is invalid",
-            node.at("/errors/0/1").asText());
+        assertEquals(node.at("/errors/0/1").asText(),
+                "Access token is invalid");
     }
 }
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2ControllerTest.java
similarity index 97%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ControllerTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2ControllerTest.java
index 5fe4e47..37607b0 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2ControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2ControllerTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -98,8 +98,8 @@
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.INVALID_GRANT, node.at("/error").asText());
-        assertEquals("Invalid authorization",
-            node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Invalid authorization");
     }
 
     @Test
@@ -144,8 +144,8 @@
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.INVALID_GRANT, node.at("/error").asText());
-        assertEquals("Missing redirect URI",
-            node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Missing redirect URI");
     }
 
     private void testRequestTokenAuthorizationInvalidRedirectUri (String code)
@@ -174,8 +174,8 @@
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.INVALID_GRANT, node.at("/error").asText());
-        assertEquals("Invalid authorization",
-            node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Invalid authorization");
     }
 
     @Test
@@ -190,13 +190,13 @@
         assertEquals(TokenType.BEARER.displayName(),
                 node.at("/token_type").asText());
         assertNotNull(node.at("/expires_in").asText());
-        assertEquals("all", node.at("/scope").asText());
+        assertEquals(node.at("/scope").asText(), "all");
         String refresh = node.at("/refresh_token").asText();
         RefreshToken refreshToken = refreshTokenDao
                 .retrieveRefreshToken(refresh);
         Set<AccessScope> scopes = refreshToken.getScopes();
         assertEquals(1, scopes.size());
-        assertEquals("[all]", scopes.toString());
+        assertEquals(scopes.toString(), "[all]");
         testRefreshTokenExpiry(refresh);
     }
 
@@ -237,8 +237,8 @@
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.UNAUTHORIZED_CLIENT,
                 node.at("/error").asText());
-        assertEquals("Password grant is not allowed for third party clients",
-            node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Password grant is not allowed for third party clients");
     }
 
     @Test
@@ -250,8 +250,8 @@
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.UNAUTHORIZED_CLIENT,
                 node.at("/error").asText());
-        assertEquals("Password grant is not allowed for third party clients",
-            node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Password grant is not allowed for third party clients");
     }
 
     @Test
@@ -330,8 +330,8 @@
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
         assertEquals(OAuth2Error.INVALID_REQUEST, node.at("/error").asText());
-        assertEquals("Missing parameter: client_secret",
-            node.at("/error_description").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Missing parameter: client_secret");
     }
 
     @Test
@@ -413,7 +413,7 @@
         assertEquals(TokenType.BEARER.displayName(),
                 node.at("/token_type").asText());
         assertNotNull(node.at("/expires_in").asText());
-        assertEquals("client_info", node.at("/scope").asText());
+        assertEquals(node.at("/scope").asText(), "client_info");
     }
 
     @Test
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2DeprecationTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2DeprecationTest.java
new file mode 100644
index 0000000..934d6f3
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2DeprecationTest.java
@@ -0,0 +1,129 @@
+package de.ids_mannheim.korap.web.controller.oauth2;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.http.entity.ContentType;
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.google.common.net.HttpHeaders;
+
+import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.oauth2.constant.OAuth2ClientType;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import de.ids_mannheim.korap.web.input.OAuth2ClientJson;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
+public class OAuth2DeprecationTest extends OAuth2TestBase{
+	private String userAuthHeader;
+	private String username = "dory";
+
+    public OAuth2DeprecationTest () throws KustvaktException {
+        userAuthHeader = HttpAuthorizationHandler
+                .createBasicAuthorizationHeaderValue(username, "password");
+    }
+
+	@Test
+	public void testListClients () throws KustvaktException {
+		// authorized client
+		String code = requestAuthorizationCode(publicClientId, userAuthHeader);
+		Response response = requestTokenWithAuthorizationCodeAndForm(
+				publicClientId, "", code);
+		
+		// owned client
+		OAuth2ClientJson clientJson = createOAuth2ClientJson(
+                "OAuth2DesktopClient", OAuth2ClientType.PUBLIC,
+                "This is a desktop test client.");
+        response = registerClient(username, clientJson);
+        String entity = response.readEntity(String.class);
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        JsonNode node = JsonUtils.readTree(entity);
+        String clientId = node.at("/client_id").asText();
+        assertNotNull(clientId);
+        assertTrue(node.at("/client_secret").isMissingNode());
+
+        testListAuthorizedClients(publicClientId);
+        testListOwnedClient(clientId);
+        testFilterBy(publicClientId);
+        
+        response = target().path(API_VERSION).path("oauth2")
+                .path("client").path("deregister").path(clientId).request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue(username, "pass"))
+                .delete();
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+	}
+	
+	private void testListAuthorizedClients(String clientId) throws KustvaktException {
+		// List clients
+		Form form = getSuperClientForm();
+		form.param("authorized_only","true");
+		// V1.0
+        Response response = target().path(API_VERSION_V1_0).path("oauth2")
+                .path("client").path("list").request()
+                .header(Attributes.AUTHORIZATION, userAuthHeader)
+                .header(HttpHeaders.CONTENT_TYPE,
+                        ContentType.APPLICATION_FORM_URLENCODED)
+                .post(Entity.form(form));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(1, node.size());
+        assertEquals(clientId, node.at("/0/client_id").asText());
+        
+        // current version
+        response = target().path(API_VERSION).path("oauth2")
+                .path("client").path("list").request()
+                .header(Attributes.AUTHORIZATION, userAuthHeader)
+                .header(HttpHeaders.CONTENT_TYPE,
+                        ContentType.APPLICATION_FORM_URLENCODED)
+                .post(Entity.form(form));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        entity = response.readEntity(String.class);
+        node = JsonUtils.readTree(entity);
+        assertEquals(2, node.size());
+	}
+	
+	private void testListOwnedClient (String clientId) throws KustvaktException {
+		// List clients
+		Form form = getSuperClientForm();
+		// V1.0
+        Response response = target().path(API_VERSION_V1_0).path("oauth2")
+                .path("client").path("list").request()
+                .header(Attributes.AUTHORIZATION, userAuthHeader)
+                .header(HttpHeaders.CONTENT_TYPE,
+                        ContentType.APPLICATION_FORM_URLENCODED)
+                .post(Entity.form(form));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(1, node.size());
+        assertEquals(clientId, node.at("/0/client_id").asText());
+	}
+	
+	private void testFilterBy (String clientId) throws KustvaktException {
+		// List clients
+		Form form = getSuperClientForm();
+		form.param("filter_by","authorized_only");
+		// V1.0
+        Response response = target().path(API_VERSION_V1_0).path("oauth2")
+                .path("client").path("list").request()
+                .header(Attributes.AUTHORIZATION, userAuthHeader)
+                .header(HttpHeaders.CONTENT_TYPE,
+                        ContentType.APPLICATION_FORM_URLENCODED)
+                .post(Entity.form(form));
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(1, node.size());
+        assertEquals(clientId, node.at("/0/client_id").asText());
+	}
+	
+}
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2PluginTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2PluginTest.java
similarity index 96%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2PluginTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2PluginTest.java
index de4850b..66c5196 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2PluginTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2PluginTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -116,7 +116,7 @@
             throws ProcessingException, KustvaktException {
         JsonNode clientInfo = retrieveClientInfo(clientId, "other-user");
         assertEquals(clientId, clientInfo.at("/client_id").asText());
-        assertEquals("Plugin", clientInfo.at("/client_name").asText());
+        assertEquals(clientInfo.at("/client_name").asText(), "Plugin");
         assertEquals(OAuth2ClientType.CONFIDENTIAL.name(),
                 clientInfo.at("/client_type").asText());
         assertNotNull(clientInfo.at("/client_description").asText());
@@ -385,9 +385,9 @@
         Response response = installPlugin(form);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("Unknown client: unknown",
-            node.at("/error_description").asText());
-        assertEquals("invalid_client", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Unknown client: unknown");
+        assertEquals(node.at("/error").asText(), "invalid_client");
         assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
     }
 
@@ -399,9 +399,9 @@
         Response response = installPlugin(form);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("Missing parameter: super_client_secret",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Missing parameter: super_client_secret");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -412,9 +412,9 @@
         Response response = installPlugin(form);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("Missing parameter: super_client_id",
-            node.at("/error_description").asText());
-        assertEquals("invalid_request", node.at("/error").asText());
+        assertEquals(node.at("/error_description").asText(),
+                "Missing parameter: super_client_id");
+        assertEquals(node.at("/error").asText(), "invalid_request");
         assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
     }
 
@@ -427,7 +427,7 @@
         Response response = installPlugin(form);
         String entity = response.readEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals("unauthorized_client", node.at("/error").asText());
+        assertEquals(node.at("/error").asText(), "unauthorized_client");
         assertEquals(Status.UNAUTHORIZED.getStatusCode(), response.getStatus());
     }
 
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2RClientTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2RClientTest.java
similarity index 94%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2RClientTest.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2RClientTest.java
index 72232ff..022521b 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2RClientTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2RClientTest.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -71,8 +71,8 @@
         assertEquals(Status.TEMPORARY_REDIRECT.getStatusCode(),
                 response.getStatus());
         URI redirectUri = response.getLocation();
-        assertEquals("http", redirectUri.getScheme());
-        assertEquals("localhost", redirectUri.getHost());
+        assertEquals(redirectUri.getScheme(), "http");
+        assertEquals(redirectUri.getHost(), "localhost");
         assertEquals(1410, redirectUri.getPort());
         MultiValueMap<String, String> params = UriComponentsBuilder
                 .fromUri(redirectUri).build().getQueryParams();
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2TestBase.java b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2TestBase.java
similarity index 99%
rename from src/test/java/de/ids_mannheim/korap/web/controller/OAuth2TestBase.java
rename to src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2TestBase.java
index 01a9f4e..e8d5b94 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/OAuth2TestBase.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/oauth2/OAuth2TestBase.java
@@ -1,4 +1,4 @@
-package de.ids_mannheim.korap.web.controller;
+package de.ids_mannheim.korap.web.controller.oauth2;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupDeprecationTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupDeprecationTest.java
new file mode 100644
index 0000000..12d803b
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupDeprecationTest.java
@@ -0,0 +1,107 @@
+package de.ids_mannheim.korap.web.controller.usergroup;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
+public class UserGroupDeprecationTest extends SpringJerseyTest{
+
+	private String groupName= "GroupV1_0";
+	
+	private void testDeprecation (Response response) throws KustvaktException {
+		assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+		String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(StatusCodes.DEPRECATED,
+                node.at("/errors/0/0").asInt());
+	}
+	
+	@Test
+	public void testV1_0 () throws KustvaktException {
+		Form form = new Form();
+        form.param("members", "marlin");
+        
+        // invite member
+		Response response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/invite").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		testDeprecation(response);
+	
+		// add member role
+		response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/role/add").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		testDeprecation(response);
+		
+		// subscribe
+		response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/subscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		testDeprecation(response);
+
+		// unsusbcribe
+		response = target().path(API_VERSION_V1_0).path("group")
+                .path("@" + groupName+"/unsubscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .delete();
+		testDeprecation(response);
+	}
+	
+	@Test
+	public void testCurrentVersion () throws KustvaktException {
+		Form form = new Form();
+        form.param("members", "marlin");
+        
+        // invite member
+		Response response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/invite").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+	
+		// add member role
+		response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/role/add").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+		
+		// subscribe
+		response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/subscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .post(Entity.form(form));
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+
+		// unsusbcribe
+		response = target().path(API_VERSION).path("group")
+                .path("@" + groupName+"/unsubscribe").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .delete();
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+	}
+}
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupTestBase.java b/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupTestBase.java
index d63a681..126c89c 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupTestBase.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/usergroup/UserGroupTestBase.java
@@ -10,7 +10,7 @@
 import de.ids_mannheim.korap.constant.PredefinedRole;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import de.ids_mannheim.korap.web.controller.OAuth2TestBase;
+import de.ids_mannheim.korap.web.controller.oauth2.OAuth2TestBase;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Form;
 import jakarta.ws.rs.core.MediaType;
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java
index bb75a43..bc3e0c3 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusControllerTest.java
@@ -450,6 +450,7 @@
         assertEquals(2, node.at("/collection/operands").size());
         String json = "{\"corpusQuery\": \"corpusSigle=WPD17\"}";
         editVC("dory", "dory", "dory-vc", json);
+        
         node = testRetrieveKoralQuery("dory", "dory-vc");
         assertEquals("koral:doc", node.at("/collection/@type").asText());
         assertEquals("corpusSigle", node.at("/collection/key").asText());
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusDeprecationTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusDeprecationTest.java
new file mode 100644
index 0000000..ce43789
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/vc/VirtualCorpusDeprecationTest.java
@@ -0,0 +1,65 @@
+package de.ids_mannheim.korap.web.controller.vc;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.config.Attributes;
+import de.ids_mannheim.korap.config.SpringJerseyTest;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
+import de.ids_mannheim.korap.utils.JsonUtils;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
+public class VirtualCorpusDeprecationTest extends SpringJerseyTest{
+
+	private void testDeprecation (Response response) throws KustvaktException {
+		assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+		String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(StatusCodes.DEPRECATED,
+                node.at("/errors/0/0").asInt());
+	}
+	
+	@Test
+	public void testV1_0 () throws KustvaktException {
+        // list user or system vc
+		Response response = target().path(API_VERSION_V1_0).path("vc")
+                .path("~dory").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .get();
+		testDeprecation(response);
+	
+		// delete access by id
+		response = target().path(API_VERSION_V1_0).path("vc").path("access")
+                .path("1").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .delete();
+		testDeprecation(response);
+	}
+	
+	@Test
+	public void testCurrentVersion () throws KustvaktException {
+		 // list user or system vc
+		Response response = target().path(API_VERSION).path("vc")
+                .path("~dory").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .get();
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+	
+		// delete access by id
+		response = target().path(API_VERSION).path("vc").path("access")
+                .path("1").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("dory", "pass"))
+                .delete();
+		assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus());
+	}
+}
diff --git a/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java
index 5cf6774..e15f9aa 100644
--- a/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/lite/LiteSearchControllerTest.java
@@ -39,6 +39,9 @@
 
     @Autowired
     private KustvaktConfiguration config;
+    
+    private double apiVersion = Double.parseDouble(API_VERSION.substring(1));
+
 
     // EM: The API is disabled
     @Disabled
@@ -139,7 +142,7 @@
     @Test
     @Disabled
     public void testQueryPost () throws KustvaktException {
-        QuerySerializer s = new QuerySerializer();
+        QuerySerializer s = new QuerySerializer(apiVersion);
         s.setQuery("[orth=das]", "poliqarp");
         Response response = target().path(API_VERSION).path("search").request()
                 .post(Entity.json(s.toJSON()));
diff --git a/src/test/resources/kustvakt-test.conf b/src/test/resources/kustvakt-test.conf
index f50c4ab..efd9e29 100644
--- a/src/test/resources/kustvakt-test.conf
+++ b/src/test/resources/kustvakt-test.conf
@@ -20,8 +20,8 @@
 # Kustvakt versions
 #
 # multiple versions comma separated
-current.api.version = v1.0
-supported.api.versions = v0.1, v1.0
+current.api.version = v1.1
+supported.api.versions = v1.0, v1.1
 
 # Server
 #
