diff --git a/pom.xml b/pom.xml
index 31efb78..7035a00 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,341 +1,344 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
 
-  <!--
-      ** Server
-      # Start the server with
-      $ mvn compile exec:java
-
-      # Or after packaging
-      $ mvn clean package
-      # with
-      $ java -jar target/Krill-Server.jar
-
-
-      ** Formatter
-      # Format the code with
-      $ mvn java-formatter:format
-
-      ** Indexer after packaging (see above)
-      $ java -jar target/Krill-Indexer.jar
-             -cfg src/main/resources/krill.properties
-             /data/hdd/lucene-new/WPD/
-  -->
-
-  <groupId>de.ids_mannheim.korap</groupId>
-  <artifactId>Krill</artifactId>
-  <version>0.55.7</version>
-  <packaging>jar</packaging>
-
-  <name>Krill</name>
-  <url>http://www.ids-mannheim.de/</url>
-
-  <organization>
-    <name>IDS Mannheim</name>
-    <url>http://www.ids-mannheim.de/</url>
-  </organization>
-
-  <developers>
-    <developer>
-      <name>Nils Diewald</name>
-      <email>diewald@ids-mannheim.de</email>
-      <url>http://nils-diewald.de</url>
-    </developer>
-    <developer>
-      <name>Eliza Margaretha</name>
-      <email>margaretha@ids-mannheim.de</email>
-    </developer>
-  </developers>
-
-  <properties>
-    <jersey.version>2.15</jersey.version>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-  </properties>
-
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.glassfish.jersey</groupId>
-        <artifactId>jersey-bom</artifactId>
-        <version>${jersey.version}</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
-  <dependencies>	
-    <!-- junit dependency -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.11</version>
-      <scope>test</scope>
-    </dependency>
-
-    <!-- log4j dependency -->
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <version>1.2.17</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <version>1.7.5</version>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jul-to-slf4j</artifactId>
-      <version>1.7.5</version>
-    </dependency>
-
-    <!-- SQLite for database connection tests -->
-    <dependency>
-      <groupId>org.xerial</groupId>
-      <artifactId>sqlite-jdbc</artifactId>
-      <version>3.7.2</version>
-    </dependency>
-
-    <!-- Database Connection Pool Manager -->
-    <dependency>
-      <groupId>c3p0</groupId>
-      <artifactId>c3p0</artifactId>
-      <version>0.9.1.2</version>
-    </dependency>
+	<!-- ** Server 
+	     
+	     # Start the server with 
+	  
+	       $ mvn compile exec:java 
+	
+	     # Or after packaging 
+	       
+	       $ mvn clean package 
     
-    <!-- Lucene core dependency -->
-    <dependency>
-      <artifactId>lucene-core</artifactId>
-      <groupId>org.apache.lucene</groupId>
-      <type>jar</type>
-      <version>5.0.0</version>
-    </dependency>
+         # with 
+	       
+	       $ java -jar target/Krill-Server.jar
+	   
+         ** Formatter 
+         
+         # Format the code with $ mvn java-formatter:format 
+         
+         ** Indexer 
+		 # after packaging (see above) 
+		 
+		 $ java -jar target/Krill-Indexer.jar -c [configuration file] 
+		 -i [input directories] -o [output directory] 
+		
+         for example:
+         
+         $ java -jar target/Krill-Indexer.jar -c src/test/resources/krill.properties
+		 -i src/test/resources/bzk -o index/ 
+		 		
+		-->
 
-    <!-- Lucene queryparser dependency -->
-    <dependency>
-      <artifactId>lucene-queryparser</artifactId>
-      <groupId>org.apache.lucene</groupId>
-      <type>jar</type>
-      <version>5.0.0</version>
-    </dependency>
+	<groupId>de.ids_mannheim.korap</groupId>
+	<artifactId>Krill</artifactId>
+	<version>0.55.7</version>
+	<packaging>jar</packaging>
 
-    <!-- Lucene analyzers dependency -->
-    <dependency>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <groupId>org.apache.lucene</groupId>
-      <type>jar</type>
-      <version>5.0.0</version>
-    </dependency>
+	<name>Krill</name>
+	<url>http://www.ids-mannheim.de/</url>
 
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-core</artifactId>
-      <version>1.3</version>
-    </dependency>
+	<organization>
+		<name>IDS Mannheim</name>
+		<url>http://www.ids-mannheim.de/</url>
+	</organization>
 
