diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/ExWSConf.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/ExWSConf.java
index b4523d2..10c9030 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/ExWSConf.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/ExWSConf.java
@@ -1,6 +1,6 @@
 /**
  * 
- * @author helge
+ * @author helge, ndiewald
  * 
  * Class to define the constants of the export web service, 
  * like the maximum hits to be exported
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Exporter.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Exporter.java
index c82b35b..122d03d 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Exporter.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Exporter.java
@@ -12,6 +12,7 @@
 
     // Implemented by MatchAggregator
     public boolean init (String s) throws IOException;
+    public Exporter finish () throws IOException;
     public void setMeta(JsonNode n);
     public void setQuery(JsonNode n);
     public void setCollection(JsonNode n);
@@ -21,6 +22,7 @@
     public boolean appendMatches (String s) throws IOException;
     public String getFileName ();
     public void setFileName (String s);
+    public void setFile (String id);
     public String getQueryString ();
     public void setQueryString (String s);
     public String getCorpusQueryString ();
@@ -31,8 +33,8 @@
     public boolean hasTimeExceeded ();
     public void setMaxResults (int m);
     public void setSse (EventOutput sse);
-
-    // Implemented by Exporter
+    public void forceFile ();
+    public String getExportID ();
     public ResponseBuilder serve();
     
     // Needs to be overwritten
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java
index d3de004..2346d43 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/MatchAggregator.java
@@ -9,9 +9,9 @@
 
 import java.util.Collection;
 import java.util.ArrayList;
-
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.Properties;
 
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonParser;
@@ -22,6 +22,7 @@
 
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response.Status;
 
 import org.glassfish.jersey.media.sse.EventOutput;
 import org.glassfish.jersey.media.sse.OutboundEvent;
@@ -35,6 +36,8 @@
 
 public class MatchAggregator {
 
+    private final Properties prop = ExWSConf.properties(null);
+
     private ObjectMapper mapper = new ObjectMapper();
 
     private LinkedList<JsonNode> matches;
@@ -49,7 +52,7 @@
     private int totalResults = -1;
     private int maxResults = -1;
     private int fetchedResults = 0;
-
+    
     private EventOutput evOut;
     
     public String getMimeType() {
@@ -145,6 +148,22 @@
         return this.collection;
     };
 
+    public String getExportID () {
+        if (this.file == null)
+            return "";
+        return this.file.getName();
+    };
+
+    /**
+     * Set the file based on the export ID
+     */
+    public void setFile (String exportID) {
+        this.file = new File(
+            this.getFileDirectory(),
+            exportID
+            );
+    }
+    
     public void writeHeader (Writer w) throws IOException { };
     public void writeFooter (Writer w) throws IOException { };
     public void addMatch (JsonNode n, Writer w) throws IOException { };
@@ -152,6 +171,30 @@
     public void setSse (EventOutput eventOutput) {
         this.evOut = eventOutput;
     };
+
+
+    private File getFileDirectory () {
+
+        String fileDir = prop.getProperty(
+            "conf.file_dir",
+            System.getProperty("java.io.tmpdir")
+            );
+
+        File dir = new File(fileDir);
+
+        // Create directory if not yet existing
+        if (!dir.exists()) {
+            dir.mkdir();
+        }
+
+        else if (!dir.canWrite()) {
+            fileDir = System.getProperty("java.io.tmpdir");
+            System.err.println("Unable to write to directory");
+            System.err.println("Fallback to " + fileDir);
+            dir = new File(fileDir);
+        };
+        return dir;
+    };
     
     // Send the progress
     private void sendProgress () {
@@ -176,6 +219,50 @@
     };
 
     /**
+     * Force creation of a file, even when only a few
+     * matches are requested.
+     */
+    public void forceFile () {
+
+        // Open file if not already opened
+        if (this.file == null) {
+
+            try {
+
+                File dir = getFileDirectory();
+            
+                // Create temporary file
+                this.file = File.createTempFile(
+                    "idsexp-", "." + this.getSuffix(),
+                    dir
+                    );
+
+                // better delete after it is not needed anymore
+                // this.file.deleteOnExit();
+
+                String s = null;
+
+                if (writer != null)
+                    s = writer.toString();
+
+                // Establish writer
+                writer = new BufferedWriter(new FileWriter(this.file, true));
+
+                // Add in memory string
+                if (s != null)
+                    writer.write(s);
+
+            }
+            catch (IOException e) {
+
+                // Will rely on in-memory data
+                return;
+            };
+        };
+    };
+    
+
+    /**
      * Create new match aggregator and parse initial Json
      * file to get header information and initial matches.
      */
