New kwic view
diff --git a/Makefile.PL b/Makefile.PL
index ac97d41..a9b76e4 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -19,6 +19,7 @@
     'Mojolicious::Plugin::TagHelpers::Pagination' => 0.01,
     'Mojolicious::Plugin::Notifications' => 0.03,
     'Mojolicious::Plugin::CHI' => 0.09,
+    'Cache::FastMmap' => 0,
 #    'Mojolicious::Plugin::Search' => 0.01,
     'Mojolicious::Plugin::Number::Commify' => '0.022',
     'JSON::XS' => 0.0
diff --git a/lib/Korap.pm b/lib/Korap.pm
index fbd7219..9209706 100644
--- a/lib/Korap.pm
+++ b/lib/Korap.pm
@@ -7,6 +7,8 @@
 sub startup {
   my $self = shift;
 
+  $self->secrets(['fmhsfjgfchgsdbfgshfxztsbt32477eb45veu4vubrghfgghbtv']);
+
   $self->plugin('Config');
   $self->plugin('CHI');
   $self->plugin('TagHelpers::Pagination' => {
@@ -31,15 +33,13 @@
     }
   );
 
-  # TODO: Write search snippet
-
   # Routes
   my $r = $self->routes;
 
   # Create search endpoint
   $r->add_shortcut(
     search => sub {
-      shift->get('/search')->to('search#remote')
+      shift->route('/search')->to('search#remote')
     }
   );
 
@@ -53,21 +53,27 @@
     }
   );
 
+
+
+  $r->get('/util/query')->to('search#query');
+
   # Tutorial
   $r->get('/tutorial')->to('tutorial#page')->name('tutorial');
   $r->get('/tutorial/(*tutorial)')->to('tutorial#page');
 
-  $r->get('/util/query')->to('search#query');
-
-  $r->get('/:resource' => [qw/collection corpus/])->to('search#info');
-
-  # resource => [qw/collection corpus/]
-  $r->get('/:resource')->search;
-  $r->get('/:resource/:cid', resource => [qw/collection corpus/])->search;
-  $r->get('/:resource/')->search;
-  # /matchInfo?id=...&f=&l=&spans
-
+  my $res = $r->route('/:resource', resource => [qw/collection corpus/]);
+  $res->to('search#info');
+  $res->search;
+  $res->route('/:corpus_id')->search;
+#  $r->get(
+#    '/:resource/:corpus_id/#doc_id/#match_id',
+#    resource => [qw/collection corpus/])->to('search#match')->name('match');
+ # /matchInfo?id=...&f=&l=&spans
 };
 
 
 1;
+
+__END__
+
+  # TODO: Write search snippet
diff --git a/lib/Korap/Plugin/KorapMatchinfo.pm b/lib/Korap/Plugin/KorapMatchinfo.pm
index 6cd6a10..fc9ba97 100644
--- a/lib/Korap/Plugin/KorapMatchinfo.pm
+++ b/lib/Korap/Plugin/KorapMatchinfo.pm
@@ -18,7 +18,7 @@
       my $c = shift;
       my $src = shift;
 
-/resource/matchInfo?id=match-WPD!WPD_TTT.07206-p151-152&f=treetagger&l=morpho&spans=true
+#/resource/matchInfo?id=match-WPD!WPD_TTT.07206-p151-152&f=treetagger&l=morpho&spans=true
 
       $src = 'VirtualCollection' if $src eq 'collection';
       $src = 'Corpus' if $src eq 'corpus';
