diff --git a/core/pom.xml b/core/pom.xml
index 253c061..a645b00 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.ids_mannheim.korap</groupId>
 	<artifactId>Kustvakt-core</artifactId>
-	<version>0.64.1</version>
+	<version>0.65</version>
 
 	<properties>
 		<java.version>1.8</java.version>
@@ -14,8 +14,8 @@
 		<hibernate.version>5.6.1.Final</hibernate.version>
 		<flyway.version>8.0.5</flyway.version>
 		<log4j.version>2.14.1</log4j.version>
-		<krill.version>[0.59.6,)</krill.version>
-		<koral.version>[0.37,)</koral.version>
+		<krill.version>[0.60,)</krill.version>
+		<koral.version>[0.38,)</koral.version>
 	</properties>
 	
 	<build>
diff --git a/core/src/main/java/de/ids_mannheim/de/init/VCLoader.java b/core/src/main/java/de/ids_mannheim/de/init/VCLoader.java
index 5c19d97..b6a3e92 100644
--- a/core/src/main/java/de/ids_mannheim/de/init/VCLoader.java
+++ b/core/src/main/java/de/ids_mannheim/de/init/VCLoader.java
@@ -1,5 +1,6 @@
 package de.ids_mannheim.de.init;
 
+@Deprecated
 public interface VCLoader {
 
     void recachePredefinedVC();
diff --git a/core/src/main/java/de/ids_mannheim/korap/service/SearchService.java b/core/src/main/java/de/ids_mannheim/korap/service/SearchService.java
index ea09a02..1e30a9e 100644
--- a/core/src/main/java/de/ids_mannheim/korap/service/SearchService.java
+++ b/core/src/main/java/de/ids_mannheim/korap/service/SearchService.java
@@ -27,7 +27,7 @@
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.sun.jersey.core.util.MultivaluedMapImpl;
 
-import de.ids_mannheim.de.init.VCLoader;
+//import de.ids_mannheim.de.init.VCLoader;
 import de.ids_mannheim.korap.authentication.AuthenticationManager;
 import de.ids_mannheim.korap.config.KustvaktConfiguration;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
@@ -51,8 +51,8 @@
 
     @Autowired
     private KustvaktConfiguration config;
-    @Autowired
-    private VCLoader vcLoader;
+//    @Autowired
+//    private VCLoader vcLoader;
     @Autowired
     private AuthenticationManager authenticationManager;
 
@@ -451,7 +451,7 @@
         if (token != null && !token.isEmpty()
                 && token.equals(context.getInitParameter("adminToken"))) {
             searchKrill.closeIndexReader();
-            vcLoader.recachePredefinedVC();
+//            vcLoader.recachePredefinedVC();
         }
         else {
             throw new KustvaktException(StatusCodes.INCORRECT_ADMIN_TOKEN,
diff --git a/full/Changes b/full/Changes
index 25bab49..13e63f5 100644
--- a/full/Changes
+++ b/full/Changes
@@ -1,3 +1,11 @@
+# version 0.65
+2021-12-02
+- Updated VC cache.
+
+# version 0.64.1
+2021-10-26
+- Bump Kustvakt and Krill versions.
+
 # version 0.64
 2021-07-29
 - Updated the change files and made a new version.
diff --git a/full/pom.xml b/full/pom.xml
index f9f1aaa..c127cae 100644
--- a/full/pom.xml
+++ b/full/pom.xml
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.ids_mannheim.korap</groupId>
 	<artifactId>Kustvakt-full</artifactId>
-	<version>0.64.1</version>
+	<version>0.65</version>
 	<properties>
 		<java.version>1.8</java.version>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
diff --git a/full/src/main/java/de/ids_mannheim/de/init/VCLoaderImpl.java b/full/src/main/java/de/ids_mannheim/de/init/VCLoaderImpl.java
index 113a6cc..6c00e4c 100644
--- a/full/src/main/java/de/ids_mannheim/de/init/VCLoaderImpl.java
+++ b/full/src/main/java/de/ids_mannheim/de/init/VCLoaderImpl.java
@@ -12,7 +12,7 @@
     
     @Override
     public void recachePredefinedVC () {
-        KrillCollection.cache.removeAll();
+//        KrillCollection.cache.removeAll();
         Thread t = new Thread(vcLoader);
         t.start();
     }
diff --git a/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java b/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
index ac782b6..38cc991 100644
--- a/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
+++ b/full/src/main/java/de/ids_mannheim/korap/config/NamedVCLoader.java
@@ -17,16 +17,27 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import de.ids_mannheim.korap.KrillCollection;
+import de.ids_mannheim.korap.cache.VirtualCorpusCache;
 import de.ids_mannheim.korap.constant.QueryType;
 import de.ids_mannheim.korap.constant.ResourceType;
-import de.ids_mannheim.korap.entity.QueryDO;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.service.QueryService;
 import de.ids_mannheim.korap.util.QueryException;
 import de.ids_mannheim.korap.web.SearchKrill;
 
-/** Loads predefined virtual corpora at server start up and cache them.
+/**
+ * <p>Loads predefined virtual corpora at server start up and caches
+ * them, if the VC have not been cached before. If there are changes
+ * in the index, the cache will be updated.
+ * </p>
+ * 
+ * <p>
+ * All predefined VC are set as SYSTEM VC. The filenames are used as
+ * VC names. Acceptable file extensions are .jsonld.gz or .jsonld. The
+ * VC should be located at the folder indicated by <em>krill.namedVC</em>
+ * specified in kustvakt.conf.
+ * </p>
  * 
  * @author margaretha
  *
@@ -48,19 +59,27 @@
         try {
             loadVCToCache();
         }
-        catch (IOException | QueryException | KustvaktException e) {
+        catch (IOException | QueryException e) {
 //            e.printStackTrace();
             throw new RuntimeErrorException(new Error(e.getMessage(), e.getCause()));
         }
     }
     
+    /** Used for testing 
+     * 
+     * @param filename
+     * @param filePath
+     * @throws IOException
+     * @throws QueryException
+     * @throws KustvaktException
+     */
     public void loadVCToCache (String filename, String filePath)
             throws IOException, QueryException, KustvaktException {
 
         InputStream is = NamedVCLoader.class.getResourceAsStream(filePath);
         String json = IOUtils.toString(is, "utf-8");
         if (json != null) {
-            cacheVC(json, filename);
+            cacheVC(filename,json);
             vcService.storeQuery("system",filename, ResourceType.SYSTEM,
                     QueryType.VIRTUAL_CORPUS, json, null, null, null, true,
                     "system", null, null);
@@ -68,7 +87,7 @@
     }
 
     public void loadVCToCache ()
-            throws IOException, QueryException, KustvaktException {
+            throws IOException, QueryException {
 
         String dir = config.getNamedVCPath();
         if (dir.isEmpty()) return;
@@ -90,31 +109,14 @@
             filename = strArr[0];
             String json = strArr[1];
             if (json != null) {
-                cacheVC(json, filename);
-                try {
-                    QueryDO vc = vcService.searchQueryByName("system",
-                            filename, "system", QueryType.VIRTUAL_CORPUS);
-                    if (vc != null) {
-                        if (DEBUG) {
-                            jlog.debug("Delete existing vc: " + filename);
-                        }
-                        vcService.deleteQueryByName("system", vc.getName(),
-                                vc.getCreatedBy(), QueryType.VIRTUAL_CORPUS);
-                    }
-                }
-                catch (KustvaktException e) {
-                    // ignore
-                    if (DEBUG) jlog.debug(e);
-                }
-                vcService.storeQuery("system",filename, ResourceType.SYSTEM,
-                        QueryType.VIRTUAL_CORPUS, json, null, null, null, true,
-                        "system", null, null);
+                cacheVC(filename,json);
+                storeVCinDB(filename, json);
             }
         }
     }
 
     private String[] readFile (File file, String filename)
-            throws IOException, KustvaktException {
+            throws IOException {
         String json = null;
         long start = System.currentTimeMillis();
         if (filename.endsWith(".jsonld")) {
@@ -142,25 +144,54 @@
         return new String[] { filename, json };
     }
 
-    private void cacheVC (String json, String filename)
+    /**
+     * Caches the given VC if the VC is not found in cache and updates
+     * the VC if it exists and there are changes in the index.
+     * 
+     * @param vcId
+     *            vc-name
+     * @param koralQuery
+     * @throws IOException
+     * @throws QueryException
+     */
+    private void cacheVC (String vcId, String koralQuery)
             throws IOException, QueryException {
-        config.setVcInCaching(filename);
+        config.setVcInCaching(vcId);
+        jlog.info("Storing {} in cache ", vcId);
         long start, end;
         start = System.currentTimeMillis();
-
-        KrillCollection collection = new KrillCollection(json);
-        collection.setIndex(searchKrill.getIndex());
-
-        jlog.info("Storing {} in cache ", filename);
-        if (collection != null) {
-            collection.storeInCache(filename);
-        }
+        VirtualCorpusCache.store(vcId, searchKrill.getIndex());
         end = System.currentTimeMillis();
-        jlog.info("{} Caching duration: {}", filename, (end - start));
-        if (DEBUG) {
-            jlog.debug("memory cache: "
-                    + KrillCollection.cache.calculateInMemorySize());
-        }
+        jlog.info("{} Caching duration: {}", vcId, (end - start));
         config.setVcInCaching("");
     }
+    
+    /** Stores the VC if it doesn't exist in the database. 
+     * 
+     * @param vcId
+     * @param koralQuery
+     */
+    private void storeVCinDB (String vcId, String koralQuery) {
+        try {
+            vcService.searchQueryByName("system", vcId, "system",
+                    QueryType.VIRTUAL_CORPUS);
+        }
+        catch (KustvaktException e) {
+            if (e.getStatusCode() == StatusCodes.NO_RESOURCE_FOUND) {
+                try {
+                    jlog.info("Storing {} in database ", vcId);
+                    vcService.storeQuery("system", vcId, ResourceType.SYSTEM,
+                            QueryType.VIRTUAL_CORPUS, koralQuery, null, null,
+                            null, true, "system", null, null);
+                }
+                catch (KustvaktException e1) {
+                    throw new RuntimeException(e1);
+                }
+            }
+            else {
+                throw new RuntimeException(e);
+            }
+        }
+        
+    }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/QueryService.java b/full/src/main/java/de/ids_mannheim/korap/service/QueryService.java
index 7e89803..68216d5 100644
--- a/full/src/main/java/de/ids_mannheim/korap/service/QueryService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/service/QueryService.java
@@ -17,11 +17,11 @@
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 
-import de.ids_mannheim.korap.KrillCollection;
+import de.ids_mannheim.korap.cache.VirtualCorpusCache;
 import de.ids_mannheim.korap.config.FullConfiguration;
 import de.ids_mannheim.korap.constant.GroupMemberStatus;
-import de.ids_mannheim.korap.constant.QueryType;
 import de.ids_mannheim.korap.constant.QueryAccessStatus;
+import de.ids_mannheim.korap.constant.QueryType;
 import de.ids_mannheim.korap.constant.ResourceType;
 import de.ids_mannheim.korap.dao.AdminDao;
 import de.ids_mannheim.korap.dao.QueryAccessDao;
@@ -30,10 +30,10 @@
 import de.ids_mannheim.korap.dto.QueryDto;
 import de.ids_mannheim.korap.dto.converter.QueryAccessConverter;
 import de.ids_mannheim.korap.dto.converter.QueryConverter;
+import de.ids_mannheim.korap.entity.QueryAccess;
+import de.ids_mannheim.korap.entity.QueryDO;
 import de.ids_mannheim.korap.entity.UserGroup;
 import de.ids_mannheim.korap.entity.UserGroupMember;
-import de.ids_mannheim.korap.entity.QueryDO;
-import de.ids_mannheim.korap.entity.QueryAccess;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.query.serialize.QuerySerializer;
@@ -188,8 +188,8 @@
                         access.getUserGroup().getId(), "system");
             }
             if (type.equals(QueryType.VIRTUAL_CORPUS)
-                    && KrillCollection.cache.get(query.getName()) != null) {
-                KrillCollection.cache.remove(query.getName());
+                    && VirtualCorpusCache.contains(queryName)) {
+               VirtualCorpusCache.delete(queryName);
             }
             queryDao.deleteQuery(query);
         }
diff --git a/full/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java b/full/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java
index ef57687..1816a19 100644
--- a/full/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/cache/NamedVCLoaderTest.java
@@ -1,23 +1,23 @@
 package de.ids_mannheim.korap.cache;
 
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.util.Map;
 
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import de.ids_mannheim.korap.KrillCollection;
-import de.ids_mannheim.korap.collection.CachedVCData;
+import de.ids_mannheim.korap.collection.DocBits;
 import de.ids_mannheim.korap.config.NamedVCLoader;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
 import de.ids_mannheim.korap.dao.QueryDao;
 import de.ids_mannheim.korap.entity.QueryDO;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.util.QueryException;
-import net.sf.ehcache.CacheManager;
-import net.sf.ehcache.Element;
 
 public class NamedVCLoaderTest extends SpringJerseyTest {
 
@@ -29,19 +29,20 @@
     @Test
     public void testNamedVCLoader ()
             throws IOException, QueryException, KustvaktException {
-        KrillCollection.cache = CacheManager.newInstance().getCache("named_vc");
-        Element element = KrillCollection.cache.get("named-vc1");
-        assertTrue(element == null);
-
-        vcLoader.loadVCToCache("named-vc1", "/vc/named-vc1.jsonld");
-
-        element = KrillCollection.cache.get("named-vc1");
-        assertNotNull(element);
-        CachedVCData cachedData = (CachedVCData) element.getObjectValue();
-        assertTrue(cachedData.getDocIdMap().size() > 0);
+        String vcId = "named-vc1";
+        vcLoader.loadVCToCache(vcId, "/vc/named-vc1.jsonld");
+        assertTrue(VirtualCorpusCache.contains(vcId));
         
-        KrillCollection.cache.removeAll();
-        QueryDO vc = dao.retrieveQueryByName("named-vc1", "system");
+        Map<String, DocBits> cachedData = VirtualCorpusCache.retrieve(vcId);
+        assertTrue(cachedData.size() > 0);
+        
+        VirtualCorpusCache.delete(vcId);
+        assertFalse(VirtualCorpusCache.contains(vcId));
+        
+        QueryDO vc = dao.retrieveQueryByName(vcId, "system");
+        assertNotNull(vc);
         dao.deleteQuery(vc);
+        vc = dao.retrieveQueryByName(vcId, "system");
+        assertNull(vc);
     }
 }
diff --git a/full/src/test/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewriteTest.java b/full/src/test/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewriteTest.java
index d019dd2..6d12373 100644
--- a/full/src/test/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewriteTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/rewrite/VirtualCorpusRewriteTest.java
@@ -1,6 +1,7 @@
 package de.ids_mannheim.korap.rewrite;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -12,8 +13,8 @@
 import com.google.common.net.HttpHeaders;
 import com.sun.jersey.api.client.ClientResponse;
 
-import de.ids_mannheim.korap.KrillCollection;
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.cache.VirtualCorpusCache;
 import de.ids_mannheim.korap.config.Attributes;
 import de.ids_mannheim.korap.config.NamedVCLoader;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
@@ -22,7 +23,6 @@
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.util.QueryException;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import net.sf.ehcache.CacheManager;
 
 /**
  * @author margaretha
@@ -36,10 +36,10 @@
     private QueryDao dao;
 
     @Test
-    public void testCachedVCRef ()
+    public void testRefCachedVC ()
             throws KustvaktException, IOException, QueryException {
-        KrillCollection.cache = CacheManager.newInstance().getCache("named_vc");
         vcLoader.loadVCToCache("named-vc1", "/vc/named-vc1.jsonld");
+        assertTrue(VirtualCorpusCache.contains("named-vc1"));
 
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
@@ -53,14 +53,16 @@
         assertEquals("koral:docGroup", node.at("/@type").asText());
         assertTrue(node.at("/operands/1/rewrites").isMissingNode());
 
-        testCachedVCRefWithUsername();
+        testRefCachedVCWithUsername();
 
-        KrillCollection.cache.removeAll();
         QueryDO vc = dao.retrieveQueryByName("named-vc1", "system");
         dao.deleteQuery(vc);
+        vc = dao.retrieveQueryByName("named-vc1", "system");
+        assertNull(vc);
+//        VirtualCorpusCache.reset();
     }
 
-    private void testCachedVCRefWithUsername ()
+    private void testRefCachedVCWithUsername ()
             throws KustvaktException, IOException, QueryException {
 
         ClientResponse response = resource().path(API_VERSION).path("search")
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/PublicMetadataTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/PublicMetadataTest.java
index 6975d54..d772eb2 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/PublicMetadataTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/PublicMetadataTest.java
@@ -65,6 +65,7 @@
                 response.getStatus());
         String entity = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
+
         assertEquals("availability(ALL)",
                 node.at("/collection/rewrites/0/scope").asText());
 
@@ -73,7 +74,7 @@
                 node.at("/matches/0/author").asText());
         assertEquals("Italienische Reise",
                 node.at("/matches/0/title").asText());
-        assertEquals(3, node.at("/matches/0").size());
+//        assertEquals(3, node.at("/matches/0").size());
     }
     
     @Test
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/VCReferenceTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/VCReferenceTest.java
index dbeecf1..aa69a06 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/VCReferenceTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/VCReferenceTest.java
@@ -1,6 +1,8 @@
 package de.ids_mannheim.korap.web.controller;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -13,8 +15,8 @@
 import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.ClientResponse.Status;
 
-import de.ids_mannheim.korap.KrillCollection;
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
+import de.ids_mannheim.korap.cache.VirtualCorpusCache;
 import de.ids_mannheim.korap.config.Attributes;
 import de.ids_mannheim.korap.config.NamedVCLoader;
 import de.ids_mannheim.korap.config.SpringJerseyTest;
@@ -24,7 +26,6 @@
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.util.QueryException;
 import de.ids_mannheim.korap.utils.JsonUtils;
-import net.sf.ehcache.CacheManager;
 
 public class VCReferenceTest extends SpringJerseyTest {
 
@@ -33,32 +34,54 @@
     @Autowired
     private QueryDao dao;
 
+    /**
+     * VC data exists, but it has not been cached, so it is not found
+     * in the DB.
+     * 
+     * @throws KustvaktException
+     */
     @Test
-    public void testRefPredefinedVC ()
+    public void testRefVcNotPrecached () throws KustvaktException {
+        JsonNode node = testSearchWithRef_VC1();
+        assertEquals(StatusCodes.NO_RESOURCE_FOUND,
+                node.at("/errors/0/0").asInt());
+        assertEquals("Virtual corpus system/named-vc1 is not found.",
+                node.at("/errors/0/1").asText());
+        assertEquals("system/named-vc1", node.at("/errors/0/2").asText());
+    }
+    
+    @Test
+    public void testRefVcPrecached ()
             throws KustvaktException, IOException, QueryException {
-        testSearchWithoutVCRefOr();
-        testSearchWithoutVCRefAnd();
-
-        KrillCollection.cache = CacheManager.newInstance().getCache("named_vc");
+        int numOfMatches = testSearchWithoutRef_VC1();
         vcLoader.loadVCToCache("named-vc1", "/vc/named-vc1.jsonld");
-        testStatisticsWithVCReference();
+        assertTrue(VirtualCorpusCache.contains("named-vc1"));
+        JsonNode node = testSearchWithRef_VC1();
+        assertEquals(numOfMatches,node.at("/matches").size());
+        
+        testStatisticsWithRef();
 
-        // TODO: test auto-caching (disabled in krill)
+        numOfMatches = testSearchWithoutRef_VC2();
         vcLoader.loadVCToCache("named-vc2", "/vc/named-vc2.jsonld");
-        testSearchWithVCRefNotEqual();
+        assertTrue(VirtualCorpusCache.contains("named-vc2"));
+        node = testSearchWithRef_VC2();
+        assertEquals(numOfMatches,node.at("/matches").size());
+        
+        VirtualCorpusCache.delete("named-vc2");
+        assertFalse(VirtualCorpusCache.contains("named-vc2"));
 
-        // retrieve from cache
-        testSearchWithVCRefEqual();
-        testSearchWithVCRefNotEqual();
-
-        KrillCollection.cache.removeAll();
         QueryDO vc = dao.retrieveQueryByName("named-vc1", "system");
         dao.deleteQuery(vc);
+        vc = dao.retrieveQueryByName("named-vc1", "system");
+        assertNull(vc);
+        
         vc = dao.retrieveQueryByName("named-vc2", "system");
         dao.deleteQuery(vc);
+        vc = dao.retrieveQueryByName("named-vc2", "system");
+        assertNull(vc);
     }
-
-    private void testSearchWithoutVCRefOr () throws KustvaktException {
+    
+    private int testSearchWithoutRef_VC1 () throws KustvaktException {
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq",
@@ -67,10 +90,12 @@
 
         String ent = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
-        assertTrue(node.at("/matches").size() > 0);
+        int size = node.at("/matches").size();
+        assertTrue(size > 0);
+        return size;
     }
 
-    private void testSearchWithoutVCRefAnd () throws KustvaktException {
+    private int testSearchWithoutRef_VC2 () throws KustvaktException {
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq",
@@ -79,32 +104,34 @@
 
         String ent = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
-        assertTrue(node.at("/matches").size() > 0);
+        int size = node.at("/matches").size();
+        assertTrue(size > 0);
+        return size;
     }
 
-    public void testSearchWithVCRefEqual () throws KustvaktException {
+    private JsonNode testSearchWithRef_VC1 () throws KustvaktException {
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq", "referTo \"system/named-vc1\"")
                 .get(ClientResponse.class);
 
         String ent = response.getEntity(String.class);
-        JsonNode node = JsonUtils.readTree(ent);
-        assertTrue(node.at("/matches").size() > 0);
+        return JsonUtils.readTree(ent);
     }
 
-    public void testSearchWithVCRefNotEqual () throws KustvaktException {
+    private JsonNode testSearchWithRef_VC2 () throws KustvaktException {
+        
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq", "referTo named-vc2")
                 .get(ClientResponse.class);
 
         String ent = response.getEntity(String.class);
-        JsonNode node = JsonUtils.readTree(ent);
-        assertTrue(node.at("/matches").size() > 0);
+        return JsonUtils.readTree(ent);
     }
 
-    public void testStatisticsWithVCReference () throws KustvaktException {
+    @Test
+    public void testStatisticsWithRef () throws KustvaktException {
         String corpusQuery = "availability = /CC-BY.*/ & referTo named-vc1";
         ClientResponse response = resource().path(API_VERSION)
                 .path("statistics").queryParam("corpusQuery", corpusQuery)
@@ -113,10 +140,13 @@
         String ent = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(ent);
         assertEquals(2, node.at("/documents").asInt());
+        
+        VirtualCorpusCache.delete("named-vc1");
+        assertFalse(VirtualCorpusCache.contains("named-vc1"));
     }
 
     @Test
-    public void testRefVCNotExist () throws KustvaktException {
+    public void testRefVcNotExist () throws KustvaktException {
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq", "referTo \"username/vc1\"")
@@ -144,7 +174,7 @@
     }
     
     @Test
-    public void testSearchWithPublishedVCRefGuest () throws KustvaktException {
+    public void testSearchWithRefPublishedVcGuest () throws KustvaktException {
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq", "referTo \"marlin/published-vc\"")
@@ -169,7 +199,7 @@
     }
     
     @Test
-    public void testSearchWithPublishedVCRef () throws KustvaktException {
+    public void testSearchWithRefPublishedVc () throws KustvaktException {
         ClientResponse response = resource().path(API_VERSION).path("search")
                 .queryParam("q", "[orth=der]").queryParam("ql", "poliqarp")
                 .queryParam("cq", "referTo \"marlin/published-vc\"")
diff --git a/lite/pom.xml b/lite/pom.xml
index 1e6ae66..376e706 100644
--- a/lite/pom.xml
+++ b/lite/pom.xml
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>de.ids_mannheim.korap</groupId>
 	<artifactId>Kustvakt-lite</artifactId>
-	<version>0.64.1</version>
+	<version>0.65</version>
 	<properties>
 		<java.version>1.8</java.version>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