-    <!-- JCache -->
-    <dependency>
-      <groupId>net.sf.jsr107cache</groupId>
-      <artifactId>jsr107cache</artifactId>
-      <version>1.0</version>
-    </dependency>
+	<developers>
+		<developer>
+			<name>Nils Diewald</name>
+			<email>diewald@ids-mannheim.de</email>
+			<url>http://nils-diewald.de</url>
+		</developer>
+		<developer>
+			<name>Eliza Margaretha</name>
+			<email>margaretha@ids-mannheim.de</email>
+		</developer>
+	</developers>
 
-    <!-- Jersey -->
-    <dependency>
-      <groupId>org.glassfish.jersey.containers</groupId>
-      <artifactId>jersey-container-grizzly2-http</artifactId>
-    </dependency>
+	<properties>
+		<jersey.version>2.15</jersey.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
 
-    <!-- JSON support in Jersey -->
-    <dependency>
-      <groupId>com.fasterxml.jackson.jaxrs</groupId>
-      <artifactId>jackson-jaxrs-json-provider</artifactId>
-      <version>2.4.4</version>
-    </dependency>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>org.glassfish.jersey</groupId>
+				<artifactId>jersey-bom</artifactId>
+				<version>${jersey.version}</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
 
-    <!-- JSON support using Jackson -->
-    <!-- see https://github.com/FasterXML/jackson-core -->
-    <!-- https://github.com/FasterXML/jackson-databind -->
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>2.4.4</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-annotations</artifactId>
-      <version>2.4.4</version>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-core</artifactId>
-      <version>2.4.4</version>
-    </dependency>
+	<dependencies>
+		<!-- junit dependency -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.11</version>
+			<scope>test</scope>
+		</dependency>
 
-    <!-- JSON-LD support -->
-    <!--
-    <dependency>
-      <groupId>com.github.jsonld-java</groupId>
-      <artifactId>jsonld-java</artifactId>
-      <version>0.5.2-SNAPSHOT</version>
-    </dependency>
+		<!-- log4j dependency -->
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>1.2.17</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+			<version>1.7.5</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>jul-to-slf4j</artifactId>
+			<version>1.7.5</version>
+		</dependency>
 
-    Temporarily disable @Experimental annotation
-    <dependency>
-      <groupId>KorapAnnotationProcessor</groupId>
-      <artifactId>KorapAnnotationProcessor</artifactId>
-      <version>0.0.1-SNAPSHOT</version>
-      <scope>compile</scope>
-    </dependency>
-    -->
+		<!-- SQLite for database connection tests -->
+		<dependency>
+			<groupId>org.xerial</groupId>
+			<artifactId>sqlite-jdbc</artifactId>
+			<version>3.7.2</version>
+		</dependency>
 
-    <!-- Some language extensions like StringUtil -->
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>2.3</version>
-    </dependency>
-  </dependencies>
+		<!-- Database Connection Pool Manager -->
+		<dependency>
+			<groupId>c3p0</groupId>
+			<artifactId>c3p0</artifactId>
+			<version>0.9.1.2</version>
+		</dependency>
 