diff --git a/lib/Korap/Plugin/KorapSearch.pm b/lib/Korap/Plugin/KorapSearch.pm
index b57e608..efe1e8b 100644
--- a/lib/Korap/Plugin/KorapSearch.pm
+++ b/lib/Korap/Plugin/KorapSearch.pm
@@ -18,6 +18,26 @@
   my $api = $param->{api};
 
   $mojo->helper(
+    korap_match_id => sub {
+      my $c = shift;
+      my $match = shift;
+      my $mid = $match->{ID};
+      $mid =~ s/^match\-[^!]+![^-]+-//;
+      return $mid // '';
+    }
+  );
+
+  $mojo->helper(
+    korap_doc_id => sub {
+      my $c = shift;
+      my $match = shift;
+      my $did = $match->{docID};
+      $did =~ s/^[^_]_//;
+      return $did // '';
+    }
+  );
+
+  $mojo->helper(
     search => sub {
       my $c = shift;
 
@@ -200,363 +220,55 @@
 
 __DATA__
 {
-  "query" : "tokens:mate/l:baum",
+  "query" : "tokens:s:baum",
   "matches" : [ {
-    "author" : "Peter200,Srittau,AHoerstemeier",
+    "author" : "ErikDunsing,Ninjamask,Magnus",
     "textClass" : "freizeit-unterhaltung reisen",
     "corpusID" : "WPD",
-    "title" : "Palm Beach Gardens",
-    "foundries" : "corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 xip xip/morpho xip/constituency xip/dependency treetagger treetagger/morpho connexor connexor/morpho connexor/syntax connexor/phrase mate mate/morpho mate/dependency opennlp opennlp/morpho base base/sentences base/paragraphs",
+    "title" : "Friedrich Wilhelm (Brandenburg)",
+    "foundries" : "opennlp opennlp/morpho xip xip/morpho xip/constituency xip/dependency base base/sentences base/paragraphs mate mate/morpho mate/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase treetagger treetagger/morpho",
     "tokenization" : "opennlp#tokens",
     "field" : "tokens",
     "startMore" : true,
     "endMore" : true,
-    "docID" : "WPD_PPP.00430",
-    "snippet" : "<span class=\"context-left\">MacArtur stellte sich die Straßen der Stadt links und rechts gesäümt mit Blumen und </span><span class=\"match\">Bäumen</span><span class=\"context-right\"> vor. Millionen von USD wurden dafür verwendet um dies zu ermöglichen. Letztlich wurde an allen Straßen und Wasserstraßen mächtige Kiefern und andere schattenspendende Laubbäume gepflanzt. Da er ein Naturliebhaber war, mussten alle älteren Bäume stehen bleiben und Straßen darum herum geführt werden. Für die damalige Zeit für Amerika eine total neue Erfahrung. Dies verteuerte das Bauvorhaben erheblich, aber MacArthur ließ sich nicht beirren. Ebenso waren die ersten Gebäude, die gebaut wurden, Kirchen der verschiedensten Konfessionen, um sicher zu stellen, dass jeder Mensch nach seinem Glauben leben konnte.</span>",
-    "ID" : "match-WPD!WPD_PPP.00430-p189-190",
+    "docID" : "WPD_WWW.04738",
+    "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>wurde ihm der Mirabolanen frucht und </span><span class=\"match\">baum</span><span class=\"context-right\"> &lt;Terminalia catappa L. oder Terminalia citrina<span class=\"more\"></span></span>",
+    "ID" : "match-WPD!WPD_WWW.04738-p265-266",
     "pubDate" : "2005-03-28"
   }, {
-    "author" : "Peter200,Srittau,AHoerstemeier",
+    "author" : "Sk-Bot,Wiegels,Katharina",
     "textClass" : "freizeit-unterhaltung reisen",
     "corpusID" : "WPD",
-    "title" : "Palm Beach Gardens",
-    "foundries" : "corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 xip xip/morpho xip/constituency xip/dependency treetagger treetagger/morpho connexor connexor/morpho connexor/syntax connexor/phrase mate mate/morpho mate/dependency opennlp opennlp/morpho base base/sentences base/paragraphs",
+    "title" : "Hans Heinrich von Wuthenau",
+    "foundries" : "corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 opennlp opennlp/morpho connexor connexor/morpho connexor/syntax connexor/phrase base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency mate mate/morpho mate/dependency treetagger treetagger/morpho",
     "tokenization" : "opennlp#tokens",
     "field" : "tokens",
     "startMore" : true,
     "endMore" : true,
-    "docID" : "WPD_PPP.00430",
-    "snippet" : "<span class=\"context-left\">MacArtur stellte sich die Straßen der Stadt links und rechts gesäümt mit Blumen und Bäumen vor. Millionen von USD wurden dafür verwendet um dies zu ermöglichen. Letztlich wurde an allen Straßen und Wasserstraßen mächtige Kiefern und andere schattenspendende Laubbäume gepflanzt. Da er ein Naturliebhaber war, mussten alle älteren </span><span class=\"match\">Bäume</span><span class=\"context-right\"> stehen bleiben und Straßen darum herum geführt werden. Für die damalige Zeit für Amerika eine total neue Erfahrung. Dies verteuerte das Bauvorhaben erheblich, aber MacArthur ließ sich nicht beirren. Ebenso waren die ersten Gebäude, die gebaut wurden, Kirchen der verschiedensten Konfessionen, um sicher zu stellen, dass jeder Mensch nach seinem Glauben leben konnte.</span>",
-    "ID" : "match-WPD!WPD_PPP.00430-p223-224",
+    "docID" : "WPD_WWW.07095",
+    "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>:Jch heisse drumb Gerad', das dieser </span><span class=\"match\">baum</span><span class=\"context-right\"> uns zeigetDas man aufrichtig sey, nichts<span class=\"more\"></span></span>",
+    "ID" : "match-WPD!WPD_WWW.07095-p154-155",
     "pubDate" : "2005-03-28"
   }, {
-    "author" : "Kdwnv,Doc Sleeve,Ninjamask",
-    "textClass" : "kultur film",
+    "author" : "Zwobot,Holdbold,WiseWoman",
+    "textClass" : "kultur literatur",
     "corpusID" : "WPD",
-    "title" : "Mein Nachbar Totoro",
-    "foundries" : "opennlp opennlp/morpho treetagger treetagger/morpho xip xip/morpho xip/constituency xip/dependency connexor connexor/morpho connexor/syntax connexor/phrase corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 base base/sentences base/paragraphs mate mate/morpho mate/dependency",
+    "title" : "Johann Rist",
+    "foundries" : "mate mate/morpho mate/dependency xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 treetagger treetagger/morpho connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho base base/sentences base/paragraphs",
     "tokenization" : "opennlp#tokens",
     "field" : "tokens",
     "startMore" : true,
     "endMore" : true,
-    "docID" : "WPD_MMM.04644",
-    "snippet" : "<span class=\"context-left\">Ein Vater zieht mit seinen zwei Töchtern aufs Land, um in der Nähe seiner Frau sein zu können, die sich in einem Hospital von einer schweren Krankheit erholt. Nachdem sich die drei in dem anfangs etwas gruseligen Haus eingewöhnt haben, begegnet das jüngere Mädchen dem </span><span class=\"match\">Baum-</span><span class=\"context-right\"> und Naturgeist Totoro, und beide Mädchen schließen mit dem seltsamen Wesen schnell Freundschaft. Als sich das kleine Mädchen schließlich alleine aufmacht, um seine Mutter zu besuchen, hilft Totoro der älteren Schwester, die Ausreißerin wieder zu finden...</span>",
-    "ID" : "match-WPD!WPD_MMM.04644-p94-95",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Nordelch,0",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Norra Kvill Nationalpark",
-    "foundries" : "mate mate/morpho mate/dependency base base/sentences base/paragraphs opennlp opennlp/morpho treetagger treetagger/morpho xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_NNN.05211",
-    "snippet" : "<span class=\"context-left\">Norra Kvill ist ein schwedischer Nationalpark der aus einem urwaldartigen Nadelwald im Hochland von Småland besteht. Seit über 150 Jahren wurde hier kein </span><span class=\"match\">Baum</span><span class=\"context-right\"> gefällt und manche Kiefern sind 350 Jahre alt, 35 m hoch und haben einen Umfang von 250 cm. Der wildnisartige Charakter entsteht durch umgefallene Bäume und gigantische Steinblöcke. Am Waldboden existiert eine reichhaltige Flora. 1986 wurde die Fläche des Nationalparks erweitert.</span>",
-    "ID" : "match-WPD!WPD_NNN.05211-p23-24",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Nordelch,0",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Norra Kvill Nationalpark",
-    "foundries" : "mate mate/morpho mate/dependency base base/sentences base/paragraphs opennlp opennlp/morpho treetagger treetagger/morpho xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_NNN.05211",
-    "snippet" : "<span class=\"context-left\">Norra Kvill ist ein schwedischer Nationalpark der aus einem urwaldartigen Nadelwald im Hochland von Småland besteht. Seit über 150 Jahren wurde hier kein Baum gefällt und manche Kiefern sind 350 Jahre alt, 35 m hoch und haben einen Umfang von 250 cm. Der wildnisartige Charakter entsteht durch umgefallene </span><span class=\"match\">Bäume</span><span class=\"context-right\"> und gigantische Steinblöcke. Am Waldboden existiert eine reichhaltige Flora. 1986 wurde die Fläche des Nationalparks erweitert.</span>",
-    "ID" : "match-WPD!WPD_NNN.05211-p48-49",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Vith-gilles,Head,Srbauer",
-    "textClass" : "wissenschaft populaerwissenschaft freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Rheindahlen",
-    "foundries" : "opennlp opennlp/morpho base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency treetagger treetagger/morpho mate mate/morpho mate/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_RRR.04289",
-    "snippet" : "<span class=\"context-left\">Der Stadtteil Rheindahlen besteht aus folgenden Honschaften: Bau, </span><span class=\"match\">Baum</span><span class=\"context-right\">, Broich, Dorthausen, Eickelnberg, Gatzweiler, Genhausen, Genhodder, Genholland, Genhülsen, Gerkerath, Gerkerathmühle, Gerkerathwinkel, Griesbarth, Grotherath, Günhoven, Herdt, Hilderath, Knoor, Koch, Kothausen, Mennrath, Mennrathheide, Mennrathschmidt, Merreter, Peel, Saas, Schriefers, Schriefersmühle, Sittard, Sittardheide, Viehstrasse, Voosen, Wolfsittard, Woof, Wyenhütte und Rheindahlen.</span>",
-    "ID" : "match-WPD!WPD_RRR.04289-p99-100",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "OTTO.R.M.,Factumquintus,Necrophorus",
-    "textClass" : "wissenschaft populaerwissenschaft",
-    "corpusID" : "WPD",
-    "title" : "Chamäleons",
-    "foundries" : "base base/sentences base/paragraphs opennlp opennlp/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho connexor connexor/morpho connexor/syntax connexor/phrase xip xip/morpho xip/constituency xip/dependency",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_CCC.02337",
-    "snippet" : "<span class=\"context-left\">Sie sind </span><span class=\"match\">baum-</span><span class=\"context-right\"> oder strauchbewohnende, und zum Teil auch Erdbewohnende Echsen mit einem seitlich abgeflachten Rumpf. Ein charakteristisches Merkmal dieser Tiere ist die herausschleuderbare Zunge, der Schwanz, der eingerollt werden kann und die Augen, die sich unabhängig voneinander bewegen und gemeinsam ein Blickfeld von 342° ermöglichen.</span>",
-    "ID" : "match-WPD!WPD_CCC.02337-p37-38",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "ErikDunsing,Raymond,NiKo",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Moerser Schloss",
-    "foundries" : "treetagger treetagger/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase xip xip/morpho xip/constituency xip/dependency mate mate/morpho mate/dependency opennlp opennlp/morpho base base/sentences base/paragraphs",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_MMM.08381",
-    "snippet" : "<span class=\"context-left\">Der östliche Teil des Schlosses wurde abgerissen und eine Windmühle sowie ein Wohnhaus sollten dort gebaut werden. Durch Probleme der Besitzverhältnisse der zum Schlosskauf gehörenden Grundstücke wurde es 1810 wieder weiterverkauft. Der Textilunternehmer Witgens, welcher der bedeutendste Unternehmer in Moers war, kaufte es für 2000 Franc. Er hatte schon zuvor in die östlich des Schlosses gelegenen Gebäude Wohnhaus und Fabrik gebaut. Die inneren Festungsanlagen wurden abgerissen und mit </span><span class=\"match\">Bäumen</span><span class=\"context-right\"> bepflanzt. Teile des Schlossgrundstückes wurden verkauft und von den neuen Besitzern in Gärten und Parkanlagen umgewandelt. Witgens ließ die mit Gräben durchzogene Wildnis 1838 in den heutigen Schlosspark umbauen. Das Schloss und der Park gingen 1905 in die Hand der Stadt über, die sie heute noch besitzt.</span>",
-    "ID" : "match-WPD!WPD_MMM.08381-p1449-1450",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "ErikDunsing,Raymond,NiKo",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Moerser Schloss",
-    "foundries" : "treetagger treetagger/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase xip xip/morpho xip/constituency xip/dependency mate mate/morpho mate/dependency opennlp opennlp/morpho base base/sentences base/paragraphs",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_MMM.08381",
-    "snippet" : "<span class=\"context-left\">Seit der Schleifung der Festungsanlagen durch Friedrich den Großen im Jahre 1762 waren die Festungsinsel und die einstigen Steinwälle und Gräben immer mehr verkommen. Dorngestrüpp wucherte über der verfallenen Insel und der Moerser Bürger mied es, dort entlang zu wandern. Nur vereinzelte Ziegenherden, die anspruchslos genug waren, wurden zum Grasen in die Wildnis geschickt. Wintgens, der den größten Teil der Anlage bereits gekauft hatte, ließ die Wildnis in einen Schlosspark, den heutigen Stadtpark, umbauen. Eigens zu diesem Zwecke ließ er den Hofarchitekten Maximilian Weyhe aus Düsseldorf kommen. Dieser hatte schon einige bedeutende Parkanlagen gestaltet, sein Abbild ist heute auf einer Bronzeplatte im Stadtpark verewigt. Weyhe wollte aber keinen Park in barocken geometrischen Formen bauen. Der Geschmack der Zeit war viel mehr hin zum Naturpark gewandert. Man legte Wert auf runde Formen, wilde freie </span><span class=\"match\">Bäume</span><span class=\"context-right\"> und große Steine im Park. Alles sollte natürlich wirken und nicht mit dem Zeichenbrett konstruiert. Weyhe ließ sogar eine beträchtliche Anzahl an exotischen Bäumen pflanzen. Interessant ist auch, dass er eine Turmruine anlegen ließ, da dies zu dieser Zeit als &quot;schick&quot; im Garten galt (genau wie Säulen oder Ähnliches). Auch wurden die Wasserläufe gekonnt in die Anlage integriert, und auf den einstigen Verteidigungswällen und Dämmen wurden Wege angelegt, die der Moerser Bürger heute noch gerne für einen Spaziergang durch den wunderbaren Park nutzt. Erstmals konnte der Bürger den Park jedoch im Jahre 1905 betreten, denn in diesem Jahre fiel der Besitz des Schlosses und des Parks in die Hände der Stadt Moers.</span>",
-    "ID" : "match-WPD!WPD_MMM.08381-p2076-2077",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "ErikDunsing,Raymond,NiKo",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Moerser Schloss",
-    "foundries" : "treetagger treetagger/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase xip xip/morpho xip/constituency xip/dependency mate mate/morpho mate/dependency opennlp opennlp/morpho base base/sentences base/paragraphs",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_MMM.08381",
-    "snippet" : "<span class=\"context-left\">Seit der Schleifung der Festungsanlagen durch Friedrich den Großen im Jahre 1762 waren die Festungsinsel und die einstigen Steinwälle und Gräben immer mehr verkommen. Dorngestrüpp wucherte über der verfallenen Insel und der Moerser Bürger mied es, dort entlang zu wandern. Nur vereinzelte Ziegenherden, die anspruchslos genug waren, wurden zum Grasen in die Wildnis geschickt. Wintgens, der den größten Teil der Anlage bereits gekauft hatte, ließ die Wildnis in einen Schlosspark, den heutigen Stadtpark, umbauen. Eigens zu diesem Zwecke ließ er den Hofarchitekten Maximilian Weyhe aus Düsseldorf kommen. Dieser hatte schon einige bedeutende Parkanlagen gestaltet, sein Abbild ist heute auf einer Bronzeplatte im Stadtpark verewigt. Weyhe wollte aber keinen Park in barocken geometrischen Formen bauen. Der Geschmack der Zeit war viel mehr hin zum Naturpark gewandert. Man legte Wert auf runde Formen, wilde freie Bäume und große Steine im Park. Alles sollte natürlich wirken und nicht mit dem Zeichenbrett konstruiert. Weyhe ließ sogar eine beträchtliche Anzahl an exotischen </span><span class=\"match\">Bäumen</span><span class=\"context-right\"> pflanzen. Interessant ist auch, dass er eine Turmruine anlegen ließ, da dies zu dieser Zeit als &quot;schick&quot; im Garten galt (genau wie Säulen oder Ähnliches). Auch wurden die Wasserläufe gekonnt in die Anlage integriert, und auf den einstigen Verteidigungswällen und Dämmen wurden Wege angelegt, die der Moerser Bürger heute noch gerne für einen Spaziergang durch den wunderbaren Park nutzt. Erstmals konnte der Bürger den Park jedoch im Jahre 1905 betreten, denn in diesem Jahre fiel der Besitz des Schlosses und des Parks in die Hände der Stadt Moers.</span>",
-    "ID" : "match-WPD!WPD_MMM.08381-p2100-2101",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Gabor,Asb,ChristophDemmer",
-    "textClass" : "wissenschaft populaerwissenschaft",
-    "corpusID" : "WPD",
-    "title" : "Ramismus",
-    "foundries" : "corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 base base/sentences base/paragraphs opennlp opennlp/morpho treetagger treetagger/morpho mate mate/morpho mate/dependency xip xip/morpho xip/constituency xip/dependency connexor connexor/morpho connexor/syntax connexor/phrase",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_RRR.00717",
-    "snippet" : "<span class=\"context-left\">Siehe auch: Ramifizierung, Ramifikation, Organon, Kategorienlehre, </span><span class=\"match\">Baum</span><span class=\"context-right\"> des Wissens, Arbor porphyriana, Philippismus, Neuaristotelismus, Melanchthonismus, Calvinismus, Reformation</span>",
-    "ID" : "match-WPD!WPD_RRR.00717-p159-160",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Martin-vogel,Sybilla,Gorgodon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Khasi",
-    "foundries" : "base base/sentences base/paragraphs connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_KKK.03618",
-    "snippet" : "<span class=\"context-left\">nur alleinstehende </span><span class=\"match\">Bäume</span><span class=\"context-right\"> dürfen geschlagen werden, keine Bäume aus einem Wald heraus</span>",
-    "ID" : "match-WPD!WPD_KKK.03618-p830-831",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Martin-vogel,Sybilla,Gorgodon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Khasi",
-    "foundries" : "base base/sentences base/paragraphs connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_KKK.03618",
-    "snippet" : "<span class=\"context-left\">nur alleinstehende Bäume dürfen geschlagen werden, keine </span><span class=\"match\">Bäume</span><span class=\"context-right\"> aus einem Wald heraus</span>",
-    "ID" : "match-WPD!WPD_KKK.03618-p835-836",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Stechlin,Orchi,Vlado",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Waldvöglein",
-    "foundries" : "xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase mate mate/morpho mate/dependency base base/sentences base/paragraphs treetagger treetagger/morpho opennlp opennlp/morpho",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_WWW.00689",
-    "snippet" : "<span class=\"context-left\">Cephalanthera schaberi </span><span class=\"match\">Baum</span><span class=\"context-right\">.</span>",
-    "ID" : "match-WPD!WPD_WWW.00689-p158-159",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Boris Kaiser,Plattmaster,Semon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Unterliek",
-    "foundries" : "connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_UUU.01708",
-    "snippet" : "<span class=\"context-left\">Befindet sich das Unterliek an einem </span><span class=\"match\">Baum</span><span class=\"context-right\"> (z.B. beim Großsegel), spricht man auch von dem Baumliek. Dessen Spannung, d.h. der Zug, unter dem das Segeltuch im Bereich des Unterlieks steht, wird über den Unterliekstrecker (eine Leine) gesteuert, der am Schothorn befestigt wird. Wird der Unterliekstrecker stark durchgesetzt (d.h. viel Zug mit dieser Leine ausgeübt), erhält das Unterliek ein flaches Profil (d.h. ist bei seitlichem Winddruck wenig gewölbt).</span>",
-    "ID" : "match-WPD!WPD_UUU.01708-p25-26",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Boris Kaiser,Plattmaster,Semon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Unterliek",
-    "foundries" : "connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_UUU.01708",
-    "snippet" : "<span class=\"context-left\">Man kann ein Segel an einem </span><span class=\"match\">Baum</span><span class=\"context-right\"> mit losem Unterliek fahren (z.B. bei Rollgroßanlagen): Dann ist das Segel im Bereich des Unterlieks nur am Hals und Schothorn mit dem Baum verbunden. Oder das Unterliek ist auf seiner ganzen Länge am Baum befestigt. Dies geschieht häufig, indem in das Unterliek zur Verdickung desselben ein Tau eingenäht wird und dieses dann in eine Keep (d.h. eine Nut) im Baum eingeführt wird.</span>",
-    "ID" : "match-WPD!WPD_UUU.01708-p92-93",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Boris Kaiser,Plattmaster,Semon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Unterliek",
-    "foundries" : "connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_UUU.01708",
-    "snippet" : "<span class=\"context-left\">Man kann ein Segel an einem Baum mit losem Unterliek fahren (z.B. bei Rollgroßanlagen): Dann ist das Segel im Bereich des Unterlieks nur am Hals und Schothorn mit dem </span><span class=\"match\">Baum</span><span class=\"context-right\"> verbunden. Oder das Unterliek ist auf seiner ganzen Länge am Baum befestigt. Dies geschieht häufig, indem in das Unterliek zur Verdickung desselben ein Tau eingenäht wird und dieses dann in eine Keep (d.h. eine Nut) im Baum eingeführt wird.</span>",
-    "ID" : "match-WPD!WPD_UUU.01708-p115-116",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Boris Kaiser,Plattmaster,Semon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Unterliek",
-    "foundries" : "connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_UUU.01708",
-    "snippet" : "<span class=\"context-left\">Man kann ein Segel an einem Baum mit losem Unterliek fahren (z.B. bei Rollgroßanlagen): Dann ist das Segel im Bereich des Unterlieks nur am Hals und Schothorn mit dem Baum verbunden. Oder das Unterliek ist auf seiner ganzen Länge am </span><span class=\"match\">Baum</span><span class=\"context-right\"> befestigt. Dies geschieht häufig, indem in das Unterliek zur Verdickung desselben ein Tau eingenäht wird und dieses dann in eine Keep (d.h. eine Nut) im Baum eingeführt wird.</span>",
-    "ID" : "match-WPD!WPD_UUU.01708-p126-127",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Boris Kaiser,Plattmaster,Semon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Unterliek",
-    "foundries" : "connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_UUU.01708",
-    "snippet" : "<span class=\"context-left\">Man kann ein Segel an einem Baum mit losem Unterliek fahren (z.B. bei Rollgroßanlagen): Dann ist das Segel im Bereich des Unterlieks nur am Hals und Schothorn mit dem Baum verbunden. Oder das Unterliek ist auf seiner ganzen Länge am Baum befestigt. Dies geschieht häufig, indem in das Unterliek zur Verdickung desselben ein Tau eingenäht wird und dieses dann in eine Keep (d.h. eine Nut) im </span><span class=\"match\">Baum</span><span class=\"context-right\"> eingeführt wird.</span>",
-    "ID" : "match-WPD!WPD_UUU.01708-p152-153",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Boris Kaiser,Plattmaster,Semon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Unterliek",
-    "foundries" : "connexor connexor/morpho connexor/syntax connexor/phrase opennlp opennlp/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_UUU.01708",
-    "snippet" : "<span class=\"context-left\">Wird das Segel ohne </span><span class=\"match\">Baum</span><span class=\"context-right\"> gefahren (z.B: Fock oder Genua bei Amwindkursen), wird die Schot direkt am Schothorn befestigt. Die Profilierung des Unterlieks, d.h. ob es flacher oder gewölbter ist, wird dann über den Zug der Schot und die Lage des Holepunktes gesteuert.</span>",
-    "ID" : "match-WPD!WPD_UUU.01708-p159-160",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Crux,Vic Fontaine,BS Thurner Hof",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Ananasrenette",
-    "foundries" : "connexor connexor/morpho connexor/syntax connexor/phrase base base/sentences base/paragraphs corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency treetagger treetagger/morpho xip xip/morpho xip/constituency xip/dependency opennlp opennlp/morpho",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_AAA.07202",
-    "snippet" : "<span class=\"context-left\">Die Früchte der Ananasrenette mit ihrem besonderem, sortentypischen Aroma bleiben eher klein. Sie reifen Mitte bis Ende Oktober und bleiben bei entsprechender Lagerung bis Februar genussreif. Der </span><span class=\"match\">Baum</span><span class=\"context-right\"> ist anfällig für Mehltau und Obstbaumkrebs und reagiert auf trockene Witterungsverhältnisse mit der Ausbildung sehr kleiner, wenig aromatischer Früchte.</span>",
-    "ID" : "match-WPD!WPD_AAA.07202-p78-79",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Feinschreiber,Triebtäter,Stefan Kühn",
-    "textClass" : "sport fussball",
-    "corpusID" : "WPD",
-    "title" : "Anita Kulcsár",
-    "foundries" : "xip xip/morpho xip/constituency xip/dependency mate mate/morpho mate/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 opennlp opennlp/morpho base base/sentences base/paragraphs connexor connexor/morpho connexor/syntax connexor/phrase treetagger treetagger/morpho",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_KKK.10701",
-    "snippet" : "<span class=\"context-left\">Anita Kulcsár war am Morgen des 19. Januar 2005 von ihrer Wohnung in Sukoró aus unterwegs zum Vormittagstraining nach Dunaújváros. Auf der Landstraße 6207 zwischen Velence und Pusztaszabolcs kam sie auf der glatten Fahrbahn ins Schleudern. Der Wagen kam von der Straße ab und prallte unkontrolliert gegen einen </span><span class=\"match\">Baum</span><span class=\"context-right\">. Sie starb sofort am Unfallort.</span>",
-    "ID" : "match-WPD!WPD_KKK.10701-p193-194",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Franz Xaver,Rosenzweig,Naddy",
-    "textClass" : "wissenschaft populaerwissenschaft",
-    "corpusID" : "WPD",
-    "title" : "Bussardartige",
-    "foundries" : "base base/sentences base/paragraphs xip xip/morpho xip/constituency xip/dependency mate mate/morpho opennlp opennlp/morpho treetagger treetagger/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 connexor connexor/morpho connexor/syntax connexor/phrase",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_BBB.15757",
-    "snippet" : "<span class=\"context-left\">Die Flugfähigkeit der Bussardartigen ist wesentlich schwerfälliger als die der wendigen Habichte oder Falken. Dafür ist ihr Körperbau besonders gut für lange Gleitflüge geeignet. Außerdem sind sie in der Wahl ihres Futters anpassungsfähig. In der Regel werden kleine bis mittlere Säugetiere, von manchen Arten (beispielsweise dem Seeadler (Haliaeetus)) Fische oder Wasservögel gejagt. Der südostasiatische Affenadler (Pithecophaga jefferyi) oder der südamerikanische Würgadler (Morphnus guianensis) jagen auch in </span><span class=\"match\">Bäumen</span><span class=\"context-right\"> lebende Affen und Vögel.</span>",
-    "ID" : "match-WPD!WPD_BBB.15757-p162-163",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Steschke,Asb,Paethon",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Kudzu (Pflanze)",
-    "foundries" : "base base/sentences base/paragraphs opennlp opennlp/morpho mate mate/morpho mate/dependency connexor connexor/morpho connexor/syntax connexor/phrase xip xip/morpho xip/constituency xip/dependency treetagger treetagger/morpho corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_KKK.10525",
-    "snippet" : "<span class=\"context-left\">Leider fand Kudzu im Südosten sehr gute Wachstumsbedingungen und ohne die natürlichen Feinde die in Japan vorkommen breitete er sich explosionsartig aus. Heute sind ca. 30.000 km² von Kudzu überwuchert und man wird der Plage, wegen der enormen Wachstumsgeschwindigkeit von bis zu 30cm am Tag, kaum noch Herr. Die Pflanze überwuchert in kürzester Zeit Häuser, </span><span class=\"match\">Bäume</span><span class=\"context-right\"> und alles was ihr im Weg steht. Sie kann (wenn sie nicht bekämpft wird) innerhalb weniger Monate ein Haus komplett überwuchern.</span>",
-    "ID" : "match-WPD!WPD_KKK.10525-p136-137",
-    "pubDate" : "2005-03-28"
-  }, {
-    "author" : "Filzstift,Alexander Sommer,TheK",
-    "textClass" : "freizeit-unterhaltung reisen",
-    "corpusID" : "WPD",
-    "title" : "Neuseeland",
-    "foundries" : "xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency connexor connexor/morpho connexor/syntax connexor/phrase treetagger treetagger/morpho base base/sentences base/paragraphs opennlp opennlp/morpho",
-    "tokenization" : "opennlp#tokens",
-    "field" : "tokens",
-    "startMore" : true,
-    "endMore" : true,
-    "docID" : "WPD_NNN.02848",
-    "snippet" : "<span class=\"context-left\">Als die Europäer ins Land kamen, waren etwa 70 % der Landesfläche bewaldet. Mittlerweile sind noch etwa 15 % des Landes von einheimischen Wäldern bedeckt, dazu kommen weitere etwa 5 % Fläche mit schnellwachsenden importierten </span><span class=\"match\">Bäumen</span><span class=\"context-right\"> wie Monterey Pine und Redwood für die neuseeländische Forstwirtschaft. Wesentliche Teile der ursprünglichen Wälder stehen unter Naturschutz, zu guten Teilen in Nationalparks und so genannten Forest Parks.</span>",
-    "ID" : "match-WPD!WPD_NNN.02848-p1139-1140",
+    "docID" : "WPD_RRR.05363",
+    "snippet" : "<span class=\"context-left\"><span class=\"more\"></span>Emblem wird das heilige holtz der </span><span class=\"match\">baum</span><span class=\"context-right\"> Guajacum genant, fremde Brasilianische landschaft, der<span class=\"more\"></span></span>",
+    "ID" : "match-WPD!WPD_RRR.05363-p373-374",
     "pubDate" : "2005-03-28"
   } ],
-  "totalResults" : 4053,
+  "totalResults" : 3,
   "startIndex" : 0,
   "itemsPerPage" : 25,
-  "benchmarkSearchResults" : "6.02 ms",
-  "benchmarkHitCounter" : "6.795 ms",
+  "benchmarkSearchResults" : "1.638 ms",
+  "benchmarkHitCounter" : "4.332 ms",
   "error" : null,
   "request" : {
     "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.1/context.jsonld",
@@ -565,7 +277,7 @@
       "wrap" : {
         "@type" : "korap:term",
         "key" : "baum",
-        "layer" : "lemma",
+        "layer" : "orth",
         "match" : "match:eq"
       }
     },
@@ -577,10 +289,10 @@
         "@value" : "WPD"
       }
     } ],
