diff --git a/src/main/java/de/ids_mannheim/korap/Krill.java b/src/main/java/de/ids_mannheim/korap/Krill.java
index 0d02b79..72373db 100644
--- a/src/main/java/de/ids_mannheim/korap/Krill.java
+++ b/src/main/java/de/ids_mannheim/korap/Krill.java
@@ -63,6 +63,8 @@
     private JsonNode request;
     private String spanContext;
 
+    private final ObjectMapper mapper = new ObjectMapper();
+
     // Logger
     private final static Logger log = LoggerFactory.getLogger(Krill.class);
 
@@ -136,10 +138,9 @@
      * @return The {@link Krill} object for chaining.
      * @throws QueryException
      */
-    public Krill fromJson (String query) {
+    public Krill fromJson (final String query) {
         // Parse query string
         try {
-            ObjectMapper mapper = new ObjectMapper();
             this.request = mapper.readTree(query);
             this.fromJson(this.request);
         }
@@ -166,10 +167,10 @@
         // Parse "query" attribute
         if (json.has("query")) {
             try {
-                KrillQuery kq = new KrillQuery("tokens");
+                final KrillQuery kq = new KrillQuery("tokens");
                 this.setQuery(kq);
 
-                SpanQueryWrapper qw = kq.fromJson(json.get("query"));
+                final SpanQueryWrapper qw = kq.fromJson(json.get("query"));
 
                 // Throw an error, in case the query matches everywhere
                 if (qw.isEmpty())
@@ -208,7 +209,7 @@
         // Parse "collection" or "collections" attribute
         try {
             if (json.has("collection")) {
-                JsonNode collNode = json.get("collection");
+                final JsonNode collNode = json.get("collection");
 
                 // TODO: Temporary
                 if (collNode.fieldNames().hasNext()) {
diff --git a/src/main/java/de/ids_mannheim/korap/KrillCollection.java b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
index 14cbec1..d0789e3 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillCollection.java
@@ -44,7 +44,7 @@
  * See http://mail-archives.apache.org/mod_mbox/lucene-java-user/
  *     200805.mbox/%3C17080852.post@talk.nabble.com%3E
  */
-public class KrillCollection extends Notifications {
+public final class KrillCollection extends Notifications {
     private KrillIndex index;
     private JsonNode json;
     private CollectionBuilder cb = new CollectionBuilder();
@@ -345,9 +345,7 @@
      * @return The {@link KrillCollection} object for chaining.
      */
     public KrillCollection filterUIDs (String ... uids) {
-        CollectionBuilder.Interface root = this.getBuilder();
         CollectionBuilder.Group cbg = this.cb.orGroup();
-        CollectionBuilder.Group filter = this.cb.andGroup();
         for (String uid : uids) {
             cbg.with(this.cb.term("UID", uid));
         };
diff --git a/src/main/java/de/ids_mannheim/korap/KrillIndex.java b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
index 7dc25ee..ef34cfd 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillIndex.java
@@ -107,7 +107,7 @@
   -> search for frequencies of VVFIN/gehen
   -> c:VVFIN:[^:]*?:gehen:past:...
 */
-public class KrillIndex {
+public final class KrillIndex {
 
     // Logger
     private final static Logger log = LoggerFactory.getLogger(KrillIndex.class);
@@ -1162,7 +1162,7 @@
 
 
     public Result search (SpanQuery query, short count) {
-        Krill krill = new Krill(query);
+        final Krill krill = new Krill(query);
         krill.getMeta().setCount(count);
         return this.search(krill);
     };
@@ -1204,19 +1204,19 @@
 
         this.termContexts = new HashMap<Term, TermContext>();
 
-        KrillCollection collection = ks.getCollection();
+        final KrillCollection collection = ks.getCollection();
         collection.setIndex(this);
 
         // Get the spanquery from the Krill object
         SpanQuery query = ks.getSpanQuery();
 
         // Get the field of textual data and annotations ("tokens")
-        String field = query.getField();
+        final String field = query.getField();
 
-        KrillMeta meta = ks.getMeta();
+        final KrillMeta meta = ks.getMeta();
 
         // Todo: Make kr subclassing ks - so ks has a method for a new Result!
-        Result kr = new Result(query.toString(), meta.getStartIndex(),
+        final Result kr = new Result(query.toString(), meta.getStartIndex(),
                 meta.getCount(), meta.getContext());
 
         // Set version info to result
@@ -1230,9 +1230,8 @@
         fields.add(field);
 
         // Lift all fields
-        if (fields.contains("@all")) {
+        if (fields.contains("@all"))
             fields = null;
-        };
 
         // Some initializations ...
         int i = 0;
@@ -1256,13 +1255,13 @@
         };
 
         // Collect matches from atomic readers
-        ArrayList<Match> atomicMatches = new ArrayList<Match>(
+        final ArrayList<Match> atomicMatches = new ArrayList<Match>(
                 kr.getItemsPerPage());
 
         // Start time out thread
-        TimeOutThread tthread = new TimeOutThread();
+        final TimeOutThread tthread = new TimeOutThread();
         tthread.start();
-        long timeout = meta.getTimeOut();
+        final long timeout = meta.getTimeOut();
 
         // See: http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html
         long t1 = System.nanoTime();
@@ -1288,15 +1287,15 @@
                  * Todo: There may be a way to know early if the bitset is emty
                  * by using OpenBitSet - but this may not be as fast as I think.
                  */
-                Bits bitset = collection.bits(atomic);
-
-                PositionsToOffset pto = new PositionsToOffset(atomic, field);
+                final Bits bitset = collection.bits(atomic);
+                final PositionsToOffset pto = new PositionsToOffset(atomic, field);
 
                 // Spans spans = NearSpansOrdered();
-                Spans spans = query.getSpans(atomic, (Bits) bitset,
-                        termContexts);
+                final Spans spans = query.getSpans(atomic, (Bits) bitset,
+                                                   termContexts);
 
-                IndexReader lreader = atomic.reader();
+                final IndexReader lreader = atomic.reader();
+                int localDocID, docID;
 
                 // TODO: Get document information from Cache! Fieldcache?
                 for (; i < hits; i++) {
@@ -1314,7 +1313,7 @@
                         break;
                     };
 
-                    int localDocID = spans.doc();
+                    localDocID = spans.doc();
 
                     // Count hits per resource
                     if (itemsPerResource > 0) {
@@ -1343,14 +1342,14 @@
                     if (startIndex > i)
                         continue;
 
-                    int docID = atomic.docBase + localDocID;
+                    docID = atomic.docBase + localDocID;
 
                     // Do not load all of this, in case the doc is the same!
-                    Document doc = (fields != null) ? lreader.document(
+                    final Document doc = (fields != null) ? lreader.document(
                             localDocID, fields) : lreader.document(localDocID);
 
                     // Create new Match
-                    Match match = new Match(pto, localDocID, spans.start(),
+                    final Match match = new Match(pto, localDocID, spans.start(),
                             spans.end());
                     match.setContext(kr.getContext());
 
@@ -1398,7 +1397,7 @@
 
                     // Count hits per resource
                     if (itemsPerResource > 0) {
-                        int localDocID = spans.doc();
+                        localDocID = spans.doc();
 
                         if (localDocID == DocIdSetIterator.NO_MORE_DOCS)
                             break;
diff --git a/src/main/java/de/ids_mannheim/korap/KrillMeta.java b/src/main/java/de/ids_mannheim/korap/KrillMeta.java
index 7be6a9f..c6bb0a4 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillMeta.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillMeta.java
@@ -15,7 +15,7 @@
 import org.slf4j.LoggerFactory;
 
 //  Todo: Set timeout default value per config file
-public class KrillMeta extends Notifications {
+public final class KrillMeta extends Notifications {
     // <legacy>
     private boolean cutOff = false;
     // </legacy>
diff --git a/src/main/java/de/ids_mannheim/korap/KrillQuery.java b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
index 07a3c3b..56fb027 100644
--- a/src/main/java/de/ids_mannheim/korap/KrillQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/KrillQuery.java
@@ -66,7 +66,7 @@
   [base=Der]([base=alte]|[base=junge])[base=Mann & p!=ADJA]![base=war | base=lag]
   Search for all documents containing "s:Der" and ("s:alte" or "s:junge") and "s:Mann"
 */
-public class KrillQuery extends Notifications {
+public final class KrillQuery extends Notifications {
     private QueryBuilder builder;
     private String field;
     private JsonNode json;
diff --git a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
index 1f28383..0510437 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SimpleSpanQuery.java
@@ -339,7 +339,7 @@
             throws IOException {
 
         for (int i = 0; i < spanQueries.size(); i++) {
-            SpanQuery query = (SpanQuery) spanQueries.get(i).rewrite(reader);
+            final SpanQuery query = (SpanQuery) spanQueries.get(i).rewrite(reader);
             if (!query.equals(spanQueries.get(i))) {
                 if (clone == null)
                     clone = clone();
@@ -365,7 +365,7 @@
     private SimpleSpanQuery updateClone (IndexReader reader,
             SimpleSpanQuery clone, SpanQuery sq, int clauseNumber)
             throws IOException {
-        SpanQuery query = (SpanQuery) sq.rewrite(reader);
+        final SpanQuery query = (SpanQuery) sq.rewrite(reader);
         if (!query.equals(sq)) {
             if (clone == null)
                 clone = clone();
@@ -399,8 +399,7 @@
         }
         else if (clauseList != null) {
             for (int i = 0; i < clauseList.size(); i++) {
-                SpanQuery query = (SpanQuery) clauseList.get(i);
-                if (!query.equals(q.getClauseList().get(i))) {
+                if (!clauseList.get(i).equals(q.getClauseList().get(i))) {
                     return false;
                 }
             }
diff --git a/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java b/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
index 6c2981b..937e9bc 100644
--- a/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
+++ b/src/main/java/de/ids_mannheim/korap/query/SpanElementQuery.java
@@ -47,7 +47,7 @@
  * @author diewald
  * @author margaretha
  */
-public class SpanElementQuery extends SimpleSpanQuery {
+public final class SpanElementQuery extends SimpleSpanQuery {
     private static Term elementTerm;
     private String elementStr;
 
diff --git a/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java b/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
index d2ceffe..30515d5 100644
--- a/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
+++ b/src/main/java/de/ids_mannheim/korap/query/spans/ElementSpans.java
@@ -27,14 +27,15 @@
  * @author margaretha
  * @author diewald
  */
-public class ElementSpans extends SimpleSpans {
-    private TermSpans termSpans;
+public final class ElementSpans extends SimpleSpans {
+    private final TermSpans termSpans;
     private boolean lazyLoaded = false;
 
     private final Logger log = LoggerFactory.getLogger(ElementSpans.class);
     // This advices the java compiler to ignore all loggings
     public static final boolean DEBUG = false;
-
+    
+    private byte[] b = new byte[8];
 
     /**
      * Constructs ElementSpans for the given {@link SpanElementQuery}.
@@ -112,8 +113,8 @@
         if (!payload.isEmpty()) {
 
             // Get payload one by one
-            int length = payload.get(0).length;
-            ByteBuffer bb = ByteBuffer.allocate(length);
+            final int length = payload.get(0).length;
+            final ByteBuffer bb = ByteBuffer.allocate(length);
             bb.put(payload.get(0));
 
             // set element end position from payload
@@ -129,7 +130,6 @@
             }
 
             // Copy the start and end character offsets
-            byte[] b = new byte[8];
             b = Arrays.copyOfRange(bb.array(), 0, 8);
             this.matchPayload = Collections.singletonList(b);
             return;
diff --git a/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java b/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java
index 46ad3dd..68cbdb6 100644
--- a/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java
+++ b/src/main/java/de/ids_mannheim/korap/response/MatchCollector.java
@@ -13,7 +13,7 @@
       private long totalTexts;
     */
 
-    public void add (int uniqueDocID, int matchcount) {
+    public void add (final int uniqueDocID, final int matchcount) {
         this.totalResultDocs++;
         this.incrTotalResults(matchcount);
     };
diff --git a/src/main/java/de/ids_mannheim/korap/response/Result.java b/src/main/java/de/ids_mannheim/korap/response/Result.java
index 067d0f6..01102a1 100644
--- a/src/main/java/de/ids_mannheim/korap/response/Result.java
+++ b/src/main/java/de/ids_mannheim/korap/response/Result.java
@@ -36,7 +36,7 @@
  */
 @JsonInclude(Include.NON_NULL)
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class Result extends Krill {
+public final class Result extends Krill {
     ObjectMapper mapper = new ObjectMapper();
 
     @JsonIgnore
diff --git a/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java b/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
index 2cfa252..0c5a604 100644
--- a/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
+++ b/src/main/java/de/ids_mannheim/korap/response/collector/MatchCollectorDB.java
@@ -13,7 +13,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class MatchCollectorDB extends MatchCollector {
+public final class MatchCollectorDB extends MatchCollector {
 
     // Logger
     private final static Logger log = LoggerFactory.getLogger(Node.class);
@@ -23,9 +23,10 @@
      * the list should be synchrinized Collections.synchronizedList()
      */
     private String databaseType;
-    private List matchCollector;
-    private int bufferSize, docCollect;
-    private String resultID;
+    private final List matchCollector;
+    private final int bufferSize;
+    private int docCollect;
+    private final String resultID;
 
     // private Connection connection;
     private DataSource pool;
@@ -186,7 +187,7 @@
     public void close (boolean close) {
         if (close)
             this.close();
-        else
-            this.commit();
+
+        this.commit();
     };
 };
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 bb047a5..52bfa11 100644
--- a/src/main/java/de/ids_mannheim/korap/server/Resource.java
+++ b/src/main/java/de/ids_mannheim/korap/server/Resource.java
@@ -41,7 +41,7 @@
 import org.slf4j.LoggerFactory;
 
 import java.sql.SQLException;
-import java.sql.Connection;
+import com.mchange.v2.c3p0.ComboPooledDataSource;
 
 
 /**
@@ -63,12 +63,15 @@
     private final static Logger log = LoggerFactory.getLogger(Node.class);
 
     // This advices the java compiler to ignore all loggings
-    public static final boolean DEBUG = false;
+    public final static boolean DEBUG = false;
 
     // Slightly based on String::BooleanSimple
-    static Pattern p = Pattern.compile("\\s*(?i:false|no|inactive|disabled|"
+    private final static Pattern p =
+        Pattern.compile("\\s*(?i:false|no|inactive|disabled|"
             + "off|n|neg(?:ative)?|not|null|undef)\\s*");
 
+    private KrillIndex index;
+
 
     /**
      * Return information on the node, like name etc.
@@ -76,7 +79,7 @@
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     public String info () {
-        Response kresp = _initResponse();
+        final Response kresp = _initResponse();
 
         if (kresp.hasErrors())
             return kresp.toJsonString();
@@ -109,17 +112,17 @@
          * See
          * http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/
          */
-
         // Todo: Parameter for server node
         if (DEBUG)
             log.trace("Added new document with unique identifier {}", uid);
 
-        Response kresp = _initResponse();
+        final Response kresp = _initResponse();
         if (kresp.hasErrors())
             return kresp.toJsonString();
 
         // Get index
-        KrillIndex index = Node.getIndex();
+        index = Node.getIndex();
+
 
         FieldDocument fd = index.addDoc(uid, json);
         if (fd == null) {
@@ -129,13 +132,12 @@
             return kresp.toJsonString();
         };
 
-        String ID = "Unknown";
-        ID = fd.getID();
-
         // Set HTTP to 200
-        kresp.addMessage(681, "Document was added successfully", ID);
-
-        // System.err.println(kresp.toJsonString());
+        kresp.addMessage(
+            681,
+            "Document was added successfully",
+            fd.getID() != null ? fd.getID() : "Unknown"
+        );
 
         return kresp.toJsonString();
     };
@@ -150,16 +152,13 @@
     @Produces(MediaType.APPLICATION_JSON)
     public String commit () {
 
-        Response kresp = _initResponse();
+        final Response kresp = _initResponse();
         if (kresp.hasErrors())
             return kresp.toJsonString();
 
-        // Get index
-        KrillIndex index = Node.getIndex();
-
         // There are documents to commit
         try {
-            index.commit();
+            Node.getIndex().commit();
             kresp.addMessage(683, "Staged data committed");
         }
         catch (IOException e) {
@@ -185,15 +184,15 @@
     @Consumes(MediaType.APPLICATION_JSON)
     public String find (String json, @Context UriInfo uri) {
 
-        Response kresp = _initResponse();
+        final Response kresp = _initResponse();
         if (kresp.hasErrors())
             return kresp.toJsonString();
 
         // Search index
-        Krill ks = new Krill(json);
+        final Krill ks = new Krill(json);
 
         // Get query parameters
-        MultivaluedMap<String, String> qp = uri.getQueryParameters();
+        final MultivaluedMap<String, String> qp = uri.getQueryParameters();
 
         if (qp.get("uid") == null) {
             kresp.addError(610,
@@ -203,13 +202,13 @@
         };
 
         // Build Collection based on a list of uids
-        List<String> uids = qp.get("uid");
-        KrillCollection kc = new KrillCollection();
-        kc.filterUIDs(uids.toArray(new String[uids.size()]));
+        final List<String> uids = qp.get("uid");
 
         // TODO: RESTRICT COLLECTION TO ONLY RESPECT SELF DOCS (REPLICATION)
 
-        // Override old collection
+        // Ignore a Collection that may already be established
+        final KrillCollection kc = new KrillCollection();
+        kc.filterUIDs(uids.toArray(new String[uids.size()]));
         ks.setCollection(kc);
 
         // Only return the first match per text
@@ -238,15 +237,16 @@
 
         // Get the database
         try {
-            MatchCollectorDB mc = new MatchCollectorDB(1000, "Res_" + resultID);
-            Connection conn = Node.getDBPool().getConnection();
-            mc.setDBPool("mysql", Node.getDBPool(), conn);
+            final MatchCollectorDB mc = new MatchCollectorDB(1000, "Res_" + resultID);
+            final ComboPooledDataSource pool = Node.getDBPool();
+            mc.setDBPool("mysql", pool, pool.getConnection());
 
             // TODO: Only search in self documents (REPLICATION FTW!)
 
-            Krill ks = new Krill(json);
+            final Krill ks = new Krill(json);
+
             // TODO: Reuse response!
-            MatchCollector result = Node.getIndex().collect(ks, mc);
+            final MatchCollector result = Node.getIndex().collect(ks, mc);
 
             result.setNode(Node.getName());
             return result.toJsonString();
@@ -422,7 +422,7 @@
         if (value == null)
             return true;
 
-        Matcher m = p.matcher(value);
+        final Matcher m = p.matcher(value);
         if (m.matches())
             return true;
 
diff --git a/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSamples.java b/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSamples.java
new file mode 100644
index 0000000..69e8503
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/benchmark/TestBenchmarkSamples.java
@@ -0,0 +1,66 @@
+package de.ids_mannheim.korap.benchmark;
+
+import java.util.*;
+import java.io.*;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import de.ids_mannheim.korap.KrillIndex;
+import de.ids_mannheim.korap.KrillQuery;
+import de.ids_mannheim.korap.KrillCollection;
+import de.ids_mannheim.korap.query.QueryBuilder;
+import de.ids_mannheim.korap.Krill;
+import de.ids_mannheim.korap.response.Result;
+import de.ids_mannheim.korap.util.QueryException;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+
+@RunWith(JUnit4.class)
+public class TestBenchmarkSamples {
+
+    private final ObjectMapper mapper = new ObjectMapper();
+    private final int rounds = 1000;
+    private long t1 = 0, t2 = 0;
+
+    @Test
+    public void simpleSegmentQuery () throws Exception {
+        // Construct index
+
+        KrillIndex ki = new KrillIndex();
+
+        // Indexing test files
+        for (String i : new String[] { "00001", "00002", "00003", "00004",
+                                           "00005", "00006", "02439" }) {
+            ki.addDoc(
+                      getClass().getResourceAsStream("/wiki/" + i + ".json.gz"),
+                      true);
+        };
+        ki.commit();
+
+        t1 = System.nanoTime();
+        for (int i = 1; i <= rounds; i++) {
+            final QueryBuilder qb = new QueryBuilder("tokens");
+            final Krill ks = new Krill(qb.seg("mate/m:gender:masc").toQuery());
+            final Result kr = ks.apply(ki);
+            assertEquals(kr.getTotalResults(), 497);
+        };
+        t2 = System.nanoTime();
+        double seconds = (double) (t2 - t1) / 1000000000.0;
+        System.err.println("Seconds: " + seconds);
+
+        // Seconds: 9.465514311
+        // Seconds: 9.302011468
+        // Seconds: 9.052496918
+        // Seconds: 9.0567007
+        // Seconds: 9.113724089
+        // Seconds: 8.700548842
+        // Seconds: 9.390980437
+        // Seconds: 8.817503952
+    };
+};
diff --git a/src/test/java/de/ids_mannheim/korap/server/TestResource.java b/src/test/java/de/ids_mannheim/korap/server/TestResource.java
index 643f081..4d4dd48 100644
--- a/src/test/java/de/ids_mannheim/korap/server/TestResource.java
+++ b/src/test/java/de/ids_mannheim/korap/server/TestResource.java
@@ -35,16 +35,20 @@
     private HttpServer server;
     private WebTarget target;
 
-    ObjectMapper mapper = new ObjectMapper();
+    final ObjectMapper mapper = new ObjectMapper();
+    long t1 = 0, t2 = 0, t3 = 0, t4 = 0;
 
 
     @Before
     public void setUp () throws Exception {
         // start the server
+        t1 = System.nanoTime();
         server = Node.startServer("milena", (String) null);
         // create the client
         Client c = ClientBuilder.newClient();
 
+        t2 = System.nanoTime();
+
         // uncomment the following line if you want to enable
         // support for JSON in the client (you also have to uncomment
         // dependency on jersey-media-json module in pom.xml and Main.startServer())
@@ -66,8 +70,20 @@
 
     @After
     public void tearDown () throws Exception {
+        t3 = System.nanoTime();
         server.stop();
         Node.closeDBPool();
+        t4 = System.nanoTime();
+
+        double startup  = (double) (t2 - t1) / 1000000000.0;
+        double action   = (double) (t3 - t2) / 1000000000.0;
+        double shutdown = (double) (t4 - t3) / 1000000000.0;
+
+        /*
+        System.err.println("Startup:  " + startup + ", " +
+                           "Action:   " + action  + ", " +
+                           "Shutdown: " + shutdown);
+        */
     };
 
 
@@ -92,11 +108,12 @@
     };
 
     @Test
-    public void testResource () throws IOException {
+    public void testIndexing () throws IOException {
         String resp;
         JsonNode res;
 
-        for (String i : new String[] { "00001", "00002", "00003", "00004",
+        for (String i : new String[] {
+                "00001", "00002", "00003", "00004",
                 "00005", "00006", "02439" }) {
 
             String json = StringfromFile(getClass().getResource(
@@ -119,6 +136,7 @@
             }
         };
 
+        // Commit!
         resp = target.path("/index").request("application/json")
                 .post(Entity.text(""), String.class);
         res = mapper.readTree(resp);
@@ -130,6 +148,7 @@
     @Test
     public void testCollection () throws IOException {
 
+        // mate/l:sein
         String json = getString(getClass().getResource(
                 "/queries/bsp-uid-example.jsonld").getFile());
 