@@ -223,23 +310,8 @@
      */
     public boolean appendMatches (String resp) throws IOException {
 
-        // Open a temp file if not already opened
-        if (this.file == null) {
-
-            // Create temporary file
-            this.file = File.createTempFile("idsexppl-", ".tmpJson");
-
-            // better delete after it is not needed anymore
-            this.file.deleteOnExit();
-
-            String s = writer.toString();
-
-            // Establish writer
-            writer = new BufferedWriter(new FileWriter(this.file, true));
-
-            // Add in memory string
-            writer.write(s);
-        };
+        // Demand creation of a file
+        this.forceFile();
 
         JsonParser parser = mapper.getFactory().createParser(resp);
         JsonNode actualObj = mapper.readTree(parser);
@@ -252,43 +324,47 @@
             );
     };
 
+    /**
+     * Finalize the export stream.
+     */
+    public Exporter finish() throws IOException {
+        this.writeFooter(this.writer);
+        this.writer.close();
+        return (Exporter) this;
+    };
+    
 
     /**
      * Serve response entity, either as a string or as a file.
      */
     public ResponseBuilder serve () {
-        try {
-            ResponseBuilder rb;
 
-            this.writeFooter(this.writer);
-            this.writer.close();
+        ResponseBuilder rb;
 
+        if (this.file == null) {
 
-            if (this.file == null) {
-                rb = Response.ok(writer.toString());
-            }
-            else {
-                rb = Response.ok(this.file);
-            };
-
-            return rb
-                .type(this.getMimeType())
-                .header(
-                    "Content-Disposition",
-                    "attachment; filename=" +
-                    this.getFileName() +
-                    '.' +
-                    this.getSuffix()
-                    );
+            // Serve stream
+            rb = Response.ok(writer.toString());
         }
+        else if (this.file.exists()) {
 
-        // Catch error
-        catch (IOException io) {
+            // Serve file
+            rb = Response.ok(this.file);
+        }
+        else {
+            // File doesn't exist
+            return Response.status(Status.NOT_FOUND);            
         };
         
-        // TODO:
-        //   Return exporter error
-        return Response.status(500).entity("error");
+        return rb
+            .type(this.getMimeType())
+            .header(
+                "Content-Disposition",
+                "attachment; filename=" +
+                this.getFileName() +
+                '.' +
+                this.getSuffix()
+                );
     };
 
 
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
index 9be9d9e..df3e53c 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Service.java
@@ -23,6 +23,7 @@
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.FormParam;
 import javax.ws.rs.QueryParam;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -39,6 +40,8 @@
 import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.Response.Status;
 
+import static org.apache.commons.io.FilenameUtils.getExtension;
+
 import org.glassfish.jersey.media.sse.EventOutput;
 import org.glassfish.jersey.media.sse.OutboundEvent;
 import org.glassfish.jersey.media.sse.SseFeature;
@@ -55,9 +58,9 @@
 /**
  * TODO:
  * - Delete the temp file of the export at the end
+ *   of the serving.
  * - Do not expect all meta data per match.
  * - Abort processing when eventsource is closed.
- * - Add progress mechanism.
  * - Upgrade default pageSize to 50.
  * - Add loading marker.
  * - Add hitc to form.
@@ -68,7 +71,7 @@
 @Path("/")
 public class Service {
 
-    Properties prop = ExWSConf.properties(null);
+    private Properties prop = ExWSConf.properties(null);
 
     private final ClassLoader cl = Thread.currentThread().getContextClassLoader();
    
@@ -96,7 +99,7 @@
 
     // Private method to run the export,
     // either static or streaming
-    private Exporter export (String fname,
+    private Exporter export(String fname,
                              String format,
                              String q,
                              String cq,
@@ -197,16 +200,7 @@
                 );
         }
 
-        Exporter exp;
-
-        // Choose the correct exporter
-        if (format.equals("json"))
-            exp = new JsonExporter();
-        else if (format.equals("csv"))
-            exp = new CsvExporter();
-        else
-            exp = new RtfExporter();
-
+        Exporter exp = getExporter(format);
         exp.setMaxResults(maxResults);
         exp.setQueryString(q);
         exp.setCorpusQueryString(cq);
@@ -218,20 +212,15 @@
         };
 
         // set progress mechanism, if required
-        if (eventOutput != null)
+        if (eventOutput != null) {
             exp.setSse(eventOutput);
+            exp.forceFile();
+        };
 
-        // TODO:
-        //   The following could be subsumed in the MatchAggregator
-        //   as a "run()" routine.
-
-        
         // Initialize exporter (with meta data and first matches)
         try {
             exp.init(resp);
-
         } catch (Exception e) {
-
             throw new WebApplicationException(
                 responseForm(
                     Status.INTERNAL_SERVER_ERROR,
@@ -257,6 +246,16 @@
         // If only one page should be exported there is no need
         // for a temporary export file
         if (cutoff) {
+            try {
+                exp.finish();
+            } catch (Exception e) {
+                throw new WebApplicationException(
+                    responseForm(
+                        Status.INTERNAL_SERVER_ERROR,
+                        e.getMessage()
+                        )
+                    );
+            };
             return exp;
         };
 
@@ -280,6 +279,9 @@
                 if (!exp.appendMatches(resp))
                     break;
             }
+
+            exp.finish();
+
         } catch (Exception e) {
             throw new WebApplicationException(
                 responseForm(
@@ -378,10 +380,11 @@
                             hitc,
                             eventOutput
                             );
+
                         if (eventOutput.isClosed())
                             return;
                         eventBuilder.name("Relocate");
-                        eventBuilder.data("...");
+                        eventBuilder.data(exp.getExportID());
                         eventOutput.write(eventBuilder.build());
                     } catch (Exception e) {
                         try {
@@ -415,6 +418,32 @@
             .build();
     };
 
+
+    /**
+     * This is the relocation target to which the event
+     * stream points to.
+     */
+    @GET
+    @Path("export/{file}")
+    @Produces(MediaType.APPLICATION_OCTET_STREAM)
+	public Response fileExport(
+        @PathParam("file") String fileStr,
+        @QueryParam("fname") String fname
+        ) {
+
+        String format = getExtension(fileStr);
+
+        // Get exporter object
+        Exporter exp = getExporter(format);
+        if (fname != null) {
+            exp.setFileName(fname);
+        };
+        exp.setFile(fileStr);
+
+        // Return without init
+        return exp.serve().build();
+    };
+    
     
     @GET
     @Path("export")
@@ -432,7 +461,18 @@
             .ok(exportJsStr, "application/javascript")
             .build();
     };
-    
+
+    // Get exporter by format
+    private Exporter getExporter (String format) {
+        // Choose the correct exporter
+        if (format.equals("json"))
+            return new JsonExporter();
+        else if (format.equals("csv"))
+            return new CsvExporter();
+        
+        return new RtfExporter();
+    };
+   
 
     // Decorate request with auth headers
     private Invocation.Builder authBuilder (Invocation.Builder reqBuilder,
diff --git a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Util.java b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Util.java
index 0ca1a94..cc024e9 100644
--- a/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Util.java
+++ b/plugin/src/main/java/de/ids_mannheim/korap/plkexport/Util.java
@@ -13,7 +13,7 @@
             .replaceFirst("^-+","")
             .replaceFirst("-+$","")
             ;
-    }
+    };
 
 	public static String streamToString (InputStream in) {
         StringBuilder sb = new StringBuilder();
@@ -30,5 +30,5 @@
         }
 
 		return sb.toString();