-    "meta" : {
-      "startPage" : 1,
-      "context" : "paragraph"
-    }
+    "meta" : { }
   },
-  "context" : "p"
+  "context" : {
+    "left" : [ "token", 6 ],
+    "right" : [ "token", 6 ]
+  }
 }
diff --git a/lib/Korap/Search.pm b/lib/Korap/Search.pm
index fd9e6d5..466266b 100644
--- a/lib/Korap/Search.pm
+++ b/lib/Korap/Search.pm
@@ -10,10 +10,12 @@
   if ((scalar $c->param('action') // '') eq 'inspect') {
     my $api = $c->config('KorAP')->{api};
     my $url = Mojo::URL->new($api)->path('resource/query');
+
     $url->query({
       q => scalar $c->param('q') // '',
       ql => scalar $c->param('ql') // 'poliqarp'
     });
+
     if (my $response = $c->ua->get($url)->success) {
       $c->stash('search.query' => $response->json);
     }
@@ -33,6 +35,16 @@
 };
 
 
+#sub match {
+#  my $c = shift;
+#  my $corpus_id = $c->stash('corpus_id');
+#  my $doc_id = $c->stash('doc_id');
+#  my $match_id = $c->stash('match_id');
+#  return $c->render(json => {
+#    match => 'match-' . $corpus_id . '!' . $corpus_id . '_' . $doc_id . '-' . $match_id
+#  });
+#};
+
 
 sub info {
   my $c = shift;
@@ -48,3 +60,11 @@
 __END__
 
 [{"shared":false,"id":1,"managed":true,"created":1401193381119,"stats":{"documents":196510,"tokens":51545081,"sentences":4116282,"paragraphs":2034752},"query":[{"@type":"korap:meta-filter","@value":{"@type":"korap:term","@field":"korap:field#corpusID","@value":"WPD"}}],"description":"Die freie Enzyklopädie","name":"Wikipedia","foundries":"base;corenlp;mate;mpt;opennlp;tt;xip"}]
+
+
+
+
+
+http://10.0.10.13:8070/api/v1/resource/matchInfo?id=match-WPD!WPD_NNN.02848-p1223-1224&f=mate&l=
+
+{"author":"Filzstift,Alexander Sommer,TheK","textClass":"freizeit-unterhaltung reisen","corpusID":"WPD","title":"Neuseeland","foundries":"xip xip/morpho xip/constituency xip/dependency corenlp corenlp/namedentities corenlp/namedentities/ne_dewac_175m_600 corenlp/namedentities corenlp/namedentities/ne_hgc_175m_600 mate mate/morpho mate/dependency connexor connexor/morpho connexor/syntax connexor/phrase treetagger treetagger/morpho base base/sentences base/paragraphs opennlp opennlp/morpho","tokenization":"opennlp#tokens","field":"tokens","startMore":false,"endMore":false,"docID":"WPD_NNN.02848","snippet":"<span class=\"context-left\"></span><span class=\"match\"><span title=\"mate/l:besonders\"><span title=\"mate/p:ADV\">Besonders</span></span> <span title=\"mate/l:auffällig\"><span title=\"mate/m:degree:pos\"><span title=\"mate/p:ADJD\">auffällig</span></span></span> <span title=\"mate/l:sein\"><span title=\"mate/m:mood:ind\"><span title=\"mate/m:number:pl\"><span title=\"mate/m:person:3\"><span title=\"mate/m:tense:pres\"><span title=\"mate/p:VAFIN\">sind</span></span></span></span></span></span> <span title=\"mate/l:schließlich\"><span title=\"mate/p:ADV\">schließlich</span></span> <span title=\"mate/l:noch\"><span title=\"mate/p:ADV\">noch</span></span> <span title=\"mate/l:der\"><span title=\"mate/m:case:nom\"><span title=\"mate/m:gender:masc\"><span title=\"mate/m:number:sg\"><span title=\"mate/p:ART\">der</span></span></span></span></span> <span title=\"mate/l:pohutukawa\"><span title=\"mate/m:case:nom\"><span title=\"mate/m:gender:masc\"><span title=\"mate/m:number:sg\"><span title=\"mate/p:NE\">Pohutukawa</span></span></span></span></span> <span title=\"mate/l:und\"><span title=\"mate/p:KON\">und</span></span> <span title=\"mate/l:der\"><span title=\"mate/m:case:nom\"><span title=\"mate/m:gender:masc\"><span title=\"mate/m:number:sg\"><span title=\"mate/p:ART\">der</span></span></span></span></span> <span title=\"mate/l:cabbage\"><span title=\"mate/m:case:nom\"><span title=\"mate/m:gender:masc\"><span title=\"mate/m:number:sg\"><span title=\"mate/p:NE\">Cabbage</span></span></span></span></span> <span title=\"mate/l:tree\"><span title=\"mate/m:gender:masc\"><span title=\"mate/m:number:sg\"><span title=\"mate/p:NE\"><span title=\"mate/m:case:nom\">Tree</span></span></span></span></span></span><span class=\"context-right\"></span>","ID":"match-WPD!WPD_NNN.02848-p1213-1224","pubDate":"2005-03-28","context":{"left":["token",0],"right":["token",0]}}
diff --git a/public/favicon.ico b/public/favicon.ico
index 6a2a60a..b84dd71 100644
--- a/public/favicon.ico
+++ b/public/favicon.ico
Binary files differ
diff --git a/public/img/crab.svg b/public/img/crab.svg
new file mode 100644
index 0000000..5a458b6
--- /dev/null
+++ b/public/img/crab.svg
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="225.32735"
+   height="123.96949"
+   id="svg2">
+<style type="text/css">
+<![CDATA[
+#crab {
+  -webkit-animation: crab-loading 1s linear infinite alternate;
+  -moz-animation: crab-loading 1s linear infinite alternate;
+  -ms-animation: crab-loading 1s linear infinite alternate;
+  animation: crab-loading 1s linear infinite alternate;
+}
+
+@keyframes "crab-loading" {
+ 0% { opacity: 1 }
+ 100% { opacity: .3 }
+}
+
+@-moz-keyframes crab-loading {
+ 0% { opacity: 1 }
+ 100% { opacity: .3 }
+}
+
+@-webkit-keyframes "crab-loading" {
+ 0% { opacity: 1 }
+ 100% { opacity: .3 }
+}
+
+@-ms-keyframes "crab-loading" {
+ 0% { opacity: 1 }
+ 100% { opacity: .3 }
+}
+]]>
+</style>
+  <g transform="translate(244.69549,-1534.2222)" id="crab">
+    <path
+       d="m -190.41372,1534.2297 c -1.87598,0.078 -3.90347,0.9104 -4.93415,2.805 -1.03069,1.8946 -0.85775,4.4023 0.50693,7.4013 2.59395,5.7003 9.37369,10.2244 15.44459,13.6534 6.0709,3.4287 11.5581,5.6102 11.5581,5.6101 l 0.7435,0.3041 0.70971,-0.3717 c 3.97779,-2.1137 6.35183,-3.9594 10.44283,-5.3736 l 4.90037,-1.6897 -4.96795,-1.5547 c -1.84992,-0.5915 -9.38784,-3.1478 -16.1205,-6.2183 -3.36634,-1.5353 -6.53012,-3.2136 -8.61788,-4.7652 -1.04388,-0.7758 -1.82396,-1.5437 -2.19672,-2.0954 -0.37276,-0.5515 -0.3443,-0.7187 -0.30415,-0.8448 0.67234,-2.1144 -0.39734,-4.2009 -1.89257,-5.306 -1.49521,-1.1051 -3.39869,-1.6321 -5.27211,-1.5545 z"
+       id="path4758"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m -74.461002,1534.2297 c -1.635708,0.062 -3.233282,0.5818 -4.528611,1.5545 -1.480378,1.1117 -2.527165,3.2041 -1.858758,5.306 0.04013,0.1261 0.06859,0.2933 -0.304161,0.8448 -0.372757,0.5517 -1.119029,1.3196 -2.162918,2.0954 -2.087768,1.5516 -5.251545,3.2299 -8.617879,4.7652 -6.732668,3.0705 -14.304371,5.6268 -16.154301,6.2183 l -4.93416,1.5547 4.90037,1.6897 c 4.08557,1.4124 6.38985,3.256 10.375247,5.3736 l 0.709708,0.3717 0.743503,-0.3041 c 0,0 5.503503,-2.1816 11.591892,-5.6101 6.088389,-3.4287 12.883035,-7.9501 15.478386,-13.6534 1.367214,-3.0046 1.493463,-5.5464 0.439343,-7.4351 -1.05412,-1.8889 -3.092616,-2.6935 -4.967954,-2.7712 -0.234103,-0.01 -0.476037,-0.01 -0.709707,0 z"
+       id="path4756"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m -212.85399,1549.6067 -1.68978,0.033 0,0.1009 c -0.5335,0.033 -1.04889,0.01 -1.5884,0.1019 -3.5738,0.6287 -6.1181,1.7403 -7.80678,3.2106 -1.68869,1.4703 -2.51345,3.4985 -2.02774,5.3397 0.48571,1.8411 2.14291,3.1403 4.15686,3.6161 2.01395,0.4758 4.46105,0.2172 7.19846,-0.9124 0.9298,-0.3837 3.67059,-0.3533 6.9619,0.4055 3.2913,0.7587 7.19636,2.0899 11.01736,3.5824 3.821,1.4924 7.54967,3.147 10.54423,4.5961 2.99456,1.4492 5.33458,2.7781 5.98183,3.2444 l 1.11524,0.8111 1.04767,-0.9125 c 1.66667,-1.4688 3.47037,-2.9573 5.4073,-4.2582 l 2.12912,-1.4532 -2.12912,-1.4194 c 0,0 -6.08149,-4.0565 -14.09276,-8.0772 -8.01129,-4.0206 -17.9242,-8.1056 -26.22539,-8.0095 z"
+       id="path4754"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m -51.243422,1549.6067 c -8.301218,-0.097 -18.214122,3.989 -26.225389,8.0095 -8.011267,4.0207 -14.058971,8.0772 -14.058971,8.0772 l -2.162919,1.4194 2.162919,1.4532 c 1.936819,1.3008 3.740465,2.7895 5.407296,4.2582 l 1.013868,0.9125 1.115256,-0.8111 c 0.64722,-0.4663 3.021056,-1.7952 6.015617,-3.2444 2.994561,-1.4491 6.723217,-3.1037 10.544228,-4.5961 3.821012,-1.4925 7.726064,-2.8236 11.017367,-3.5824 3.291302,-0.7587 6.032109,-0.7892 6.961894,-0.4055 2.736752,1.1294 5.188766,1.3892 7.198464,0.9124 2.009698,-0.4767 3.651222,-1.8059 4.123064,-3.6499 0.47184,-1.844 -0.367913,-3.8384 -2.061533,-5.3059 -1.693619,-1.4675 -4.233231,-2.5821 -7.806784,-3.2106 -0.516105,-0.091 -1.019275,-0.068 -1.520802,-0.1019 l 0,-0.1009 -1.723575,-0.033 z"
+       id="path4752"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m 96.71875,25.875 c -15.41633,0 -55.97447,25.9618 -50.53125,48.25 4.19178,17.1639 24.73337,11.28575 32.34375,13.21875 11.00726,2.7968 10.21875,6.375 10.21875,6.375 l 10.875,0 8.5625,0 10.9375,0 c 0,0 -0.85101,-3.5784 10.15625,-6.375 7.61039,-1.9332 28.21448,3.94515 32.40625,-13.21875 5.44321,-22.2882 -35.11496,-48.25 -50.53125,-48.25 l -2.90625,0 -8.6875,0 -2.84375,0 z M 99.5,39.0625 l 1.75,0 5.3125,0 1.8125,0 c 9.42579,0 34.20306,15.8725 30.875,29.5 -2.56292,10.4943 -15.1906,6.8804 -19.84375,8.0625 -6.73003,1.7098 -6.21875,3.875 -6.21875,3.875 l -6.625,0 -5.25,0 -6.625,0 c 0,0 0.44879,-2.1652 -6.28125,-3.875 -4.65313,-1.1821 -17.18707,2.4318 -19.75,-8.0625 -3.32807,-13.6275 21.41794,-29.5 30.84375,-29.5 z"
+       transform="translate(-235.97433,1533.0242)"
+       id="path4750"
+       style="fill:#496000;fill-opacity:1;stroke:none" />
+    <path
+       d="m -47.728681,1565.254 0,0.1019 c -0.624856,0.015 -1.278122,4e-4 -1.892553,0.034 -7.293762,0.4502 -14.340139,2.8052 -19.905611,5.1369 -2.782735,1.1658 -5.193913,2.3345 -7.06328,3.2782 -1.869367,0.9437 -3.289432,1.6746 -3.717517,1.8588 l -2.433283,1.0476 1.960145,1.825 c 0.533797,0.4851 1.646089,1.486 2.703648,2.5684 1.057559,1.0825 2.100421,2.3037 2.433284,2.8726 l 0.777299,1.3518 1.419415,-0.642 c 5.132411,-2.2688 12.432326,-4.9748 18.925538,-6.5226 3.246605,-0.7738 6.29645,-1.2434 8.68547,-1.2505 2.389019,-0.01 3.977986,0.4902 4.596202,1.1153 2.153023,2.1773 4.795537,3.2808 7.232259,3.5147 2.436722,0.2342 4.718591,-0.3137 6.319778,-1.7236 0.800593,-0.7048 1.412797,-1.6792 1.588393,-2.8049 0.175597,-1.126 -0.102589,-2.3251 -0.743503,-3.4134 -1.281833,-2.1768 -3.859663,-4.1179 -8.212332,-5.9819 -3.487123,-1.4931 -7.195046,-2.179 -10.882184,-2.298 l -1.791168,-0.068 z"
+       id="path4748"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m -218.1937,1565.3892 c -3.65017,0.117 -7.31495,0.7319 -10.8146,2.2305 -4.35268,1.864 -6.93048,3.8051 -8.21233,5.9819 -0.64092,1.0883 -0.95289,2.2874 -0.7773,3.4133 0.1756,1.1258 0.8216,2.1001 1.62219,2.805 1.60119,1.4099 3.88306,1.9577 6.31978,1.7236 2.43672,-0.234 5.04543,-1.3375 7.19847,-3.5148 0.61821,-0.6251 2.24098,-1.1222 4.62999,-1.1152 2.38902,0.01 5.43887,0.4766 8.68547,1.2505 6.49322,1.5477 13.79314,4.2538 18.92554,6.5225 l 1.41942,0.6421 0.77729,-1.3518 c 0.33287,-0.5689 1.37573,-1.7901 2.43328,-2.8726 1.05757,-1.0825 2.13606,-2.0833 2.66986,-2.5685 l 1.99394,-1.825 -2.46708,-1.0476 c -0.47156,-0.2028 -2.06166,-1.0395 -4.19065,-2.0953 -2.129,-1.0558 -4.89069,-2.3692 -8.04336,-3.6162 -6.30532,-2.4941 -14.22526,-4.8173 -22.16991,-4.5624 z"
+       id="path4746"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m -216.6729,1581.4083 c -11.27963,0.087 -22.49602,4.1353 -26.42816,13.1127 -1.54561,3.5289 -2.0486,6.0234 -1.14905,8.0772 0.44977,1.0268 1.35341,1.8052 2.33189,2.1291 0.97849,0.3237 2.00505,0.3087 2.97402,0.1009 1.93793,-0.4152 3.85976,-1.5367 5.54248,-3.0415 1.68272,-1.5049 3.12807,-3.4195 3.68371,-5.6777 0.18992,-0.7718 0.52755,-1.2506 1.18286,-1.6898 0.65529,-0.4392 1.66661,-0.7958 2.94021,-0.98 2.54721,-0.3685 6.10322,-0.063 9.76693,0.6082 7.3274,1.3445 15.07535,4.0766 17.50612,4.9343 l 1.72358,0.6082 0.50693,-1.7236 c 0.75761,-2.4785 1.92603,-4.9519 3.41336,-7.4349 l 0.77729,-1.3519 -1.25043,-0.9124 c -6.24257,-4.6019 -14.98036,-6.825 -23.52174,-6.7592 z"
+       id="path4742"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m -47.390725,1581.4083 c -8.54117,-0.064 -17.279102,2.1572 -23.521739,6.7592 l -1.284233,0.9124 0.811094,1.3519 c 1.479902,2.4741 2.659007,4.9678 3.413357,7.435 l 0.506934,1.7235 1.68978,-0.6082 c 2.430299,-0.8579 10.212522,-3.5899 17.539917,-4.9343 3.663693,-0.6722 7.219726,-0.9768 9.76693,-0.6082 1.273602,0.1843 2.284919,0.5408 2.940217,0.98 0.6553,0.4392 0.992931,0.918 1.182846,1.6898 0.555655,2.2582 2.001003,4.1728 3.683721,5.6777 1.682719,1.5048 3.604548,2.6263 5.542479,3.0415 0.968967,0.2078 1.961736,0.2229 2.940218,-0.1009 0.978482,-0.3239 1.915914,-1.1023 2.365692,-2.1291 0.899547,-2.0538 0.396549,-4.5482 -1.14905,-8.0771 -3.932132,-8.9773 -15.14839,-13.0257 -26.428163,-13.1127 z"
+       id="path4740"
+       style="fill:#7ba400;fill-opacity:1;stroke:none" />
+    <path
+       d="m -199.80889,1608.1068 c -5.72647,8.8089 -6.84451,19.7536 -2.90642,28.2532 3.84029,8.2883 12.76155,13.9293 25.88742,12.4705 1.63498,2.1724 8.70891,10.5117 22.20372,9.2263 3.73241,-0.3554 6.80281,-2.761 9.02342,-4.9342 2.22062,-2.1733 3.64993,-4.2921 3.64993,-4.2921 l 2.02774,-3.0077 -3.61613,0.3379 c 0,0 -4.06082,0.3811 -8.07715,0.169 -2.00817,-0.106 -3.99749,-0.3908 -5.33971,-0.8449 -0.6711,-0.227 -1.17123,-0.4952 -1.41941,-0.7098 -0.24819,-0.2144 -0.25703,-0.2665 -0.27037,-0.4054 -0.0884,-0.9212 0.20185,-1.3776 1.11526,-2.0278 0.91341,-0.6502 2.43168,-1.2288 4.02167,-1.5884 3.17999,-0.7189 6.55635,-0.7097 6.55635,-0.7097 l 3.37956,0 -1.99394,-2.7374 c 0,0 -2.32914,-3.2443 -6.65773,-5.4073 -4.3286,-2.1632 -10.82852,-3.23 -18.68898,0.6758 -2.73757,1.3605 -6.01045,1.1786 -8.3813,-0.2365 -2.37086,-1.4151 -3.92328,-3.884 -3.37956,-7.773 l 0.20277,-1.3857 -1.35183,-0.4731 c -1.60303,-0.552 -3.28423,-1.7388 -4.83277,-3.2443 l -0.16897,-0.169 -0.20278,-0.1019 c -3.528,-1.9119 -6.27035,-4.8804 -7.60401,-10.3414 l 0,-0.034 c -0.0874,-0.3495 -0.084,-0.3899 -0.0338,-0.169 l -2.16292,0.068 -0.98007,-0.6083 z"
+       id="path4738"
+       style="fill:#496000;fill-opacity:1;stroke:none" />
+    <path
+       d="m -64.25473,1608.1068 -0.946277,0.6084 -2.196714,-0.1009 c 0.04812,-0.1921 0.01409,-0.1048 -0.06759,0.2366 -1.333667,5.461 -4.07601,8.4296 -7.604011,10.3414 l -0.202774,0.102 -0.168978,0.1689 c -1.548541,1.5055 -3.19595,2.6923 -4.798976,3.2444 l -1.351824,0.4731 0.202775,1.3857 c 0.543713,3.8889 -1.0087,6.3578 -3.379562,7.7729 -2.370861,1.4152 -5.643746,1.597 -8.381309,0.2366 -7.86047,-3.906 -14.39417,-2.839 -18.72277,-0.6759 -4.3286,2.163 -6.65774,5.4073 -6.65774,5.4073 l -1.96013,2.7375 3.37956,0 c 0,0 3.34282,-0.01 6.52255,0.7096 1.58986,0.3592 3.10844,0.9044 4.02167,1.5547 0.91323,0.6501 1.23762,1.1383 1.14905,2.0615 -0.0133,0.1391 -0.0222,0.191 -0.27036,0.4055 -0.24819,0.2146 -0.74831,0.4828 -1.41942,0.7097 -1.34219,0.4541 -3.36534,0.7388 -5.3735,0.8449 -4.01633,0.2121 -8.04335,-0.1688 -8.04335,-0.1689 l -3.61613,-0.338 2.02773,3.0078 c 0,0 1.39551,2.1187 3.61613,4.2921 2.22062,2.1731 5.29098,4.5789 9.02343,4.9341 13.494356,1.2853 20.547287,-7.0525 22.169919,-9.2262 13.122925,1.4561 22.030624,-4.1845 25.887433,-12.4706 3.955697,-8.4985 2.885484,-19.4428 -2.838831,-28.2531 z"
+       id="path4581"
+       style="fill:#496000;fill-opacity:1;stroke:none" />
+  </g>
+</svg>
diff --git a/public/img/korap-logo-solo.svg b/public/img/korap-logo-solo.svg
index e74b29a..0478e5a 100644
--- a/public/img/korap-logo-solo.svg
+++ b/public/img/korap-logo-solo.svg
@@ -10,7 +10,6 @@
    version="1.1"
    width="292.90839"
    height="104.8784"
-   transform="scale(.6)"
    id="svg2">
   <defs
      id="defs4" />
diff --git a/public/img/loading.gif b/public/img/loading.gif
deleted file mode 100644
index c9aaeda..0000000
--- a/public/img/loading.gif
+++ /dev/null
Binary files differ
diff --git a/public/kwic-4.0.css b/public/kwic-4.0.css
new file mode 100644
index 0000000..64f1232
--- /dev/null
+++ b/public/kwic-4.0.css
@@ -0,0 +1,220 @@
+@charset "utf-8";
+
+/*
+  light orange: #f4eebb;
+  dark orange: #ffa500;
+  dark green: #496000;
+  light green: #7ba400;
+
+  Search for: [orth=erstens]
+*/
+
+ol {
+  width: auto;
+  overflow: hidden;
+  list-style-type: none;
+  font-size: 10pt;
+  margin: 0;
+  padding: 0;
+  text-indent: 0;
+  border: 1px solid #ccc;
+  font-family: verdana, tahoma, arial;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.4);
+}
+
+ol > li {
+  border-style: solid;
+  border-color: #ffa500;
+  border-width: 0;
+}
+
+ol > li:not(.active) {
+  width: 99999%;
+  margin-left: -49999.5%;
+  background-color: #f5f5f5;
+  overflow: hidden;
+  white-space: no-wrap;
+  cursor: pointer;
+  padding: 10px 0;
+  text-indent: 0;
+}
+
+ol > li:nth-of-type(even) {
+  background-color: #ddd;
+}
+
+ol > li > div.snippet > span,
+ol > li > div.snippet > span > span {
+  white-space: no-wrap !important;
+}
+
+ol.free-aligned > li:not(.active) > div.snippet > span.left {
+  display: inline-block;
+  text-align: right;
+  width: 50.046%;
+}
+
+ol.free-aligned > li:not(.active) > div.snippet > span.separator {
+  width: 0px;
+  height: 1em;
+  margin-bottom: -2px;
+  display: inline-block;
+  line-height: 100%;
+  border: 1px solid #009EE0;
+  margin-left: 2px;
+  margin-right: 2px;
+}
+
+ol.free-aligned > li > div.snippet > span.right {
+  text-align: left;
+}
+
+ol.left-aligned > li > div.snippet > span.context-left {
+  display: inline-block;
+  text-align: right;
+  width: 50.01%;
+}
+
+ol.right-aligned {
+  text-align: right;
+}
+
+ol.right-aligned > li:not(.active) > div.snippet > span.context-right {
+  display: inline-block;
+  text-align: left;
+  width: 49.915%;
+}
+
+li > div.snippet > span {
+  color: #666;
+}
+
+.match {
+  font-weight: bold;
+  text-shadow: 1px 1px rgba(255, 255, 255, 0.9);
+  color: #111;
+  padding-left: 4pt;
+  padding-right: 2pt;
+}
+
+em, em.level-0 {
+  border-bottom-width: 2px;
+  border-bottom-style: solid;
+  padding-bottom: 0px;
+  font-style: normal;
+}
+
+em > em, em.level-1 {
+  padding-bottom: 3px;
+}
+
+em > em > em, em.level-2 {
+  padding-bottom: 6px;
+}
+
+.class-0 { border-color: #c1002b; }
+.class-1 { border-color: #009ee0; }
+.class-2 { border-color: #f29400; }
+
+span.more:before {
+  content: "…";
+  padding-left: 2pt;
+  padding-right: 2pt;
+}
+
+/* active view */
+ol > li.active {
+  text-align: left;
+  width: auto;
+  cursor: normal;
+  white-space: wrap;
+  height: auto;
+  border-width: 2px;
+  background-color: #f4eebb;
+  position: relative;
+  min-height: 68pt;
+}
+
+ol > li.active > div.snippet {
+  margin: 5pt 10pt;
+  margin-right: 3em;
+  margin-bottom: 24pt;
+}
+
+ol > li.active > div.snippet > span {
+  line-height: 1.4em;
+  width: auto;
+}
+
+ol > li.active > div.snippet > span.context-left {
+  margin-left: 0;
+  display: inline;
+  overflow: visible;
+  text-align: left;
+  width: auto;
+}
+
+/* Korap-Actions: */
+ol > li ul.action {
+  display: none;
+}
+
+ol > li ul.action li {
+  cursor: pointer;
+  color: white;
+  text-decoration: none;
+}
+
+ol > li.active ul.action {
+  background-color: #ffa500;
+  font-size: 12pt;
+  color: white;
+  text-shadow: none;
+  display: block;
+  margin: 0;
+  padding: 0;
+  z-index: 4;
+  text-indent: 0;
+  list-style-type: none;
+  list-style-position: inline;
+}
+
+/*
+ol > li.active ul.action.right {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 1.2em;
+}
+
+ol > li.active ul.action.right li {
+  float: left;
+  padding-left: 1em;
+}
+*/
+
+ol > li.active ul.action.right {
+  position: absolute;
+  float: right;
+  text-align: center;
+  padding: 0pt 3pt;
+  height: 100%;
+  width: 1.2em;;
+  right: 0;
+  top: 0;
+}
+
+ol > li:not(.active) p {
+  display: none;
+}
+
+ol > li.active p {
+  background-color: #ffa500;
+  color: white;
+  text-shadow: none;
+  padding: 3pt 10pt;
+  margin: 5pt 0pt 0pt 0pt;
+  position: absolute;
+  width: 100%;
+  bottom: 0;
+}
\ No newline at end of file
diff --git a/public/style.css b/public/style.css
index dff0bcb..0ad372e 100644
--- a/public/style.css
+++ b/public/style.css
@@ -8,9 +8,11 @@
 
 #top {
   background-color: #7ba400;
-  padding: 10pt 0 10pt 30pt;
+  padding: 0pt;
+  padding-top: 10px;
   position: relative;
-  height: 62.5px;
+  height: 70px;
+  padding-left: 30px;
 }
 
 #button-right {
@@ -216,16 +218,6 @@
   margin-bottom: 40px;
 }
 
-/*
-iframe {
-  border-width: 0;
-  border-top: 1px solid #ccc;
-  border-bottom: 1px solid #ccc;
-  height: 300px;
-  width: 100%;
-}
-*/
-
 #tutorial {
   position: fixed;
   z-index: 9999;
@@ -253,8 +245,27 @@
   min-height: 100%;
   border-width: 0;
   border-radius: 10px;
-  background-image: url('img/loading.gif');
+  background-image: url('img/crab.svg');
+  background-size: 10%;
   background-repeat: no-repeat;
   background-position: center center;
   background-color: white;
+}
+
+h1 {
+    margin: 0;
+    left: 0;
+    top: 0;
+    background-image: url('/img/korap-logo-solo.svg');
+    position: absolute;
+    width: 260px; /* like sidebars*/
+    height: 80px; /* like #top */
+    z-index: 999;
+    background-repeat: no-repeat;
+    background-position: center center;
+    background-size: 65%;
+}
+
+h1 span {
+    margin-left: -3000px;
 }