-  <build>
-    <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
-    <outputDirectory>${basedir}/bin</outputDirectory>
-    <plugins>
-      <plugin>
-	<artifactId>maven-compiler-plugin</artifactId>
-	<version>2.5.1</version>
-	<inherited>true</inherited>
-	<configuration>
-	  <showWarnings>true</showWarnings>
-	  <source>1.7</source>
-	  <target>1.7</target>
-	</configuration>
-      </plugin>
+		<!-- Lucene core dependency -->
+		<dependency>
+			<artifactId>lucene-core</artifactId>
+			<groupId>org.apache.lucene</groupId>
+			<type>jar</type>
+			<version>5.0.0</version>
+		</dependency>
 
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-shade-plugin</artifactId>
-        <version>2.4.1</version>
-        <executions>
-          <execution>
-	    <id>indexer</id>
-            <phase>package</phase>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-            <configuration>
-              <transformers>
-                <transformer
-		    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                  <mainClass>de.ids_mannheim.korap.index.Indexer</mainClass>
-                </transformer>
-              </transformers>
-	      <finalName>${project.artifactId}-Indexer</finalName>
-            </configuration>
-          </execution>
-          <execution>
-	    <id>server</id>
-            <phase>package</phase>
-            <goals>
-              <goal>shade</goal>
-            </goals>
-            <configuration>
-              <transformers>
-                <transformer
-		    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                  <mainClass>de.ids_mannheim.korap.server.Node</mainClass>
-                </transformer>
-                <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                  <resource>krill.properties</resource>
-                </transformer>
-              </transformers>
-	      <finalName>${project.name}-Server</finalName>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
+		<!-- Lucene queryparser dependency -->
+		<dependency>
+			<artifactId>lucene-queryparser</artifactId>
+			<groupId>org.apache.lucene</groupId>
+			<type>jar</type>
+			<version>5.0.0</version>
+		</dependency>
 
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.16</version>
-        <configuration>
-          <excludes>
-            <exclude>**/benchmark/*</exclude>
-            <exclude>**/TestWPDIndex.java</exclude>
-            <exclude>**/TestRealIndex.java</exclude>
-	  </excludes>
-        </configuration>
-      </plugin> 
+		<!-- Lucene analyzers dependency -->
+		<dependency>
+			<artifactId>lucene-analyzers-common</artifactId>
+			<groupId>org.apache.lucene</groupId>
+			<type>jar</type>
+			<version>5.0.0</version>
+		</dependency>
 
-      <!--
-	  Formatter plugin for Eclipse based coding conventions
-	  http://maven-java-formatter-plugin.googlecode.com/svn/site/0.4/usage.html
-      -->
-      <plugin>
-        <groupId>com.googlecode.maven-java-formatter-plugin</groupId>
-        <artifactId>maven-java-formatter-plugin</artifactId>
-        <version>0.4</version>
-	<configuration>
-	  <configFile>${project.basedir}/Format.xml</configFile>
-	  <overrideConfigCompilerVersion>true</overrideConfigCompilerVersion>
-	  <compilerSource>1.7</compilerSource>
-	  <compilerCompliance>1.7</compilerCompliance>
-	  <compilerTargetPlatform>1.7</compilerTargetPlatform>
-	</configuration>
-      </plugin>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-core</artifactId>
+			<version>1.3</version>
+		</dependency>
 
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>exec-maven-plugin</artifactId>
-        <version>1.2.1</version>
-        <executions>
-          <execution>
-            <goals>
-              <goal>java</goal>
-            </goals>
-          </execution>
-        </executions>
-        <configuration>
-          <mainClass>de.ids_mannheim.korap.server.Node</mainClass>
-        </configuration>
-      </plugin>
-    </plugins>
+		<!-- JCache -->
+		<dependency>
+			<groupId>net.sf.jsr107cache</groupId>
+			<artifactId>jsr107cache</artifactId>
+			<version>1.0</version>
+		</dependency>
 
-    <resources>
-      <resource>
-        <directory>src/main/resources</directory>
-        <filtering>true</filtering>
-	<includes>
-	  <include>krill.info</include>
-	</includes>
-      </resource>
-      <resource>
-        <directory>src/main/resources</directory>
-        <filtering>false</filtering>
-	<excludes>
-	  <exclude>krill.info</exclude>
-	</excludes>
-      </resource>
-    </resources> 
+		<!-- Jersey -->
+		<dependency>
+			<groupId>org.glassfish.jersey.containers</groupId>
+			<artifactId>jersey-container-grizzly2-http</artifactId>
+		</dependency>
 
