diff --git a/pom.xml b/pom.xml
index 6558887..5b718d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,13 +2,26 @@
   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>
 
-<!--
-  <parent>
-    <groupId>KorAP-modules</groupId>
-    <artifactId>KorAP-core-modules</artifactId>
-    <version>LATEST</version>
-  </parent>
--->
+  <!--
+      ** Indexer
+      install the indexer and the performancetests
+      $ mvn clean compile assembly:single
+      Then run e.g.
+      $ java -jar target/KorAP-lucene-index-???-jar-with-dependencies.jar src/main/resources/korap.conf /data/hdd/lucene-new/WPD/
+
+      ** Server
+      Start the server with
+      $mvn clean compile exec:java
+  -->
+
+  <!--
+      <parent>
+      <groupId>KorAP-modules</groupId>
+      <artifactId>KorAP-core-modules</artifactId>
+      <version>LATEST</version>
+      </parent>
+  -->
+
   <groupId>KorAP-modules</groupId>
   <artifactId>KorAP-lucene-index</artifactId>
   <version>0.40</version>
@@ -190,13 +203,6 @@
 	</configuration>
       </plugin>
 
-      <!--
-	  install the indexer and the performancetests
-	  $ mvn clean compile assembly:single
-	  Then run e.g.
-	  $ java -jar target/KorAP-lucene-index-0.30.2-jar-with-dependencies.jar src/main/resources/korap.conf /data/hdd/lucene-new/WPD/
-      -->
-
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-assembly-plugin</artifactId>
diff --git a/src/main/java/de/ids_mannheim/korap/KorapIndex.java b/src/main/java/de/ids_mannheim/korap/KorapIndex.java
index 7a75071..54932da 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapIndex.java
@@ -606,6 +606,7 @@
 	     * are of interest.
 	     */
 	    StringBuilder regex = new StringBuilder();
+	    // TODO: Make these static
 	    Pattern harmlessFoundry = Pattern.compile("^[-a-zA-Z0-9_]+$");
 	    Pattern harmlessLayer   = Pattern.compile("^[-a-zA-Z0-9_:]+$");
 	    Iterator<String> iter;
diff --git a/src/main/java/de/ids_mannheim/korap/KorapNode.java b/src/main/java/de/ids_mannheim/korap/KorapNode.java
index 1155cae..14c57c3 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapNode.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapNode.java
@@ -4,9 +4,17 @@
 import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
 import org.glassfish.jersey.server.ResourceConfig;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 
+import de.ids_mannheim.korap.KorapIndex;
+import org.apache.lucene.store.MMapDirectory;
+
+
 /**
  * Standalone REST-Service for the Lucene Search Backend.
  *
@@ -17,14 +25,30 @@
     // Base URI the Grizzly HTTP server will listen on
     public static final String BASE_URI = "http://localhost:8080/";
 
+    // Logger
+    private final static Logger log = LoggerFactory.getLogger(KorapNode.class);
+
+    // Index
+    private static KorapIndex index;
+
+    /*
+      Todo: Use korap.config for paths to
+            indexDirectory
+     */
+    private static String path = new String("/home/ndiewald/Repositories/korap/KorAP-modules/KorAP-lucene-index/sandbox/index");
+
+
+
     /**
      * Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
      * @return Grizzly HTTP server.
      */
     public static HttpServer startServer() {
+
         // create a resource config that scans for JAX-RS resources and providers
         // in de.ids_mannheim.korap.server package
-        final ResourceConfig rc = new ResourceConfig().packages("de.ids_mannheim.korap.server");
+        final ResourceConfig rc =
+	    new ResourceConfig().packages("de.ids_mannheim.korap.server");
 
         // create and start a new instance of grizzly http server
         // exposing the Jersey application at BASE_URI
@@ -42,6 +66,36 @@
 	// WADL available at BASE_URI + application.wadl
         System.in.read();
         server.stop();
-    }
-}
+    };
 
