diff --git a/src/main/java/de/ids_mannheim/korap/Krill.java b/src/main/java/de/ids_mannheim/korap/Krill.java
index 57ac31c..6fb9fb1 100644
--- a/src/main/java/de/ids_mannheim/korap/Krill.java
+++ b/src/main/java/de/ids_mannheim/korap/Krill.java
@@ -24,19 +24,19 @@
  * and proprietary meta objects.
  *
  * <blockquote><pre>
- *   // Create a new krill search object passing a KoralQuery string
+ *   // Create a new krill search object by passing a KoralQuery string
  *   Krill krill = new Krill(koralQueryString);
  *
- *   // Run the query on an index - receive a search result
- *   KrillResult kr = krill.apply(new KrillIndex());
+ *   // Apply the query to an index and receive a search result
+ *   Result result = krill.apply(new KrillIndex());
  * </pre></blockquote>
  *
  * @author diewald
  * @author margaretha
  *
- * @see KrillMeta
  * @see KrillCollection
  * @see KrillQuery
+ * @see KrillMeta
  * @see KrillIndex
  */
 /*
@@ -50,7 +50,6 @@
 
     // Logger
     private final static Logger log = LoggerFactory.getLogger(Krill.class);
-    
 
     /**
      * Construct a new Krill object.
@@ -90,6 +89,8 @@
         try {
             this.spanQuery = query.toQuery();
         }
+
+        // Add the error to the KoralQuery response
         catch (QueryException q) {
             this.addError(q.getErrorCode(), q.getMessage());
         };
@@ -204,7 +205,7 @@
             this.addError(q.getErrorCode(), q.getMessage());
         };
 
-        // No errors occured - parse meta object
+        // Parse meta object
         if (!this.hasErrors() && json.has("meta"))
             this.setMeta(new KrillMeta(json.get("meta")));
 
@@ -226,6 +227,7 @@
      * Set the associated {@link KrillIndex} object.
      *
      * @param index The associated {@link KrillIndex} object.
+     * @return The {@link Krill} object for chaining.
      */
     public Krill setIndex (KrillIndex index) {
         this.index = index;
@@ -280,18 +282,32 @@
     };
 
 
-    @Deprecated
-    public JsonNode getRequest () {
-        return this.request;
-    };
-
-
+    /**
+     * Get the associated {@link SpanQuery} deserialization
+     * (i.e. the internal correspandence to KoralQuery's query object).
+     *
+     * <strong>Warning</strong>: SpanQueries may be lazy deserialized
+     * in future versions of Krill, rendering this API obsolete.
+     *
+     * @return The deserialized {@link SpanQuery} object.
+     */
     @Deprecated
     public SpanQuery getSpanQuery () {
         return this.spanQuery;
     };
 
 
+    /**
+     * Set the SpanQuery by means of a {@link SpanQueryWrapper} object
+     * (i.e. the internal correspandence to KoralQuery's query object).
+     *
+     * <strong>Warning</strong>: SpanQueries may be lazy deserialized
+     * in future versions of Krill, rendering this API obsolete.
+     *
+     * @param query The {@link SpanQueryWrapper} to unwrap
+     *        the {@link SpanQuery} object.
+     * @return The {@link Krill} object for chaining.
+     */
     @Deprecated
     public Krill setSpanQuery (SpanQueryWrapper sqwi) {
         try {
@@ -303,10 +319,27 @@
         return this;
     };
 
-    
+
+    /**
+     * Set the {@link SpanQuery} object
+     * (i.e. the internal correspandence to KoralQuery's query object).
+     *
+     * <strong>Warning</strong>: SpanQueries may be lazy deserialized
+     * in future versions of Krill, rendering this API obsolete.
+     *
+     * @param query The {@link SpanQuery} object.
+     * @return The {@link Krill} object for chaining.
+     */    
     @Deprecated
     public Krill setSpanQuery (SpanQuery sq) {
         this.spanQuery = sq;
         return this;
     };
+
+
+    // Requests are out - queries will be mirrored completely
+    @Deprecated
+    public JsonNode getRequest () {
+        return this.request;
+    };
 };