-	}
-}
+	};
+};
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java
index 528c63f..4cacacc 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/CsvExporterTest.java
@@ -17,6 +17,7 @@
     public void testInit () throws IOException {
         CsvExporter csv = new CsvExporter();
         csv.init("{\"query\":\"cool\"}");
+        csv.finish();
 
         Response resp = csv.serve().build();
         String x = (String) resp.getEntity();
@@ -45,6 +46,7 @@
                  "<span class=\\\"context-right\\\"> Snippet"+
                  "<span class=\\\"more\\\"></span></span>\"}"+
                  "]}");
+        csv.finish();
 
         Response resp = csv.serve().build();
         String x = (String) resp.getEntity();
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java
index 4bea7db..79a443d 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/JsonExporterTest.java
@@ -20,7 +20,7 @@
     public void testInit () throws IOException {
         JsonExporter json = new JsonExporter();
         json.init("{\"query\":\"cool\"}");
-
+        json.finish();
         Response resp = json.serve().build();
         String x = (String) resp.getEntity();
         resp.close();
@@ -31,6 +31,7 @@
     public void testInitFull () throws IOException {
         JsonExporter json = new JsonExporter();
         json.init("{\"meta\":\"ja\",\"collection\":\"hm\",\"query\":\"cool\",\"matches\":[\"first\",\"second\"]}");
+        json.finish();
 
         Response resp = json.serve().build();
         String x = (String) resp.getEntity();
@@ -43,6 +44,7 @@
         JsonExporter json = new JsonExporter();
         json.init("{\"meta\":\"ja\",\"collection\":\"hm\",\"query\":\"cool\",\"matches\":[\"first\",\"second\"]}");
         json.appendMatches("{\"meta\":\"ja2\",\"collection\":\"hm2\",\"query\":\"cool2\",\"matches\":[\"third\",\"fourth\"]}");
+        json.finish();
 
         Response resp = json.serve().build();
         File x = (File) resp.getEntity();
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java
index 52a8f71..5acf32e 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/MatchAggregatorTest.java
@@ -27,7 +27,7 @@
         assertNull(m.getQuery());
         assertNull(m.getCollection());
     };
-
+    
     @Test
     public void testSampleInit () throws IOException {
         MatchAggregator m = new MatchAggregator();
@@ -118,4 +118,11 @@
         assertEquals(m.getSource(),"/path");
     };
 
+    @Test
+    public void testFileHandling () throws IOException {
+        MatchAggregator m = new MatchAggregator();
+        assertEquals(m.getExportID(), "");
+        m.forceFile();
+        assertTrue(m.getExportID().contains("idsexp-"));
+    };
 };
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
index a146845..311d479 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/RtfExporterTest.java
@@ -17,6 +17,7 @@
     public void testInit () throws IOException {
         RtfExporter rtf = new RtfExporter();
         rtf.init("{\"query\":\"cool\"}");
+        rtf.finish();
 
         Response resp = rtf.serve().build();
         String x = (String) resp.getEntity();
@@ -45,6 +46,7 @@
                  "<span class=\\\"context-right\\\"> Snippet"+
                  "<span class=\\\"more\\\"></span></span>\"}"+
                  "]}");