\ No newline at end of file
diff --git a/public/translatehtml.js b/public/translatehtml.js
new file mode 100644
index 0000000..4a1f4c6
--- /dev/null
+++ b/public/translatehtml.js
@@ -0,0 +1,147 @@
+var cleanRegex = /^([^\/]+?\/)?[^\:]+?\:/;
+var splitRegex = /^(.+?):([^:]+?)$/;
+
+// SnippetTree constructor
+function SnippetTree (obj) {
+  this.children = [];
+  this.data = obj;
+
+  // Replace title
+  this.cleanTitle = function (title) {
+    return title.replace(cleanRegex, "");
+  };
+
+  // Add new child to tree
+  this.addChild = function (childData) {
+    var c = new SnippetTree (childData);
+    this.children.push(c);
+    return c;
+  };
+
+  // Recursively parse children
+  this.parseChildren = function (children) {
+    for (var i in children) {
+      var c = children[i];
+      if (c.nodeType === 1) {
+	if (c.getAttribute("title")) {
+	  var title = this.cleanTitle(c.getAttribute("title"));
+	  var childTree = this.addChild({ type : title });
+	  if (c.hasChildNodes())
+	    childTree.parseChildren(c.childNodes);
+	}
+	else if (c.hasChildNodes())
+	  this.parseChildren(c.childNodes);
+      }
+      else if (c.nodeType === 3)
+	if (c.nodeValue.match(/[-a-z0-9]/i)) {
+	  this.addChild({
+	    type : "leaf",
+	    word : c.nodeValue
+	  });
+	};
+    };
+    return this;
+  };
+};
+
+
+// SnippetTable constructor
+function SnippetTable (obj) {
+  this.info = [];
+  this.overall = {};
+  this.pos = 0;
+  this.load = function (children) {
+    for (var i in children) {
+      var c = children[i];
+
+      // element with title
+      if (c.nodeType === 1) {
+	if (c.getAttribute("title")) {
+	  if (splitRegex.exec(c.getAttribute("title"))) {
+
+	    // Create object on position unless it exists
+	    if (!this.info[this.pos]) {
+	      this.info[this.pos] = {};
+	    };
+
+	    // Fill position with info
+	    this.info[this.pos][RegExp.$1] = RegExp.$2;
+	    this.overall[RegExp.$1] = 1;
+	  };
+	};
+
+	// depth search
+	if (c.hasChildNodes())
+	  this.load(c.childNodes);
+      }
+
+      // Leaf node - store string on position and go to next string
+      else if (c.nodeType === 3)
+	if (c.nodeValue.match(/[-a-z0-9]/i))
+	  this.info[this.pos++]["-s"] = c.nodeValue;
+    };
+    return this;
+  };
+};
+
+
+// Make tree from snippet
+function translateTree (snippet) {
+  var html = document.createElement("tree");
+  html.innerHTML = snippet;
+  return new SnippetTree({ type : "ROOT" }).parseChildren(html.childNodes);
+};
+
+
+// Make table from snippet
+function translateTable (snippet) {
+  // Create wrapper element
+  var html = document.createElement("table");
+  html.innerHTML = snippet;
+
+  // Create table object and load data from HTML
+  var info = new SnippetTable();
+  info.load(html.childNodes);
+
+  // Sort keys
+  var overallArray = [];
+  for (i in info.overall) {
+    overallArray.push(i);
+  };
+  overallArray.sort();
+
+  // Create HTML based on info
+  var d = document;
+  var table = d.createElement('table');
+  var tr = d.createElement('tr');
+  table.appendChild(tr);
+  var th = d.createElement('th');
+  tr.appendChild(th);
+
+  // Header line with surface strings
+  for (i in info.info) {
+    th = d.createElement('th');
+    tr.appendChild(th);
+    th.appendChild(d.createTextNode(info.info[i]["-s"]));
+  };
+
+  // Annotations
+  for (i in overallArray) {
+    i = overallArray[i];
+
+    tr = d.createElement('tr');
+    table.appendChild(tr);
+    th = d.createElement('th');
+    tr.appendChild(th);
+    th.appendChild(d.createTextNode(i));
+    for (t in info.info) {
+      var td = d.createElement('td');
+      tr.appendChild(td);
+      if (info.info[t][i] !== undefined)
+	td.appendChild(d.createTextNode(info.info[t][i]));
+    };
+  };
+
+  // return HTML object
+  return table;
+};
diff --git a/templates/layouts/default.html.ep b/templates/layouts/default.html.ep
index 97c53b4..c34f35f 100644
--- a/templates/layouts/default.html.ep
+++ b/templates/layouts/default.html.ep
@@ -3,21 +3,22 @@
   <head>
     <title><%= title %></title>
 %= stylesheet '/style.css'
