diff --git a/src/test/java/de/ids_mannheim/korap/TestIndexer.java b/src/test/java/de/ids_mannheim/korap/TestIndexer.java
index 920a060..ec26670 100644
--- a/src/test/java/de/ids_mannheim/korap/TestIndexer.java
+++ b/src/test/java/de/ids_mannheim/korap/TestIndexer.java
@@ -8,6 +8,8 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
 
 import org.junit.After;
 import org.junit.AfterClass;
@@ -26,17 +28,19 @@
     private Logger logger = LoggerFactory.getLogger(TestIndexer.class);
     private final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
     private String info = "usage: Krill indexer";
-    private static File outputDirectory = new File("test-index");
-    private static File outputDirectory2 = new File("test-index2");
-    private static File outputDirectory3 = new File("test-output");
-    private static File outputDirectory4 = new File("test-output-1");
-    private static File zipIndexDirectory = new File("test-zip-index");
-    private static File zipIndexAddDirectory = new File("test-zip-index-add");
-    private static File mixedIndexDirectory = new File("test-mixed-index");
-    private static File multipleZipIndexDirectory = new File("test-multiple-zip-index");
-    private static File invalidZipIndexDirectory = new File("test-invalid-zip-index");
-    private static File mixedValidInvalidIndexDirectory = new File("test-mixed-valid-invalid-index");
-    private static File mixedContentZipIndexDirectory = new File("test-mixed-content-zip-index");
+    private static File tempBaseDirectory;
+    
+    static {
+        try {
+            tempBaseDirectory = Files.createTempDirectory("krill-test").toFile();
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to create temporary directory for tests", e);
+        }
+    }
+    
+    private static String getTestOutputPath(String subdir) {
+        return new File(tempBaseDirectory, subdir).getAbsolutePath();
+    }
 
     @Test
     public void testArguments () throws IOException {
@@ -48,7 +52,7 @@
     @Test
     public void testOutputArgument () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
-                                    "-i", "src/test/resources/bzk", "-o", "test-output"});
+                                    "-i", "src/test/resources/bzk", "-o", getTestOutputPath("test-output")});
         assertTrue(outputStream.toString().startsWith("Added or updated 1 file."));
     }
 
@@ -76,7 +80,7 @@
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i",
                                     "src/test/resources/bzk;src/test/resources/goe;src/test/resources/sgbr",
-                                    "-o", "test-index"});
+                                    "-o", getTestOutputPath("test-index")});
         assertTrue(outputStream.toString().startsWith("Added or updated 5 files."));
     }
 
@@ -91,7 +95,7 @@
     @Test
     public void testMissingConfig () throws IOException {
         Indexer.main(new String[] { "-i", "src/test/resources/bzk",
-                                    "-o test-index"});
+                                    "-o " + getTestOutputPath("test-index")});
         logger.info(outputStream.toString());
         assertEquals(true, outputStream.toString().startsWith(info));
     }
@@ -99,7 +103,7 @@
     @Test
     public void testMissingInput () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
-                                    "-o", "test-index"});
+                                    "-o", getTestOutputPath("test-index")});
         logger.info(outputStream.toString());
         assertEquals(true, outputStream.toString().startsWith(info));
     }
@@ -109,7 +113,7 @@
         Indexer.main(new String[] {
                 "-c", "src/test/resources/krill.properties",
                 "-i", "src/test/resources/bug",
-                "-o", "test-index2"
+                "-o", getTestOutputPath("test-index2")
             });
         logger.info(outputStream.toString());
         assertTrue(outputStream.toString().startsWith("Added 1 file."));
@@ -119,25 +123,27 @@
     public void testMaxTextSize () throws IOException {
         // Create a temporary properties file with the max text size setting
         File tempPropertiesFile = File.createTempFile("krill", ".properties");
-        FileWriter writer = new FileWriter(tempPropertiesFile);
-        writer.write("krill.version = ${project.version}\n");
-        writer.write("krill.name = ${project.name}\n");
-        writer.write("krill.indexDir = test-output\n");
-        writer.write("krill.index.textSize.max = 25000000\n");
-        writer.close();
+        try (FileWriter writer = new FileWriter(tempPropertiesFile)) {
+            writer.write("krill.version = ${project.version}\n");
+            writer.write("krill.name = ${project.name}\n");
+            writer.write("krill.indexDir = " + getTestOutputPath("test-output") + "\n");
+            writer.write("krill.index.textSize.max = 25000000\n");
+        }
         
-        Indexer.main(new String[] { "-c", tempPropertiesFile.getAbsolutePath(),
-                "-i", "src/test/resources/bzk", "-o", "test-output-1"});
-        assertTrue(outputStream.toString().startsWith("Added or updated 1 file."));
-        
-        tempPropertiesFile.delete();
+        try {
+            Indexer.main(new String[] { "-c", tempPropertiesFile.getAbsolutePath(),
+                    "-i", "src/test/resources/bzk", "-o", getTestOutputPath("test-output-1")});
+            assertTrue(outputStream.toString().startsWith("Added or updated 1 file."));
+        } finally {
+            tempPropertiesFile.delete();
+        }
     }
 
     @Test
     public void testZipFileInput () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i", "src/test/resources/rei/rei_sample_krill.zip",
-                                    "-o", "test-zip-index"});
+                                    "-o", getTestOutputPath("test-zip-index")});
         assertTrue(outputStream.toString().startsWith("Added or updated 3 files."));
     }
 
@@ -145,7 +151,7 @@
     public void testZipFileWithAdding () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i", "src/test/resources/rei/rei_sample_krill.zip",