+        rtf.finish();
 
         Response resp = rtf.serve().build();
         String x = (String) resp.getEntity();
@@ -70,6 +72,7 @@
                  "\"textSigle\":\"RTF/G59/34284\","+
                  "\"snippet\":\"<span class=\\\"context-left\\\"></span><span class=\\\"match\\\"><mark>Und dafür musstest Du extra ne neue Socke erstellen? Wieso traust Du Dich nicht, mit Deinem Account aufzutreten? - -- ωωσσI -  talk with me 09:17, 17. Dez. 2011 (CET) Der ist doch gesperrt. -- 09:21, 17. Dez. 2011 (CET) WWSS1, weil ich normalerweise mit IP schreibe und in dem Fall nicht möchte, dass</mark><span class=\\\"cutted\\\"></span></span><span class=\\\"context-right\\\"> meine IP öffentlich angezeigt wird. Über die IP kann man auf den Wohnort, den Provider und bei Aufenthalt am Arbeitsplatz auf den Arbeitgeber schließen, über Konto nicht. -- 09:24, 17. Dez. 2011 (CET) Bist Du denn nicht mehr selber Arbeitgeber? -- 09:31<span class=\\\"more\\\"></span></span>\"}"+
                  "]}");
+        rtf.finish();
 
         Response resp = rtf.serve().build();
         String x = (String) resp.getEntity();