-%= stylesheet '/kwic-3.0.css'
+%= stylesheet '/kwic-4.0.css'
 %= stylesheet '/fontawesome/font-awesome.min.css'
 %= javascript '/jquery-2.0.0.min.js'
+%= javascript '/translatehtml.js'
 <meta charset="utf-8" />
   </head>
   <body>
 
 <div id="tutorial" style="display: none">
   <i onclick="closeTutorial()" class="fa fa-toggle-up"></i>
-  <iframe src="about:blank" data-src="<%= url_for(session('tutorial') // 'tutorial') %>"></iframe>
+  <iframe src="about:blank" data-src="<%= url_for(session('tutorial') || 'tutorial') %>"></iframe>
 </div>
 
+
 <div id="top">
-%#= image '/img/korap-logo.svg', style => 'position: absolute; z-index: 999'
-%= image '/img/korap-logo-solo.svg', style => 'position: absolute; z-index: 999'
+  <h1><span>KorAP- Korpusanalyseplattform der nächsten Generation</span></h1>
 %= form_for url_for() => begin
 %= select_field ql => [[Poliqarp => 'poliqarp'], ['Cosmas II' => 'cosmas2']], id => 'ql-field'
 <br />
@@ -39,6 +40,13 @@
 %= include 'collections'
 </div>
 