+    public static KorapIndex getIndex () {
+	if (index != null)
+	    return index;
+
+    	try {
+	    File file = new File(path);
+
+	    log.info("Loading index from {}", path);
+	    if (!file.exists()) {
+		log.error("Index not found at {}", path);
+		return null;
+	    };
+
+	    System.out.println("Loading index from " + path);
+
+	    index = new KorapIndex(new MMapDirectory(file));
+	    return index;
+	    /*
+	    // Temporarily!
+	    static String path = new String();
+
+	    this.index = new KorapIndex(new MMapDirectory(f));
+	    return this.index;
+	    */
+	}
+	catch (IOException e) {
+	    log.error("Index not loadable at {}: {}", path, e.getMessage());
+	};
+	return null;
+    };
+};
diff --git a/src/main/java/de/ids_mannheim/korap/server/Resource.java b/src/main/java/de/ids_mannheim/korap/server/Resource.java
new file mode 100644
index 0000000..f71e9cb
--- /dev/null
+++ b/src/main/java/de/ids_mannheim/korap/server/Resource.java
@@ -0,0 +1,157 @@
+package de.ids_mannheim.korap.server;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.MultivaluedMap;
+
+import de.ids_mannheim.korap.KorapNode;
+import de.ids_mannheim.korap.KorapIndex;
+import de.ids_mannheim.korap.KorapSearch;
+import de.ids_mannheim.korap.KorapMatch;
+import de.ids_mannheim.korap.KorapResult;
+import de.ids_mannheim.korap.util.QueryException;
+
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
+
+/**
+ * Root resource (exposed at root path)
+ *
+ * @author Nils Diewald
+ *
+ * Look at http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/
+ */
+@Path("/")
+public class Resource {
+
+    static Pattern p = Pattern.compile("\\s*(?i:false|null)\\s*");
+
+    private static boolean isNull (String value) {
+	if (value == null)
+	    return true;
+
+	Matcher m = p.matcher(value);
+	if (m.matches())
+	    return true;
+
+	return false;
+    };
+
+    /**
+     * Search the lucene index.
+     *
+     * @param json JSON-LD string with search and potential meta filters.
+     */
+    @POST
+    @Path("/search")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public String search (String json) {
+
+	// Get index
+	KorapIndex index = KorapNode.getIndex();
+
+	// Search index
+        if (index != null)
+            return new KorapSearch(json).run(index).toJSON();
+
+	// Response with error message
+        KorapResult kr = new KorapResult();
+        kr.setError("Index not found");
+        return kr.toJSON();
+    };
+
+    @GET
+    @Path("/match/{matchID}")
+    @Produces(MediaType.APPLICATION_JSON)
+    public String match (@PathParam("matchID") String id,
+			 @Context UriInfo uri) {
+
+	// Get index
+	KorapIndex index = KorapNode.getIndex();
+
+	// Search index
+        if (index != null) {
+
+	    // Get query parameters
+	    MultivaluedMap<String,String> qp = uri.getQueryParameters();
+
+	    boolean includeSpans = false,
+		includeHighlights = true,
+		extendToSentence = false,
+		info = false;
+
+	    // Optional query parameter "info" for more information on the match
+	    if (!isNull(qp.getFirst("info")))
+		info = true;
+	    
+	    // Optional query parameter "spans" for span information inclusion
+	    if (!isNull(qp.getFirst("spans"))) {
+		includeSpans = true;
+		info = true;
+	    };
+
+	    // Optional query parameter "highlights" for highlight information inclusion
+	    String highlights = qp.getFirst("highlights");
+	    if (highlights != null && isNull(highlights))
+		includeHighlights = false;
+
+	    // Optional query parameter "extended" for sentence expansion
+	    if (!isNull(qp.getFirst("extended")))
+		extendToSentence = true;
+
+	    List<String> foundries = qp.get("foundry");
+	    List<String> layers    = qp.get("layer");
+
+            try {		
+		// Get match info
+                return index.getMatchInfo(
+		    id,
+		    "tokens",
+		    info,
+		    foundries,
+		    layers,
+		    includeSpans,
+		    includeHighlights,
+		    extendToSentence
+		).toJSON();
+            }
+
+	    // Nothing found
+	    catch (QueryException qe) {
+                KorapMatch km = new KorapMatch();
+                km.setError(qe.getMessage());
+                return km.toJSON();
+            }
+	};
+
+	// Response with error message
+        KorapMatch km = new KorapMatch();
+        km.setError("Index not found");
+        return km.toJSON();
+    };
+
+    @POST
+    @Path("/collection")
+    @Produces(MediaType.APPLICATION_JSON)
+    @Consumes(MediaType.APPLICATION_JSON)
+    public String collection (String json) {
+
+	// Get index
+	KorapIndex index = KorapNode.getIndex();
+
+	if (index == null)
+	    return "{\"documents\" : -1, error\" : \"No index given\" }";
+
+	return "{}";
+    };
+};
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
index 6de0cdd..7c2b69a 100644
--- a/src/main/resources/log4j.properties
+++ b/src/main/resources/log4j.properties
@@ -22,10 +22,10 @@
 #log4j.logger.de.ids_mannheim.korap.KorapFilter = TRACE, stdout
 #log4j.logger.de.ids_mannheim.korap.KorapCollection = TRACE, stdout
 
-
 # Results:
 #log4j.logger.de.ids_mannheim.korap.KorapIndex = TRACE, stdout
-# log4j.logger.de.ids_mannheim.korap.KorapMatch = TRACE, stdout
+#log4j.logger.de.ids_mannheim.korap.KorapNode = TRACE, stdout
+#log4j.logger.de.ids_mannheim.korap.KorapMatch = TRACE, stdout
 #log4j.logger.de.ids_mannheim.korap.index.PositionsToOffset = TRACE, stdout
 
 #log4j.logger.de.ids_mannheim.korap.index.TestSegmentIndex = TRACE, stdout