diff --git a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java
index 6c51f5e..6bbcc00 100644
--- a/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java
+++ b/plugin/src/test/java/de/ids_mannheim/korap/plkexport/ServiceTest.java
@@ -785,11 +785,14 @@
 
     @Test
     public void testExportWsProgressError () throws InterruptedException {
+
+        // TODO:
+        //   Make this threadsafe
         final LinkedList<String> events = new LinkedList<>();
-        final int eventCount = 3;
+        // final int eventCount = 3;
 
         // Expect messages:
-        final CountDownLatch latch = new CountDownLatch(eventCount);
+        // final CountDownLatch latch = new CountDownLatch(eventCount);
         
         // Create SSE client
         Client client = ClientBuilder
@@ -804,13 +807,13 @@
 
         EventListener listener = inboundEvent -> {
             events.add(inboundEvent.getName() + ":" + inboundEvent.readData(String.class));
-            latch.countDown();
+            // latch.countDown();
         };
 
         eventSource.register(listener);
         eventSource.open();
 
-        latch.await(1000, TimeUnit.SECONDS);
+        // latch.await(1000, TimeUnit.SECONDS);
         Thread.sleep(2000);
 
         // Check error
@@ -888,12 +891,52 @@
         assertEquals(events.getFirst(), "Process:init");
         assertEquals(events.get(1), "Progress:0");
         assertEquals(events.get(2), "Progress:56");
-        assertEquals(events.get(3), "Relocate:...");
+        assertTrue(events.get(3).startsWith("Relocate:"));
         assertEquals(events.getLast(), "Process:done");
         assertEquals(events.size(), 5);
         eventSource.close();
+
+        // Now fetch the file!
+        String fileLoc = events.get(3).substring(9);
+        
+        String filename = "ExampleHui";
+        Response response = target("/export/" + fileLoc).queryParam("fname", filename).request().get();
+
+        String str = response.readEntity(String.class);
+        
+        assertEquals("HTTP Code",
+                     Status.OK.getStatusCode(), response.getStatus());
+        assertTrue(
+            "Request: Results should not be displayed inline, but saved and displayed locally",
+            response.getHeaderString(HttpHeaders.CONTENT_DISPOSITION)
+            .contains("attachment"));
+
+        assertTrue("Request: Filename should be set correctly: ",
+                   response.getHeaderString(HttpHeaders.CONTENT_DISPOSITION)
+                   .contains("filename=" + filename + ".rtf"));
+
+        // An RTF document should be returned
+        assertEquals("Request RTF: Http Content-Type should be: ",
+                "application/rtf",
+                response.getHeaderString(HttpHeaders.CONTENT_TYPE));
+
+        
+        assertTrue("Intro", str.contains("{\\rtf1\\ansi\\deff0"));
+        assertTrue("Outro", str.contains("{\\pard\\brdrb\\brdrs\\brdrw2\\brsp20\\par}"));
+        assertTrue("Content", str.contains("Benutzer Diskussion:Kriddl"));
     };
 
+
+    @Test
+    public void testFileServingError () {
+        String fileLoc = "hjGHJghjgHJGhjghj";
+        Response response = target("/export/" + fileLoc).request().get();
+
+        assertEquals("HTTP Code",
+                     Status.NOT_FOUND.getStatusCode(), response.getStatus());
+        
+    };
+    
     
     @Test
     public void testClientIP () {