+
+%# <div>
+%#= javascript begin
+%# translateTable();
+%# end
+%# </div>
+
 <div id="search">
 %= content
 </div>
@@ -53,6 +61,15 @@
   $(o.parentNode.parentNode).removeClass('active');
 };
 
+
+function showTable (o) {
+  var match = o.parentNode.parentNode;
+  var corpusID = match.getAttribute('data-corpus-id');
+  var docID = match.getAttribute('data-doc-id');
+  var matchID = match.getAttribute('data-match-id');
+  jQuery.getJSON('/corpus/' + corpusID + '/' + docID + '/' + matchID);
+};
+
 function openTutorial (o) {
   var tut = $("#tutorial");
   tut.slideDown();
@@ -73,10 +90,6 @@
   closeTutorial();
 };
 
-/*
-function requestInfo
-*/
-
 $("code.query.serial,#sidebar").on("click", function () {
   $(this).toggleClass('active');
 });
@@ -84,6 +97,7 @@
 
 % end
 
+
 %= notifications 'Alertify'
   </body>
 </html>
diff --git a/templates/search.html.ep b/templates/search.html.ep
index 8ed571b..7cfa791 100644
--- a/templates/search.html.ep
+++ b/templates/search.html.ep
@@ -14,8 +14,6 @@
 %= pagination(stash('search.startPage'), $pages, $url)
     </div>
 