diff --git a/src/main/java/de/ids_mannheim/korap/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index 70e99bb..0672362 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -40,39 +40,42 @@
 /**
  * KrillIndex implements a simple API for searching in and writing to a
  * Lucene index and requesting several information about the index' nature.
+ * Please consult {@link Krill} for the preferred use of this class.
  * <br />
  *
  * <blockquote><pre>
  *   KrillIndex ki = new KrillIndex(
  *       new MMapDirectory(new File("/myindex"))
  *   );
+ *   Result result = new Krill(koralQueryString).apply(ki);
  * </pre></blockquote>
  *
- * Properties can be stored in a properies file called 'index.properties'.
- * Relevant properties are <code>lucene.version</code> and
- * <code>lucene.name</code>.
+ * Properties can be stored in a properies file called <tt>krill.properties</tt>.
+ * Relevant properties are <tt>krill.version</tt> and
+ * <tt>krill.name</tt>.
  *
  * @author diewald
  */
 /*
+  NOTE: Search could run in parallel on atomic readers (although Lucene developers
+        strongly discourage that). Benefits are not clear and testing is harder,
+        so let's stick to serial processing for now.
   TODO: Add word count as a meta data field!
-  TODO: Validate document import!
-  TODO: DON'T STORE THE TEXT IN THE TOKENS FIELD!
-        It has only to be lifted for match views!!!
-  TODO: Support layer for specific foundries (IMPORTANT)
+  TODO: Improve validation of document import!
+  TODO: Don't store the text in the token field!
+        (It has only to be lifted for match views!
+        Benchmark how worse that is!)
+  TODO: Support layer for specific foundries in terminfo (IMPORTANT)
   TODO: Use FieldCache!
   TODO: Reuse the indexreader everywhere - it should be threadsafe!
+  TODO: Support document removal!
+  TODO: Support document update!
+  TODO: Support callback for interrupts (to stop the searching)!
+  TODO: Support multiple indices (Probably).
 
   http://invertedindex.blogspot.co.il/2009/04/lucene-dociduid-mapping-and-payload.html
   see korap/search.java -> retrieveTokens
 
-  Todo: Support document removal!
-  Todo: Support document update! // it's now part of IndexWriter
-
-  Support a callback for interrupts (to stop the searching)!
-
-  Support multiple indices.
-
   Support frequency search with regular expressions, so multiple bookkeeping:
   c<:VVFIN:ging:gehen:past::
   c>:VVFIN:gnig:neheg:past::
@@ -80,33 +83,6 @@
   -> c:VVFIN:[^:]*?:gehen:past:...
 */
 public class KrillIndex {
-    // Todo: Use configuration
-    private int maxTermRelations = 100, // Last line of defense
-                autoCommit = 500;
-
-    private Directory directory;
-
-    // Temp:
-    public IndexReader reader;
-
-    private IndexWriter writer;
-    private IndexWriterConfig config;
-    private IndexSearcher searcher;
-    private boolean readerOpen = false;
-
-    // The commit counter is only there for
-    // counting unstaged changes per thread (for bulk insertions)
-    // It does not represent real unstaged documents.
-    private int commitCounter = 0;
-    private HashMap termContexts;
-    private ObjectMapper mapper = new ObjectMapper();
-    private String version, name;
-
-    private byte[] pl = new byte[4];
-    private static ByteBuffer
-        bb       = ByteBuffer.allocate(4),
-        bbOffset = ByteBuffer.allocate(8),
-        bbTerm   = ByteBuffer.allocate(16);
 
     // Logger
     private final static Logger log = LoggerFactory.getLogger(KrillIndex.class);
@@ -114,9 +90,40 @@
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
 
+    // TODO: Use configuration instead.
+    // Last line of defense against DOS
+    private int maxTermRelations = 100;
+    private int autoCommit = 500;
+    private String version;
+    private String name;
+
+    // Temp:
+    private IndexReader reader;
+
+    private IndexWriter writer;
+    private IndexWriterConfig config;
+    private IndexSearcher searcher;
+    private boolean readerOpen = false;
+    private Directory directory;
+
+    // The commit counter is only there for
+    // counting unstaged changes per thread (for bulk insertions)
+    // It does not represent real unstaged documents.
+    private int commitCounter = 0;
+    private HashMap termContexts;
+    private ObjectMapper mapper = new ObjectMapper();
+
+    private byte[] pl = new byte[4];
+    private static ByteBuffer
+        bb       = ByteBuffer.allocate(4),
+        bbOffset = ByteBuffer.allocate(8),
+        bbTerm   = ByteBuffer.allocate(16);
+
+    // Some initializations ...
+    // TODO: This should probably happen at a more central point
     {
         Properties prop = new Properties();
-        URL file = getClass().getClassLoader().getResource("index.properties");
+        URL file = getClass().getClassLoader().getResource("krill.properties");
 
         // File found
         if (file != null) {
@@ -125,8 +132,30 @@
             try {
                 InputStream fr = new FileInputStream(f);
                 prop.load(fr);
-                this.version = prop.getProperty("lucene.version");
-                this.name    = prop.getProperty("lucene.name");
+                this.version    = prop.getProperty("krill.version");
+                this.name       = prop.getProperty("krill.name");
+
+                // Check for auto commit value
+                String stringProp = prop.getProperty("krill.index.commit.auto");
+                if (stringProp != null) {
+                    try {
+                        this.autoCommit = Integer.parseInt(stringProp);
+                    }
+                    catch (NumberFormatException e) {
+                        log.error("krill.index.commit.auto expected to be a numerical value");
+                    };
+                };
+
+                // Check for maximum term relations
+                stringProp = prop.getProperty("krill.index.relations.max");
+                if (stringProp != null) {
+                    try {
+                        this.maxTermRelations = Integer.parseInt(stringProp);
+                    }
+                    catch (NumberFormatException e) {
+                        log.error("krill.index.commit.auto expected to be a numerical value");
+                    };
+                };
             }
 
             // Unable to read property file
@@ -138,7 +167,8 @@
 
 
     /**
-     * Constructs a new KrillIndex in-memory.
+     * Constructs a new KrillIndex.
+     * This will be in-memory.
      *
      * @throws IOException
      */
@@ -150,25 +180,14 @@
     /**
      * Constructs a new KrillIndex bound to a persistant index.
      *
-     * @param index Path to an {@link FSDirectory} index
-     * @throws IOException
-     */
-    public KrillIndex (String index) throws IOException {
-        this(FSDirectory.open(new File( index )));
-    };
-
-
-    /**
-     * Constructs a new KrillIndex bound to a persistant index.
-     *
      * @param directory A {@link Directory} pointing to an index
      * @throws IOException
      */
     public KrillIndex (Directory directory) throws IOException {
         this.directory = directory;
 
-        // TODO: Shouldn't be here
         // Add analyzers
+        // TODO: Should probably not be here
         Map<String,Analyzer> analyzerPerField = new HashMap<String,Analyzer>();
         analyzerPerField.put("textClass", new WhitespaceAnalyzer(Version.LUCENE_CURRENT));
         analyzerPerField.put("foundries", new WhitespaceAnalyzer(Version.LUCENE_CURRENT));
@@ -203,45 +222,53 @@
 
 
     /**
-     * Close the connections of the index reader and the writer.
-     * @throws IOException
-     */ 
-    public void close () throws IOException {
-        this.closeReader();
-        this.closeWriter();
-    };
-
-
-    // Get index reader object
+     * The Lucene {@link IndexReader} object.
+     *
+     * Will be opened, in case it's closed.
+     *
+     * @return The {@link IndexReader} object.
+     */
     public IndexReader reader () {
-        if (!readerOpen)
-            this.openReader();
         // Todo: Maybe use DirectoryReader.openIfChanged(DirectoryReader)
-        
+        if (!readerOpen)
+            this.openReader();        
         return this.reader;
     };
-    
 
-    // Get index searcher object
+
+    /**
+     * The Lucene {@link IndexWriter} object.
+     *
+     * Will be created, in case it doesn't exist yet.
+     *
+     * @return The {@link IndexWriter} object.
+     * @throws IOException
+     */
+    public IndexWriter writer () throws IOException {
+        // Open writer if not already opened
+        if (this.writer == null)
+            this.writer = new IndexWriter(this.directory, this.config);
+        return this.writer;
+    };
+
+
+    /**
+     * The Lucene {@link IndexSearcher} object.
+     *
+     * Will be created, in case it doesn't exist yet.
+     *
+     * @return The {@link IndexSearcher} object.
+     */
     public IndexSearcher searcher () {
-        if (this.searcher == null) {
+        if (this.searcher == null)
             this.searcher = new IndexSearcher(this.reader());
-        };
         return this.searcher;
     };
 
 
-    // Close index writer
-    public void closeWriter () throws IOException {
-        if (this.writer != null)
-            this.writer.close();
-    };
-
-
     // Open index reader
-    public void openReader () {
+    private void openReader () {
         try {
-
             // open reader
             this.reader = DirectoryReader.open(this.directory);
             readerOpen = true;
@@ -251,34 +278,100 @@
 
         // Failed to open reader
         catch (IOException e) {
-            //e.printStackTrace();
+            // e.printStackTrace();
             log.warn( e.getLocalizedMessage() );
         };
     };
 
 
     // Close index reader
-    public void closeReader () throws IOException {
+    private void closeReader () throws IOException {
         if (readerOpen) {
             this.reader.close();
             readerOpen = false;
         };
     };
 
-    /*
-     * Some of these addDoc methods will probably be DEPRECATED,
-     * as they were added while the API changed slowly.
-     */
 
-    // Add document to index as FieldDocument
-    public FieldDocument addDoc (FieldDocument fd) {
+    // Close index writer
+    private void closeWriter () throws IOException {
+        if (this.writer != null)
+            this.writer.close();
+    };
+
+
+    /**
+     * Close the associated {@link IndexReader}
+     * and the associated {@link IndexWriter},
+     * in case they are opened.
+     *
+     * @throws IOException
+     */ 
+    public void close () throws IOException {
+        this.closeReader();
+        this.closeWriter();
+    };
+
+
+    /**
+     * Commit staged data to the index,
+     * if the commit counter indicates there is staged data.
+     *
+     * @param force Force the commit,
+     *        even if there is no staged data.
+     * @throws IOException
+     */
+    public void commit (boolean force) throws IOException {
+        // There is something to commit
+        if (commitCounter > 0 || !force)
+            this.commit();
+    };
+
+
+    /**
+     * Commit staged data to the index.
+     *
+     * @throws IOException
+     */
+    public void commit () throws IOException {
+        this.writer().commit();
+        commitCounter = 0;
+        this.closeReader();
+    };
+
+
+    /**
+     * Get autocommit value.
+     *
+     * @return The autocommit value.
+     */
+    public int getAutoCommit () {
+        return this.autoCommit;
+    };
+
+
+    /**
+     * Set the autocommit value.
+     *
+     * @param value The autocommit value.
+     */
+    public void setAutoCommit (int value) {
+        this.autoCommit = value;
+    };
+
+
+    /**
+     * Add a document to the index as a {@link FieldDocument}.
+     *
+     * @param doc The {@link FieldDocument} to add to the index.
+     * @return The {@link FieldDocument}, which means, the same
+     *         object, that was passed to the method.
+     */
+    public FieldDocument addDoc (FieldDocument doc) {
         try {
-            // Open writer if not already opened
-            if (this.writer == null)
-                this.writer = new IndexWriter(this.directory, this.config);
 
             // Add document to writer
-            this.writer.addDocument( fd.doc );
+            this.writer().addDocument( doc.doc );
             if (++commitCounter > autoCommit) {
                 this.commit();
                 commitCounter = 0;
@@ -287,37 +380,29 @@
 
         // Failed to add document
         catch (IOException e) {
-            log.error("File json not found");
+            log.error("Unable to add document");
         };
-        return fd;
-    };
 
-    // Add document to index as JSON object with a unique ID
-    public FieldDocument addDoc (int uid, String json) throws IOException {
-        FieldDocument fd = this.mapper.readValue(json, FieldDocument.class);
-        fd.setUID(uid);
-        return this.addDoc(fd);
+        return doc;
     };
 
 
-    // Add document to index as JSON object
+    /**
+     * Add a document to the index as a JSON string.
+     *
+     * @param json The document to add to the index as a string.
+     * @return The created {@link FieldDocument}.
+     * @throws IOException
+     */
     public FieldDocument addDoc (String json) throws IOException {
         FieldDocument fd = this.mapper.readValue(json, FieldDocument.class);
         return this.addDoc(fd);
     };
 
 
-    // Add document to index as JSON file
-    public FieldDocument addDoc (File json) {
-        try {
-            FieldDocument fd = this.mapper.readValue(json, FieldDocument.class);
-            return this.addDoc(fd);
-        }
-        catch (IOException e) {
-            log.error("File json not parseable");	    
-        };
-        return (FieldDocument) null;
-    };
+
+    // To document:
+
 
 
     // Add document to index as JSON file
@@ -326,7 +411,7 @@
     };
 
 
-    private FieldDocument _addDocfromFile (String json, boolean gzip) {
+    public FieldDocument addDocfromFile (String json, boolean gzip) {
         try {
             if (gzip) {
 
@@ -350,13 +435,26 @@
     
     // Add document to index as JSON file (possibly gzipped)
     public FieldDocument addDocFile(String json, boolean gzip) {
-        return this.addDoc(this._addDocfromFile(json, gzip));
+        return this.addDoc(this.addDocfromFile(json, gzip));
     };
 
 
+    /**
+     * Add a document to the index as a JSON string
+     * with a unique integer ID (unique throughout the index
+     * or even throughout the cluster of indices).
+     *
+     * @param uid The unique document identifier.
+     * @param json The document to add to the index as a string.
+     * @return The created {@link FieldDocument}.
+     * @throws IOException
+     */
+
+
+
     // Add document to index as JSON file (possibly gzipped)
     public FieldDocument addDocFile(int uid, String json, boolean gzip) {
-        FieldDocument fd = this._addDocfromFile(json, gzip);
+        FieldDocument fd = this.addDocfromFile(json, gzip);
         if (fd != null) {
             fd.setUID(uid);
             return this.addDoc(fd);
@@ -365,38 +463,6 @@
     };
 
 
-    // Commit changes to the index
-    public void commit (boolean force) throws IOException {
-        // There is something to commit
-        if (commitCounter > 0 || !force)
-            this.commit();
-    };
-
-
-    // Commit changes to the index
-    public void commit () throws IOException {
-        // Open writer if not already opened
-        if (this.writer == null)
-            this.writer = new IndexWriter(this.directory, this.config);
-
-        // Force commit
-        this.writer.commit();
-        commitCounter = 0;
-        this.closeReader();
-    };
-
-
-    // Get autoCommit valiue
-    public int autoCommit () {
-        return this.autoCommit;
-    };
-
-
-    // Set autoCommit value
-    public void autoCommit (int number) {
-        this.autoCommit = number;
-    };
-
 
     // Search for meta information in term vectors
     private long numberOfAtomic (Bits docvec,
diff --git a/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java b/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
index 82acd68..f0e9ddc 100644
--- a/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
+++ b/src/main/java/de/ids_mannheim/korap/index/AbstractDocument.java
@@ -247,6 +247,7 @@
      * Set the unique identifier of the document.
      *
      * @param UID The unique identifier of the document as an integer.
+     * @return The invocant for chaining.
      */
     public void setUID (int UID) {
         this.UID = UID;
@@ -258,6 +259,7 @@
      *
      * @param UID The unique identifier of the document as a
      *        string representing an integer.
+     * @return The invocant for chaining.
      * @throws NumberFormatException
      */
     public void setUID (String UID) throws NumberFormatException {
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 7526767..7c7acfd 100644
--- a/src/main/java/de/ids_mannheim/korap/index/Indexer.java
+++ b/src/main/java/de/ids_mannheim/korap/index/Indexer.java
@@ -31,16 +31,16 @@
      *
      * @param prop A {@link Properties} object with
      *        at least the following information:
-     *        <tt>lucene.indexDir</tt>.
+     *        <tt>krill.indexDir</tt>.
      * @throws IOException
      */
     public Indexer (Properties prop) throws IOException {
-        this.indexDir = prop.getProperty("lucene.indexDir");
+        this.indexDir = prop.getProperty("krill.indexDir");
 
         System.out.println("Index to " + this.indexDir);
 	
         // Default to 1000 documents till the next commit
-        String commitCount = prop.getProperty("lucene.index.commit.count", "1000");
+        String commitCount = prop.getProperty("krill.index.commit.count", "1000");
 
         // Create a new index object based on the directory
         this.index = new KrillIndex(new MMapDirectory(new File(indexDir)));
diff --git a/src/main/java/de/ids_mannheim/korap/server/Node.java b/src/main/java/de/ids_mannheim/korap/server/Node.java
index 4bf00ea..6aebd2d 100644
--- a/src/main/java/de/ids_mannheim/korap/server/Node.java
+++ b/src/main/java/de/ids_mannheim/korap/server/Node.java
@@ -61,22 +61,22 @@
         try {
             InputStream file = new FileInputStream(
                 Node.class.getClassLoader()
-                .getResource("server.properties")
+                .getResource("krill.properties")
                 .getFile()
             );
             Properties prop = new Properties();
             prop.load(file);
 
             // Node properties
-            path     = prop.getProperty("lucene.indexDir", path);
-            name     = prop.getProperty("lucene.server.name", name);
-            BASE_URI = prop.getProperty("lucene.server.baseURI", BASE_URI);
+            path     = prop.getProperty("krill.indexDir", path);
+            name     = prop.getProperty("krill.server.name", name);
+            BASE_URI = prop.getProperty("krill.server.baseURI", BASE_URI);
 
             // Database properties
-            dbUser  = prop.getProperty("lucene.db.user",    dbUser);
-            dbPwd   = prop.getProperty("lucene.db.pwd",     dbPwd);
-            dbClass = prop.getProperty("lucene.db.class",   dbClass);
-            dbURL   = prop.getProperty("lucene.db.jdbcURL", dbURL);
+            dbUser  = prop.getProperty("krill.db.user",    dbUser);
+            dbPwd   = prop.getProperty("krill.db.pwd",     dbPwd);
+            dbClass = prop.getProperty("krill.db.class",   dbClass);
+            dbURL   = prop.getProperty("krill.db.jdbcURL", dbURL);
 
         }
         catch (IOException e) {
@@ -125,7 +125,7 @@
                 new Runnable() {
                     @Override
                     public void run() {
-                        log.info("Stup Server");
+                        log.info("Stop Server");
                         // staaahp!
                         server.stop();
                     }
diff --git a/src/main/java/de/ids_mannheim/korap/server/Resource.java b/src/main/java/de/ids_mannheim/korap/server/Resource.java
index d48884d..39e5437 100644
--- a/src/main/java/de/ids_mannheim/korap/server/Resource.java
+++ b/src/main/java/de/ids_mannheim/korap/server/Resource.java
@@ -150,7 +150,8 @@
 
         String ID = "Unknown";
         try {
-            FieldDocument fd = index.addDoc(uid, json);
+            FieldDocument fd = index.addDoc(json);
+            fd.setUID(uid);
             ID = fd.getID();
         }
         // Set HTTP to ???
diff --git a/src/main/resources/krill.properties.info b/src/main/resources/krill.properties.info
new file mode 100644
index 0000000..b9fcc72
--- /dev/null
+++ b/src/main/resources/krill.properties.info
@@ -0,0 +1,19 @@
+krill.version = ${project.version}
+krill.name = ${project.name}
+
+# Krill Backend properties
+krill.properties     = true
+krill.indexDir       = [PATH TO INDEX DIRECTORY]
+krill.server.name    = [UNIQUE NODE NAME]
+krill.server.baseURI = [LISTEN-URL INCLUDING PORT]
+
+# Krill Database properties
+krill.db.class     = org.mariadb.jdbc.Driver 
+krill.db.URL       = jdbc:mysql://[DB_IP]:[DB_PORT]/[DB_NAME]
+krill.db.pwd       = [DB_PWD]
+krill.db.user      = [DB_USER]
+
+krill.index.commit.count = 134217000
+krill.index.commit.log = log/krill.commit.log
+krill.index.commit.auto = 500
+krill.index.relations.max = 100
diff --git a/src/main/resources/server.properties.info b/src/main/resources/server.properties.info
deleted file mode 100644
index f35a016..0000000
--- a/src/main/resources/server.properties.info
+++ /dev/null
@@ -1,17 +0,0 @@
-lucene.version = ${project.version}
-lucene.name = ${project.name}
-
-# Lucene Backend properties
-lucene.properties   = true
-lucene.indexDir     = [PATH TO INDEX DIRECTORY]
-lucene.node.name    = [UNIQUE NODE NAME]
-lucene.node.baseURI = [LISTEN-URL INCLUDING PORT]
-
-# Lucene Database properties
-lucene.db.class     = org.mariadb.jdbc.Driver 
-lucene.db.URL       = jdbc:mysql://[DB_IP]:[DB_PORT]/[DB_NAME]
-lucene.db.pwd       = [DB_PWD]
-lucene.db.user      = [DB_USER]
-
-lucene.index.commit.count = 134217000
-lucene.index.commit.log = log/korap.commit.log
