diff --git a/Changes b/Changes
index e9e4518..35f4b8f 100644
--- a/Changes
+++ b/Changes
@@ -8,6 +8,7 @@
   (#800)
 - Omit empty resource description.  
 - Added URL-encoding for corpus query at in the resource service. 
+- Fixed recaching VC at closing index.
 
 # version 0.77
 
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 82e068e..0838cf0 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
@@ -63,6 +63,9 @@
 
     @Autowired
     private KustvaktResponseHandler kustvaktResponseHandler;
+    
+    @Autowired
+    private Runnable vcLoader;
 
     @Autowired
     private SearchService searchService;
@@ -104,6 +107,8 @@
     public Response closeIndexReader () {
         try {
             searchService.closeIndexReader();
+            Thread t = new Thread(vcLoader);
+            t.start();
         }
         catch (KustvaktException e) {
             throw kustvaktResponseHandler.throwit(e);
diff --git a/src/main/java/de/ids_mannheim/korap/init/DummyNamedVCLoaderImpl.java b/src/main/java/de/ids_mannheim/korap/init/DummyNamedVCLoaderImpl.java
new file mode 100644
index 0000000..dbf8b82
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/init/DummyNamedVCLoaderImpl.java
@@ -0,0 +1,10 @@
+package de.ids_mannheim.korap.init;
+
+public class DummyNamedVCLoaderImpl implements Runnable {
+
+	@Override
+	public void run () {
+		// TODO Auto-generated method stub
+
+	}
+}
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 7bf7ccb..294c7f8 100644
--- a/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
+++ b/src/main/java/de/ids_mannheim/korap/init/NamedVCLoader.java
@@ -58,6 +58,9 @@
     @Override
     public void run () {
         try {
+        	VirtualCorpusCache.vcToCleanUp.clear();
+        	VirtualCorpusCache.map.clear();
+        	
             loadVCToCache();
         }
         catch (IOException | QueryException e) {
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java
index 3b9dfbc..83de67f 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/IndexControllerTest.java
@@ -10,15 +10,11 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.Form;
-import jakarta.ws.rs.core.MediaType;
-
 import org.apache.http.HttpStatus;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
+
 import com.fasterxml.jackson.databind.JsonNode;
-import jakarta.ws.rs.core.Response;
 
 import de.ids_mannheim.korap.authentication.http.HttpAuthorizationHandler;
 import de.ids_mannheim.korap.config.Attributes;
@@ -27,6 +23,9 @@
 import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.web.SearchKrill;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.Response;
 
 /**
  * @author margaretha
@@ -37,30 +36,52 @@
     private SearchKrill searchKrill;
 
     @Test
-    public void testCloseIndex () throws IOException, KustvaktException,
+    public void testRecachingVC_AfterClosingIndex () throws IOException, KustvaktException,
             URISyntaxException, InterruptedException {
+    	// check VC not found
+    	Response response = target().path(API_VERSION).path("vc").path("~system")
+                .path("named-vc1").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("admin", "pass"))
+                .get();
+
+    	assertEquals(HttpStatus.SC_NOT_FOUND, response.getStatus());
+    	
         URI uri = IndexControllerTest.class.getClassLoader()
                 .getResource("vc/named-vc1.jsonld").toURI();
-        Path toLink = Paths.get(uri);
-        Path symLink = Paths.get("vc/named-vc1.jsonld");
+        Path vcLink = Paths.get(uri);
+        Path targetLink = Paths.get("vc/named-vc1.jsonld");
         Path vcPath = Paths.get("vc");
         if (!Files.exists(vcPath)) {
             Files.createDirectory(vcPath);
         }
-        if (Files.exists(symLink, LinkOption.NOFOLLOW_LINKS)) {
-            Files.delete(symLink);
+        if (Files.exists(targetLink, LinkOption.NOFOLLOW_LINKS)) {
+            Files.delete(targetLink);
         }
-        Files.createSymbolicLink(symLink, toLink);
+        Files.copy(vcLink,targetLink);
         searchKrill.getStatistics(null);
         assertEquals(true, searchKrill.getIndex().isReaderOpen());
         Form form = new Form();
         form.param("token", "secret");
-        Response response = target().path(API_VERSION).path("index")
+        response = target().path(API_VERSION).path("index")
                 .path("close").request().post(Entity.form(form));
         assertEquals(HttpStatus.SC_OK, response.getStatus());
         assertEquals(false, searchKrill.getIndex().isReaderOpen());
         // Cleaning database and cache
         Thread.sleep(200);
+        
+        // check VC has been cached after closing index
+        response = target().path(API_VERSION).path("vc").path("~system")
+                .path("named-vc1").request()
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue("admin", "pass"))
+                .get();
+
+    	assertEquals(HttpStatus.SC_OK, response.getStatus());
+    	String entity = response.readEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+
+        // clean up
         response = target().path(API_VERSION).path("vc").path("~system")
                 .path("named-vc1").request()
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
@@ -68,8 +89,8 @@
                 .delete();
         response = target().path(API_VERSION).path("vc").path("~system")
                 .path("named-vc1").request().get();
-        String entity = response.readEntity(String.class);
-        JsonNode node = JsonUtils.readTree(entity);
+        entity = response.readEntity(String.class);
+        node = JsonUtils.readTree(entity);
         assertEquals(StatusCodes.NO_RESOURCE_FOUND,
                 node.at("/errors/0/0").asInt());
     }
diff --git a/src/test/resources/test-config-lite.xml b/src/test/resources/test-config-lite.xml
index 5de7bd6..703ad29 100644
--- a/src/test/resources/test-config-lite.xml
+++ b/src/test/resources/test-config-lite.xml
@@ -176,6 +176,11 @@
 		/> <bean id="searchController" class="de.ids_mannheim.korap.web.controller.SearchController" 
 		/> <bean id="statisticController" class="de.ids_mannheim.korap.web.controller.StatisticController" 
 		/> -->
+		
+	<!-- VC loader -->
+	<bean id="vcLoader"
+		class="de.ids_mannheim.korap.init.DummyNamedVCLoaderImpl" />
+	
 	<!-- Services -->
 	<bean id="scopeService"
 		class="de.ids_mannheim.korap.oauth2.service.DummyOAuth2ScopeServiceImpl" />
