diff --git a/src/main/java/de/ids_mannheim/korap/index/Indexer.java b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
index 05b0261..d795e3a 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -13,6 +13,10 @@
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.DefaultParser;
@@ -39,8 +43,8 @@
  * (especially as it is way faster).
  * <br><br>
  * Input can be directories containing files in the json.gz format, or
- * zip files containing .json or .json.gz files. The indexer automatically
- * detects whether each input path is a directory or zip file. Files
+ * zip/tar files containing .json or .json.gz files. The indexer automatically
+ * detects whether each input path is a directory, zip file, or tar file. Files
  * of other formats will be skipped or not indexed. The output
  * directory can be specified in the config file. See
  * src/main/resources/krill.properties.info to create a config file.
@@ -57,7 +61,8 @@
  * Input paths can be:
  * - Directories containing .json.gz files
  * - Zip files containing .json or .json.gz files
- * - Mix of both, separated by semicolons
+ * - Tar files (including .tar.gz) containing .json or .json.gz files
+ * - Mix of any of the above, separated by semicolons
  * </pre>
  * 
  * 
@@ -163,6 +168,90 @@
 
 
     /**
+     * Parse a tar file for document files.
+     * 
+     * @param tarFile
+     *            The {@link File} tar file containing
+     *            JSON documents (plain .json or gzipped .json.gz) to index.
+     */
+    private void parseTar (File tarFile) {
+        try {
+            InputStream fileInputStream = new FileInputStream(tarFile);
+            
+            // Check if it's a gzipped tar file
+            if (tarFile.getName().toLowerCase().endsWith(".tar.gz") || 
+                tarFile.getName().toLowerCase().endsWith(".tgz")) {
+                fileInputStream = new GzipCompressorInputStream(fileInputStream);
+            }
+            
+            try (TarArchiveInputStream tarInputStream = new TarArchiveInputStream(fileInputStream)) {
+                TarArchiveEntry entry;
+                
+                while ((entry = tarInputStream.getNextTarEntry()) != null) {
+                    // Skip directories
+                    if (entry.isDirectory()) {
+                        continue;
+                    }
+                    
+                    String entryName = entry.getName();
+                    Matcher gzipMatcher = jsonFilePattern.matcher(entryName);
+                    Matcher plainMatcher = plainJsonFilePattern.matcher(entryName);
+                    
+                    boolean isGzipped = gzipMatcher.find();
+                    boolean isPlainJson = plainMatcher.find();
+                    
+                    if (isGzipped || isPlainJson) {
+                        // Read the entry content into a byte array to avoid stream closure issues
+                        byte[] entryData = new byte[(int) entry.getSize()];
+                        int totalRead = 0;
+                        while (totalRead < entryData.length) {
+                            int bytesRead = tarInputStream.read(entryData, totalRead, entryData.length - totalRead);
+                            if (bytesRead == -1) break;
+                            totalRead += bytesRead;
+                        }
+                        
+                        try (InputStream entryStream = new java.io.ByteArrayInputStream(entryData)) {
+                            if (addInsteadOfUpsert) {
+                                log.info("{} Add {} from tar {} to the index. ", 
+                                        this.count, entryName, tarFile.getName());
+                                if (this.index.addDoc(entryStream, isGzipped) == null) {
+                                    log.warn("fail.");
+                                    continue;
+                                }
+                            }
+                            else {
+                                log.info("{} Add or update {} from tar {} to the index. ", 
+                                        this.count, entryName, tarFile.getName());
+                                if (this.index.upsertDoc(entryStream, isGzipped) == null) {
+                                    log.warn("fail.");
+                                    continue;
+                                }
+                            }
+                            
+                            this.count++;
+                            if (DEBUG) {
+                                log.debug("Finished adding files. (" + count + ").");
+                            }
+
+                            // Commit in case the commit count is reached
+                            if ((this.count % this.commitCount) == 0) {
+                                this.commit();
+                            }
+                        }
+                    }
+                    else {
+                        log.warn("Skip " + entryName + " from tar " + tarFile.getName()
+                                + " since it does not have .json or .json.gz format.");
+                    }
+                }
+            }
+        }
+        catch (IOException e) {
+            log.error("Error reading tar file " + tarFile.getName(), e);
+        }
+    }
+
+    /**
      * Parse a zip file for document files.
      * 
      * @param zipFile
@@ -271,7 +360,8 @@
                 .hasArg().argName("properties file").required().build());
         options.addOption(Option.builder("i").longOpt("input")
                 .desc("input paths separated by semicolons. Can be directories containing "
-                        + "<filename>.json.gz files, or zip files containing .json or .json.gz files. "
+                        + "<filename>.json.gz files, zip files containing .json or .json.gz files, "
+                        + "or tar files (including .tar.gz) containing .json or .json.gz files. "
                         + "The indexer will automatically detect the type.")
                 .hasArgs().argName("input paths").required()
                 .valueSeparator(Character.valueOf(';')).build());
@@ -331,7 +421,7 @@
                 indexer.index.setMaxStringLength(KrillProperties.maxTextSize);
             }
 
-            // Iterate over list of input paths (auto-detect directories vs zip files)
+            // Iterate over list of input paths (auto-detect directories vs zip/tar files)
             for (String arg : inputPaths) {
                 File f = new File(arg);
                 
@@ -343,8 +433,14 @@
                     log.info("Indexing files in zip " + arg);
                     indexer.parseZip(f);
                 }
+                else if (f.isFile() && (f.getName().toLowerCase().endsWith(".tar") || 
+                                       f.getName().toLowerCase().endsWith(".tar.gz") ||
+                                       f.getName().toLowerCase().endsWith(".tgz"))) {
+                    log.info("Indexing files in tar " + arg);
+                    indexer.parseTar(f);
+                }
                 else {
-                    log.warn("Skipping " + arg + " - not a valid directory or zip file");
+                    log.warn("Skipping " + arg + " - not a valid directory, zip file, or tar file");
                 }
             }
             indexer.closeIndex();
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()) {
diff --git a/src/test/resources/rei/rei_sample_krill.tar b/src/test/resources/rei/rei_sample_krill.tar
new file mode 100644
index 0000000..f269455
--- /dev/null
+++ b/src/test/resources/rei/rei_sample_krill.tar
Binary files differ
diff --git a/src/test/resources/rei/rei_sample_krill.tar.gz b/src/test/resources/rei/rei_sample_krill.tar.gz
new file mode 100644
index 0000000..a369e48
--- /dev/null
+++ b/src/test/resources/rei/rei_sample_krill.tar.gz
Binary files differ