-                                    "-o", "test-zip-index-add",
+                                    "-o", getTestOutputPath("test-zip-index-add"),
                                     "-a"});
         assertTrue(outputStream.toString().startsWith("Added 3 files."));
     }
@@ -154,7 +160,7 @@
     public void testMixedDirectoryAndZipInput () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i", "src/test/resources/bzk;src/test/resources/rei/rei_sample_krill.zip",
-                                    "-o", "test-mixed-index"});
+                                    "-o", getTestOutputPath("test-mixed-index")});
         assertTrue(outputStream.toString().startsWith("Added or updated 4 files."));
     }
 
@@ -162,7 +168,7 @@
     public void testMultipleZipFiles () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i", "src/test/resources/rei/rei_sample_krill.zip;src/test/resources/rei/rei_sample_krill.zip",
-                                    "-o", "test-multiple-zip-index"});
+                                    "-o", getTestOutputPath("test-multiple-zip-index")});
         // Should process 6 files total (3 from each zip)
         assertTrue(outputStream.toString().startsWith("Added or updated 6 files."));
     }
@@ -172,7 +178,7 @@
         // Test with a non-existent zip file
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i", "src/test/resources/nonexistent.zip",
-                                    "-o", "test-invalid-zip-index"});
+                                    "-o", getTestOutputPath("test-invalid-zip-index")});
         // Should handle gracefully and process 0 files
         assertTrue(outputStream.toString().startsWith("Added or updated 0 file"));
     }
@@ -181,7 +187,7 @@
     public void testMixedValidAndInvalidInputs () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i", "src/test/resources/bzk;src/test/resources/nonexistent.zip;src/test/resources/rei/rei_sample_krill.zip",
-                                    "-o", "test-mixed-valid-invalid-index"});
+                                    "-o", getTestOutputPath("test-mixed-valid-invalid-index")});
         // Should process files from valid inputs only (1 from bzk + 3 from zip = 4 files)
         assertTrue(outputStream.toString().startsWith("Added"));
     }
@@ -190,11 +196,45 @@
     public void testMixedContentZipFile () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                                     "-i", "src/test/resources/rei/mixed_test.zip",
-                                    "-o", "test-mixed-content-zip-index"});
+                                    "-o", getTestOutputPath("test-mixed-content-zip-index")});
         // Should process 2 JSON files (1 plain + 1 gzipped) and skip the .txt file
         assertTrue(outputStream.toString().startsWith("Added"));
     }
 
+    @Test
+    public void testTarFileInput () throws IOException {
+        Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
+                                    "-i", "src/test/resources/rei/rei_sample_krill.tar",
+                                    "-o", getTestOutputPath("test-tar-index")});
+        assertTrue(outputStream.toString().contains("Added or updated 3 files"));
+    }
+
+    @Test
+    public void testTarGzFileInput () throws IOException {
+        Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
+                                    "-i", "src/test/resources/rei/rei_sample_krill.tar.gz",
+                                    "-o", getTestOutputPath("test-tar-gz-index")});
+        assertTrue(outputStream.toString().contains("Added or updated 3 files"));
+    }
+
+    @Test
+    public void testMultipleTarFiles () throws IOException {
+        Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
+                                    "-i", "src/test/resources/rei/rei_sample_krill.tar;src/test/resources/rei/rei_sample_krill.tar.gz",
+                                    "-o", getTestOutputPath("test-multiple-tar-index")});
+        // Should process 6 files total (3 from each tar)
+        assertTrue(outputStream.toString().contains("Added or updated 6 files"));
+    }
+
+    @Test
+    public void testMixedZipAndTarFiles () throws IOException {
+        Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
+                                    "-i", "src/test/resources/rei/rei_sample_krill.zip;src/test/resources/rei/rei_sample_krill.tar",
+                                    "-o", getTestOutputPath("test-mixed-zip-tar-index")});
+        // Should process 6 files total (3 from zip + 3 from tar)
+        assertTrue(outputStream.toString().contains("Added or updated 6 files"));
+    }
+
     @Before
     public void setOutputStream () {
         System.setOut(new PrintStream(outputStream));
@@ -207,37 +247,12 @@
 
     @AfterClass
     public static void cleanup() {
-        File[] directories = {
-            outputDirectory, outputDirectory2, outputDirectory3, outputDirectory4,
-            zipIndexDirectory, zipIndexAddDirectory, mixedIndexDirectory,
-            multipleZipIndexDirectory, invalidZipIndexDirectory, mixedValidInvalidIndexDirectory,
-            mixedContentZipIndexDirectory
-        };
-        
-        for (File dir : directories) {
-            if (dir.exists()) {
-                deleteFile(dir);
-            }
+        if (tempBaseDirectory != null && tempBaseDirectory.exists()) {
+            deleteFile(tempBaseDirectory);
         }
     }
 
     
-    @Before
-    public void cleanOutputDirectory () {
-        File[] directories = {
-            outputDirectory, outputDirectory2, outputDirectory3, outputDirectory4,
-            zipIndexDirectory, zipIndexAddDirectory, mixedIndexDirectory,
-            multipleZipIndexDirectory, invalidZipIndexDirectory, mixedValidInvalidIndexDirectory,
-            mixedContentZipIndexDirectory
-        };
-        
-        for (File dir : directories) {
-            if (dir.exists()) {
-                logger.debug("Output directory " + dir.getName() + " exists");
-                deleteFile(dir);
-            }
-        }
-    }
 
     private static void deleteFile (File path) {
         if (path.isDirectory()) {
