diff --git a/app/corpora/events.py b/app/corpora/events.py
index 492d69cbe14b2ba44137caeee4679c1a3c352ffe..265285b5fce6c7643d26d727118592bed76f799a 100644
--- a/app/corpora/events.py
+++ b/app/corpora/events.py
@@ -73,13 +73,14 @@ def corpus_analysis(message):
     for match in data['matches']:
         cpos_list += match['lc'] + match['hit'] + match['rc']
     cpos_list = list(set(cpos_list))
+    lemma_list = client.cl_cpos2str('{}.lemma'.format(corpus), cpos_list)
     pos_list = client.cl_cpos2str('{}.pos'.format(corpus), cpos_list)
     simple_pos_list = client.cl_cpos2str('{}.simple_pos'.format(corpus), cpos_list)
     s_id_list = client.cl_cpos2struc('{}.s'.format(corpus), cpos_list)
     text_id_list = client.cl_cpos2struc('{}.text'.format(corpus), cpos_list)
     word_list = client.cl_cpos2str('{}.word'.format(corpus), cpos_list)
-    for cpos, pos, simple_pos, s_id, text_id, word in zip(cpos_list, pos_list, simple_pos_list, s_id_list, text_id_list, word_list):
-        data['cpos_lookup'][cpos] = {'pos': pos, 'simple_pos': simple_pos, 's_id': s_id, 'text_id': text_id, 'word': word}
+    for cpos, lemma, pos, simple_pos, s_id, text_id, word in zip(cpos_list, lemma_list, pos_list, simple_pos_list, s_id_list, text_id_list, word_list):
+        data['cpos_lookup'][cpos] = {'lemma': lemma, 'pos': pos, 'simple_pos': simple_pos, 's_id': s_id, 'text_id': text_id, 'word': word}
     text_author_list = client.cl_struc2str('{}.text_author'.format(corpus), text_id_list)
     text_publishing_year_list = client.cl_struc2str('{}.text_publishing_year'.format(corpus), text_id_list)
     text_title_list = client.cl_struc2str('{}.text_title'.format(corpus), text_id_list)
diff --git a/app/templates/corpora/analyse_corpus.html.j2 b/app/templates/corpora/analyse_corpus.html.j2
index 557fb1d8cacab945649aa6052dd1fbe75ee91a3b..b27049681a6e094e92b300bd7a9690b837a2968b 100644
--- a/app/templates/corpora/analyse_corpus.html.j2
+++ b/app/templates/corpora/analyse_corpus.html.j2
@@ -2,16 +2,8 @@
 
 {% block page_content %}
 <style>
-  .token-box {
-    padding: 5px;
-    margin: 2px 0;
-    border-radius: 5px;
-    background-color: #009688;
-    display: inline-block;
-    color: white;
-  }
-  .token-box:hover {
-    background-color: #00bfa5;
+  .token.chip:hover {
+    background-color: #9e9e9e;
     cursor: pointer;
   }
 </style>
@@ -88,7 +80,7 @@
     <div class="card-content">
       <span class="card-title">Query Results</span>
       <div>
-        <table class="highlight">
+        <table>
           <thead>
             <tr>
               <th style="width: 5%">Title</th>
@@ -138,14 +130,18 @@
 
   var expertModeSwitchElement = document.getElementById("expert-mode-switch");
   var tokenElements = [];
+  var result;
   expertModeSwitchElement.addEventListener('change', function(event) {
     if (event.target.checked) {
       tokenElements.forEach(function(tokenElement) {
-        tokenElement.classList.add("token-box");
+        tokenElement.classList.add("chip");
+        token = result["cpos_lookup"][tokenElement.dataset.cpos];
+        addToolTipToTokenElement(tokenElement, token);
       });
     } else {
       tokenElements.forEach(function(tokenElement) {
-        tokenElement.classList.remove("token-box");
+        tokenElement.classList.remove("chip");
+        tokenElement.M_Tooltip.destroy()
       });
     }
   })
@@ -163,61 +159,95 @@
     M.toast({html: "Query has been sent!"});
   });
 