-    <testResources>
-      <testResource>
-        <directory>src/test/resources</directory>
-        <filtering>true</filtering>
-	<includes>
-	  <include>krill.properties</include>
-	</includes>
-      </testResource>
-      <testResource>
-        <directory>src/test/resources</directory>
-        <filtering>false</filtering>
-	<excludes>
-	  <exclude>krill.properties</exclude>
-	</excludes>
-      </testResource>
-    </testResources> 
-  </build>
+		<!-- JSON support in Jersey -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.jaxrs</groupId>
+			<artifactId>jackson-jaxrs-json-provider</artifactId>
+			<version>2.4.4</version>
+		</dependency>
+
+		<!-- JSON support using Jackson -->
+		<!-- see https://github.com/FasterXML/jackson-core -->
+		<!-- https://github.com/FasterXML/jackson-databind -->
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+			<version>2.4.4</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-annotations</artifactId>
+			<version>2.4.4</version>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-core</artifactId>
+			<version>2.4.4</version>
+		</dependency>
+
+		<!-- JSON-LD support -->
+		<!-- <dependency> <groupId>com.github.jsonld-java</groupId> <artifactId>jsonld-java</artifactId> 
+			<version>0.5.2-SNAPSHOT</version> </dependency> Temporarily disable @Experimental 
+			annotation <dependency> <groupId>KorapAnnotationProcessor</groupId> <artifactId>KorapAnnotationProcessor</artifactId> 
+			<version>0.0.1-SNAPSHOT</version> <scope>compile</scope> </dependency> -->
+
+		<!-- Some language extensions like StringUtil -->
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.3</version>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-cli</groupId>
+			<artifactId>commons-cli</artifactId>
+			<version>1.3.1</version>
+		</dependency>
+	</dependencies>
+
+	<build>
+		<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
+		<outputDirectory>${basedir}/bin</outputDirectory>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.5.1</version>
+				<inherited>true</inherited>
+				<configuration>
+					<showWarnings>true</showWarnings>
+					<source>1.7</source>
+					<target>1.7</target>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-shade-plugin</artifactId>
+				<version>2.4.1</version>
+				<executions>
+					<execution>
+						<id>indexer</id>
+						<phase>package</phase>
+						<goals>
+							<goal>shade</goal>
+						</goals>
+						<configuration>
+							<transformers>
+								<transformer
+									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+									<mainClass>de.ids_mannheim.korap.index.Indexer</mainClass>
+								</transformer>
+							</transformers>
+							<finalName>${project.artifactId}-Indexer</finalName>
+						</configuration>
+					</execution>
+					<execution>
+						<id>server</id>
+						<phase>package</phase>
+						<goals>
+							<goal>shade</goal>
+						</goals>
+						<configuration>
+							<transformers>
+								<transformer
+									implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+									<mainClass>de.ids_mannheim.korap.server.Node</mainClass>
+								</transformer>
+								<transformer
+									implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+									<resource>krill.properties</resource>
+								</transformer>
+							</transformers>
+							<finalName>${project.name}-Server</finalName>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>2.16</version>
+				<configuration>
+					<excludes>
+						<exclude>**/benchmark/*</exclude>
+						<exclude>**/TestWPDIndex.java</exclude>
+						<exclude>**/TestRealIndex.java</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+
+			<!-- Formatter plugin for Eclipse based coding conventions http://maven-java-formatter-plugin.googlecode.com/svn/site/0.4/usage.html -->
+			<plugin>
+				<groupId>com.googlecode.maven-java-formatter-plugin</groupId>
+				<artifactId>maven-java-formatter-plugin</artifactId>
+				<version>0.4</version>
+				<configuration>
+					<configFile>${project.basedir}/Format.xml</configFile>
+					<overrideConfigCompilerVersion>true</overrideConfigCompilerVersion>
+					<compilerSource>1.7</compilerSource>
+					<compilerCompliance>1.7</compilerCompliance>
+					<compilerTargetPlatform>1.7</compilerTargetPlatform>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>exec-maven-plugin</artifactId>
+				<version>1.2.1</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>java</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<mainClass>de.ids_mannheim.korap.server.Node</mainClass>
+				</configuration>
+			</plugin>
+		</plugins>
+
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>true</filtering>
+				<includes>
+					<include>krill.info</include>
+				</includes>
+			</resource>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>false</filtering>
+				<excludes>
+					<exclude>krill.info</exclude>
+				</excludes>
+			</resource>
+		</resources>
+
+		<testResources>
+			<testResource>
+				<directory>src/test/resources</directory>
+				<filtering>true</filtering>
+				<includes>
+					<include>krill.properties</include>
+				</includes>
+			</testResource>
+			<testResource>
+				<directory>src/test/resources</directory>
+				<filtering>false</filtering>
+				<excludes>
+					<exclude>krill.properties</exclude>
+				</excludes>
+			</testResource>
+		</testResources>
+	</build>
 </project>
