diff --git a/src/main/java/de/ids_mannheim/korap/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index 7c9a19d..540db59 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -485,6 +485,20 @@
 
         return this.addDoc(doc);
     };
+
+
+    /**
+     * Update a document in the index as a {@link FieldDocument}
+     * if it already exists (based on the textSigle), otherwise
+     * insert it to the index.
+     * 
+     * @param json
+     *            The JSON document to add to the index.
+     * @return The {@link FieldDocument}.
+     */
+    public FieldDocument upsertDoc (InputStream json, boolean gzip) {
+        return this.upsertDoc(_fromFile(json, gzip));
+    };  
     
 
     /**
@@ -622,7 +636,7 @@
     public FieldDocument addDoc (InputStream json, boolean gzip) {
         return this.addDoc(_fromFile(json, gzip));
     };
-
+    
 
     /**
      * Add a document to the index as a JSON string
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 0967860..005ac2e 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -57,6 +57,7 @@
     private int commitCount;
 
     private static String path = null;
+    private static boolean addInsteadOfUpsert = false;
     private Pattern jsonFilePattern;
 
     // Init logger
@@ -103,14 +104,24 @@
             matcher = jsonFilePattern.matcher(file);
             if (matcher.find()) {
                 file = dir.getPath() + '/' + file;
-                log.info("Adding " + file + " to the index. ");
 
                 try {
-                    if (this.index.addDoc(new FileInputStream(file),
-                            true) == null) {
-                        log.warn("fail.");
-                        continue;
+                    if (addInsteadOfUpsert) {
+                        log.info("Add " + file + " to the index. ");
+                        if (this.index.addDoc(new FileInputStream(file),
+                                              true) == null) {
+                            log.warn("fail.");
+                            continue;
+                        }
                     }
+                    else {
+                        log.info("Add or update " + file + " to the index. ");
+                        if (this.index.upsertDoc(new FileInputStream(file),
+                                                 true) == null) {
+                            log.warn("fail.");
+                            continue;
+                        };
+                    };
                     this.count++;
                     if (DEBUG){
                         log.debug("Finished adding files. (" + count + ").");
@@ -175,14 +186,17 @@
                 .desc("index output directory (defaults to "
                         + "krill.indexDir in the configuration.")
                 .hasArg().argName("output directory").build());
+        options.addOption(Option.builder("a").longOpt("addInsteadofUpsert")
+                .desc("Always add files to the index, never update")
+                .build());
 
+        
         CommandLineParser parser = new DefaultParser();
 
         String propFile = null;
         String[] inputDirectories = null;
         try {
             CommandLine cmd = parser.parse(options, argv);
-
             log.info("Configuration file: " + cmd.getOptionValue("c"));
             propFile = cmd.getOptionValue("c");
             log.info("Input directories: "
@@ -193,12 +207,16 @@
                 log.info("Output directory: " + cmd.getOptionValue("o"));
                 path = cmd.getOptionValue("o");
             }
+
+            if (cmd.hasOption("a")) {
+                addInsteadOfUpsert = true;
+            };
         }
         catch (MissingOptionException e) {
             HelpFormatter formatter = new HelpFormatter();
             formatter.printHelp(
                     "Krill indexer\n java -jar -c <properties file> -i <input directories> "
-                            + "[-o <output directory>]",
+                            + "[-o <output directory> -a]",
                     options);
             return;
         }
@@ -224,7 +242,10 @@
         // Final commit
         log.info("Finished indexing.");
         // Finish indexing
-        String message = "Indexed " + indexer.count + " file";
+        String message = "Added ";
+        if (!addInsteadOfUpsert)
+            message += "or updated ";
+        message += indexer.count + " file";
         if (indexer.count > 1) {
             message += "s";
         }
diff --git a/src/test/java/de/ids_mannheim/korap/TestIndexer.java b/src/test/java/de/ids_mannheim/korap/TestIndexer.java
index 52a0094..d0925e4 100644
--- a/src/test/java/de/ids_mannheim/korap/TestIndexer.java
+++ b/src/test/java/de/ids_mannheim/korap/TestIndexer.java
@@ -29,30 +29,42 @@
     public void testArguments () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                 "-i", "src/test/resources/bzk" });
-        assertEquals("Indexed 1 file.", outputStream.toString());
+        assertEquals("Added or updated 1 file.", outputStream.toString());
     }
 
     @Test
     public void testOutputArgument () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                 "-i", "src/test/resources/bzk", "-o", "test-output"});
-        assertEquals("Indexed 1 file.", outputStream.toString());
+        assertEquals("Added or updated 1 file.", outputStream.toString());
     }
 
     @Test
     public void testMultipleInputFiles () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
                 "-i", "src/test/resources/wiki" });
-        assertEquals("Indexed 17 files.", outputStream.toString());
+        assertEquals("Added or updated 17 files.", outputStream.toString());
     }
 
+
+    @Test
+    public void testAdding () throws IOException {
+        Indexer.main(new String[] {
+                "-c", "src/test/resources/krill.properties",
+                "-i", "src/test/resources/bzk",
+                "-a" });
+        logger.info(outputStream.toString());
+        assertEquals(outputStream.toString(), "Added 1 file.");
+    }
+
+    
     @Test
     public void testMultipleInputDirectories () throws IOException {
         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" });
-        assertEquals("Indexed 5 files.", outputStream.toString());
+        assertEquals("Added or updated 5 files.", outputStream.toString());
     }
 
     @Test
@@ -70,7 +82,7 @@
         logger.info(outputStream.toString());
         assertEquals(true, outputStream.toString().startsWith(info));
     }
-
+    
     @Test
     public void testMissingInput () throws IOException {
         Indexer.main(new String[] { "-c", "src/test/resources/krill.properties",
diff --git a/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java b/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java
index 802a319..923fec1 100644
--- a/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java
+++ b/src/test/java/de/ids_mannheim/korap/index/TestFieldDocument.java
@@ -664,7 +664,11 @@
         assertEquals(mfs.getFieldValue("content"), "Example3");
 
         assertEquals(ki.numberOf("documents"), 2);
-        
+
+        // Test Inputstream method
+        ki.upsertDoc(getClass().getResourceAsStream("/wiki/WPD17-H81-63495.json.gz"), true);
+        ki.commit();
+        assertEquals(ki.numberOf("documents"), 3);
     };
 
     