-%#= l('Found <span id="total-results">[_1]</span> [quant,_1,match]')
-%#= l('in [_1])
 Found <span id="total-results"><%= commify(stash('search.totalResults')) %> matches</span>
 % if (stash 'search.bm.hit') {
  in <%= stash 'search.bm.hit' %> (<%= stash 'search.bm.result' %>)
@@ -28,19 +26,22 @@
 
 <ol class="left-aligned">
 %=  search_hits begin
-  <li>
+  <li data-corpus-id="<%= $_->{corpusID} %>"
+      data-doc-id="<%= korap_doc_id($_) %>"
+      data-match-id="<%= korap_match_id($_) %>">
 %# ID, title, corpusID, author, pubDate, textClass
     <div class="snippet"><%== $_->{snippet} %></div>
     <p><strong><%= $_->{title} %></strong><%= $_->{author} ? ' by ' . $_->{author}  : '' %>; published on <%= date_format $_->{pubDate} %> as <%= $_->{docID} %> (<%= $_->{corpusID} %>)</p>
+
 %#    as <%= $_->{ID} %>
 %#  textClass docID
-% foreach (grep { m!/morpho$! } split(/\s+/, $_->{foundries})) {
+%# foreach (grep { m!/morpho$! } split(/\s+/, $_->{foundries})) {
 %#  <%= $_ %>
-% };
+%# };
 
     <ul class="action right">
       <li onmouseup="closeSnippet(this)" title="close"><i class="fa fa-toggle-up"></i></li>
-      <li title="Annotations"><i class="fa fa-info-circle"></i></li>
+      <li onclick="showTable(this)" title="Annotations"><i class="fa fa-info-circle"></i></li>
       <li title="Tree Visualizations"><i class="fa fa-sitemap"></i></li>
       <li title="Remember"><i class="fa fa-star-o"></i></li>
     </ul>