diff --git a/src/main/java/de/ids_mannheim/korap/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index 06713b2..e4a6594 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -556,7 +556,7 @@
 
         // Fail to add json object
         catch (IOException e) {
-            log.error("File {} not found", json);
+            log.error("File {} not found", json, e);
         };
         return (FieldDocument) null;
     };
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 b5dfd20..96054cc 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -1,7 +1,19 @@
 package de.ids_mannheim.korap.index;
 
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.io.*;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.MissingOptionException;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.lang.StringUtils;
 import org.apache.lucene.store.MMapDirectory;
 import de.ids_mannheim.korap.KrillIndex;
 import static de.ids_mannheim.korap.util.KrillProperties.*;
@@ -18,6 +30,9 @@
  * 
  * Usage: java -jar Krill-Indexer.jar [--config propfile]
  * [directories]*
+ * 
+ * @author diewald, margaretha
+ *
  */
 public class Indexer {
     KrillIndex index;
@@ -26,9 +41,10 @@
 
     // private static String propFile = "krill.properties";
     private static String path = null;
+    private static Pattern jsonFilePattern;
 
     // Init logger
-    private final static Logger log = LoggerFactory.getLogger(KrillIndex.class);
+    private final static Logger log = LoggerFactory.getLogger(Indexer.class);
 
 
     /**
@@ -41,9 +57,9 @@
     public Indexer (Properties prop) throws IOException {
         if (this.path == null) {
             this.path = prop.getProperty("krill.indexDir");
-        };
+        }
 
-        System.out.println("Index to " + this.path);
+        log.info("Output directory: " + this.path);
 
         // Default to 1000 documents till the next commit
         String commitCount = prop.getProperty("krill.index.commit.count",
@@ -53,7 +69,9 @@
         this.index = new KrillIndex(new MMapDirectory(Paths.get(this.path)));
         this.count = 0;
         this.commitCount = Integer.parseInt(commitCount);
-    };
+
+        jsonFilePattern = Pattern.compile(".*\\.json\\.gz$");
+    }
 
 
     /**
@@ -64,47 +82,51 @@
      *            documents to index.
      */
     public void parse (File dir) {
+        Matcher matcher;
         for (String file : dir.list()) {
-            if (file.matches("^[^\\.].+?\\.json\\.gz$")) {
-                String found = dir.getPath() + '/' + file;
-                System.out.print("  Index " + found + " ... ");
+            //log.info("Json file: "+file);
+            matcher = jsonFilePattern.matcher(file);
+            if (matcher.find()) {
+                file = dir.getPath() + '/' + file;
+                log.info("Adding " + file + " to the index. ");
 
                 // Add file to the index
                 try {
-                    if (this.index.addDoc(new FileInputStream(found),
+                    if (this.index.addDoc(new FileInputStream(file),
                             true) == null) {
-                        System.out.println("fail.");
+                        log.warn("fail.");
                         continue;
-                    };
-                    System.out.println("done (" + count + ").");
+                    }
                     this.count++;
+                    log.debug("Finished adding files. (" + count + ").");
 
                     // Commit in case the commit count is reached
                     if ((this.count % this.commitCount) == 0)
                         this.commit();
                 }
                 catch (FileNotFoundException e) {
-                    System.out.println("not found!");
-                };
-            };
-        };
-    };
+                    log.error("File " + file + " is not found!");
+                }
+            }
+            else {
+                log.warn(file + " does not have json.gz format.");
+            }
+        }
+    }
 
 
     /**
      * Commit changes to the index.
      */
     public void commit () {
-        System.out.println("-----");
-        System.out.print("  Commit ... ");
+        log.info("Committing index ... ");
         try {
             this.index.commit();
         }
         catch (IOException e) {
-            System.err.println("Unable to commit to index " + this.path);
-        };
-        System.out.println("done.");
-    };
+            log.error("Unable to commit to index " + this.path);
+        }
+    }
 
 
     /**
@@ -118,75 +140,71 @@
      */
     public static void main (String[] argv) throws IOException {
 
-        if (argv.length == 0) {
-            String jar = new File(Indexer.class.getProtectionDomain()
-                    .getCodeSource().getLocation().getPath()).getName();
+        Options options = new Options();
+        options.addOption(Option.builder("c").longOpt("config")
+                .desc("configuration file (defaults to "
+                        + de.ids_mannheim.korap.util.KrillProperties.propStr
+                        + ").")
+                .hasArg().argName("properties file").required().build());
+        options.addOption(Option.builder("i").longOpt("inputDir")
+                .desc("input directories separated by semicolons. The input files "
+                        + "have to be in <filename>.json.gz format. ")
+                .hasArgs().argName("input directories").required()
+                .valueSeparator(new Character(';')).build());
+        options.addOption(Option.builder("o").longOpt("outputDir")
+                .desc("index output directory (defaults to "
+                        + "krill.indexDir in the configuration.")
+                .hasArg().argName("output directory").build());
 
-            System.out.println(
-                    "Add documents from a directory to the Krill index.");
-            System.out.println("Usage: java -jar " + jar
-                    + " [--config propfile] [directories]*");
-            System.out.println();
-            System.err.println("  --config|-c    Configuration file");
-            System.err.println("                 (defaults to "
-                    + de.ids_mannheim.korap.util.KrillProperties.propStr + ")");
-            System.err.println("  --indexDir|-d  Index directory");
-            System.err.println("                 (defaults to krill.indexDir"
-                    + " in configuration)");
-            System.err.println();
-            return;
-        };
+        CommandLineParser parser = new DefaultParser();
 
-        int i = 0;
-        boolean last = false;
         String propFile = null;
+        String[] inputDirectories = null;
+        try {
+            CommandLine cmd = parser.parse(options, argv);
 
-        for (i = 0; i < argv.length; i += 2) {
-            switch (argv[i]) {
-                case "--config":
-                case "-cfg":
-                case "-c":
-                    propFile = argv[i + 1];
-                    break;
-                case "--indexDir":
-                case "-d":
-                    path = argv[i + 1];
-                    break;
-                default:
-                    last = true;
-                    break;
-            };
+            log.info("Configuration file: " + cmd.getOptionValue("c"));
+            propFile = cmd.getOptionValue("c");
+            log.info("Input directories: "
+                    + StringUtils.join(cmd.getOptionValues("i"), ";"));
+            inputDirectories = cmd.getOptionValues("i");
 
-            if (last)
-                break;
-        };
+            if (cmd.hasOption("o")) {
+                log.info("Output directory: " + cmd.getOptionValue("o"));
+                path = cmd.getOptionValue("o");
+            }
+        }
+        catch (MissingOptionException e) {
+            HelpFormatter formatter = new HelpFormatter();
+            formatter.printHelp(
+                    "Krill indexer\n java -jar -c <properties file> -i <input directories> "
+                            + "[-o <output directory>]",
+                    options);
+            System.exit(0);
+        }
+        catch (ParseException e) {
+            log.error("Unexpected error: " + e);
+            e.printStackTrace();
+        }
 
         // Load properties
-        /*
-          InputStream fr = new FileInputStream(argv[0]);
-          prop.load(fr);
-        */
         Properties prop = loadProperties(propFile);
 
         // Get indexer object
         Indexer ki = new Indexer(prop);
 
-        // Empty line
-        System.out.println();
-
         // Iterate over list of directories
-        for (String arg : Arrays.copyOfRange(argv, i, argv.length)) {
+        for (String arg : inputDirectories) {
+            log.info("Indexing files in"+arg);
             File f = new File(arg);
             if (f.isDirectory())
                 ki.parse(f);
-        };
+        }
 
         // Final commit
         ki.commit();
-
+        log.info("Finished indexing.");
         // Finish indexing
-        System.out.println("-----");
-        System.out.println("  Indexed " + ki.count + " files.");
-        System.out.println();
-    };
-};
+        System.out.println("Indexed " + ki.count + " files.");
+    }
+}
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
index b46d82c..1554002 100644
--- a/src/main/resources/log4j.properties
+++ b/src/main/resources/log4j.properties
@@ -1,4 +1,4 @@
-log4j.rootLogger = ERROR, stdout
+log4j.rootLogger = DEBUG, stdout
 
 # Queries:
 # log4j.logger.de.ids_mannheim.korap.query.SpanNextQuery = TRACE, stdout
@@ -42,6 +42,7 @@
 # Server
 # log4j.category.org.glassfish.jersey = TRACE, stdout
 
+log4j.appender.stdout.Target=System.out
 log4j.appender.stdout = org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern = %5p (%F:%L) -> %m%n