-  socket.on("corpus_analysis", function(result) {
-    console.log(result);
-    var htmlString = "";
+  socket.on("corpus_analysis", function(message) {
+    var matchElement;
+    var matchTextTitlesElement;
+    var matchLeftContextElement;
+    var matchHitElement;
+    var matchRightContextElement;
     var textTitles;
     var token;
+    var tokenElement;
 
-    if (result['matches'].length === 0) {
-      M.toast({html: 'No results!'});
-    }
+    result = message;
+
+    queryResultsElement.innerHTML = "";
 
     for (let match of result['matches']) {
-      htmlString += `<tr class="match">`;
-      htmlString += `<td class="title">`;
-      textTitles = new Set();
-      for (cpos of match["hit"]) {
-        token = result["cpos_lookup"][cpos];
-        textTitles.add(result["text_loopup"][token["text_id"]]["title"]);
-      }
-      htmlString += [...textTitles].join(",");
-      htmlString += `</td>`;
-      htmlString += `<td class="left-context">`;
+      matchElement = document.createElement("tr");
+      matchElement.classList.add("match");
+      matchTextTitlesElement = document.createElement("td");
+      matchTextTitlesElement.classList.add("text-titles");
+      matchElement.append(matchTextTitlesElement);
+      matchLeftContextElement = document.createElement("td");
+      matchLeftContextElement.classList.add("left-context");
       for (cpos of match["lc"]) {
         token = result["cpos_lookup"][cpos];
-        htmlString += " ";
-        htmlString += `<span class="token" data-cpos="${cpos}">${token["word"]}</span>`;
+        tokenElement = document.createElement("span");
+        tokenElement.classList.add("token");
+        tokenElement.dataset.cpos = cpos;
+        tokenElement.innerText = token["word"];
+        if (expertModeSwitchElement.checked) {
+          tokenElement.classList.add("chip");
+          addToolTipToTokenElement(tokenElement, token);
+        }
+        matchLeftContextElement.append(tokenElement);
+        matchLeftContextElement.append(document.createTextNode(" "));
+        tokenElements.push(tokenElement);
       }
-      htmlString += `</td>`;
-      htmlString += `<td class="hit">`;
+      matchElement.append(matchLeftContextElement);
+      matchHitElement = document.createElement("td");
+      matchHitElement.classList.add("hit");
+      textTitles = new Set();
       for (cpos of match["hit"]) {
         token = result["cpos_lookup"][cpos];
-        htmlString += " ";
-        htmlString += `<span class="token" data-cpos="${cpos}">${token["word"]}</span>`;
+        tokenElement = document.createElement("span");
+        tokenElement.classList.add("token");
+        tokenElement.dataset.cpos = cpos;
+        tokenElement.innerText = token["word"];
+        if (expertModeSwitchElement.checked) {
+          tokenElement.classList.add("chip");
+          addToolTipToTokenElement(tokenElement, token);
+        }
+        matchHitElement.append(tokenElement);
+        matchHitElement.append(document.createTextNode(" "));
+        tokenElements.push(tokenElement);
+        textTitles.add(result["text_loopup"][token["text_id"]]["title"]);
       }
-      htmlString += `</td>`;
-      htmlString += `<td class="right-context">`;
+      matchTextTitlesElement.innerText = [...textTitles].join(",");
+      matchElement.append(matchHitElement);
+      matchRightContextElement = document.createElement("td");
+      matchRightContextElement.classList.add("right-context");
       for (cpos of match["rc"]) {
         token = result["cpos_lookup"][cpos];
-        htmlString += " ";
-        htmlString += `<span class="token" data-cpos="${cpos}">${token["word"]}</span>`;
+        tokenElement = document.createElement("span");
+        tokenElement.classList.add("token");
+        tokenElement.dataset.cpos = cpos;
+        tokenElement.innerText = token["word"];
+        if (expertModeSwitchElement.checked) {
+          tokenElement.classList.add("chip");
+          addToolTipToTokenElement(tokenElement, token);
+        }
+        matchRightContextElement.append(tokenElement);
+        matchRightContextElement.append(document.createTextNode(" "));
+        tokenElements.push(tokenElement);
       }
-      htmlString += `</td>`;
-      htmlString += `</tr>`;
+      matchElement.append(matchRightContextElement);
+      queryResultsElement.append(matchElement);
     }
-
-    queryResultsElement.innerHTML = htmlString;
-
-    tokenElements = queryResultsElement.querySelectorAll(".token");
-    tokenElements.forEach(function(tokenElement) {
-      tokenElement.addEventListener("click", function(event) {
-        if (!expertModeSwitchElement.checked) {return;}
-        var token = result["cpos_lookup"][tokenElement.dataset.cpos];
-        var text = result["text_loopup"][token["text_id"]];
-        alert(`${token["word"]} // ${token["pos"]} // ${token["simple_pos"]} // ${text["title"]}`);
-      });
-    });
   });
+
+  function addToolTipToTokenElement(tokenElement, token) {
+    M.Tooltip.init(tokenElement,
+                   {"html": `<p>Token information</p>
+                             <p class="left-align">
+                               word: ${token["word"]}<br>
+                               lemma: ${token["lemma"]}<br>
+                               pos: ${token["pos"]}<br>
+                               simple_pos: ${token["simple_pos"]}<br>
+                               text: ${result["text_loopup"][token["text_id"]]["title"]}
+                             </p>`,
+                   "position": "top"});
+  }
 </script>
 {% endblock %}