diff --git a/dev/js/src/tutorial.js b/dev/js/src/tutorial.js
index c2f7c69..ee311dd 100644
--- a/dev/js/src/tutorial.js
+++ b/dev/js/src/tutorial.js
@@ -6,14 +6,18 @@
 // TODO: Add query mechanism!
 // TODO: Highlight current section:
 //       http://stackoverflow.com/questions/24887258/highlight-navigation-link-as-i-scroll-down-the-page
+"use strict";
+
 define(['session','buttongroup','util'], function (sessionClass, buttonGroupClass) {
-  "use strict";
 
   // Localization values
   const loc   = KorAP.Locale;
   loc.CLOSE = loc.CLOSE || 'Close';
 
+  const d = document;
+  
   return {
+
     /**
      * Create new tutorial object.
      * Accepts an element to bind the tutorial window to.
@@ -24,41 +28,48 @@
       return Object.create(this)._init(obj,session);
     },
 
+
     // Initialize Tutorial object
     _init : function (obj, session) {
+      const t = this;
 
       if (session === undefined) {
-	      this._session = sessionClass.create();
+	      t._session = sessionClass.create();
       }
       else {
-	      this._session = session;
+	      t._session = session;
       };
     
-
       if (obj) {
-	      this._show = obj;
-	      this.start = obj.getAttribute('href');
+	      t._show = obj;
+	      t.start = obj.getAttribute('href');
+
+        // Unknown which tutorial to show
+        if (!t.start)
+          return null;
+        
 	      obj.removeAttribute('href');
-	      var that = this;
+
 	      obj.onclick = function () {
-	        that.show();
-	      };
+	        this.show();
+	      }.bind(t);
 
 	      // Injects a tutorial div to the body
-	      var div = document.createElement('div');
+	      const div = d.createElement('div');
 	      div.setAttribute('id', 'tutorial');
 	      div.style.display = 'none';
-	      document.getElementsByTagName('body')[0].appendChild(div);
-	      this._iframe = null;
-	      this._element = div;
+	      d.getElementsByTagName('body')[0].appendChild(div);
+
+	      t._iframe = null;
+	      t._element = div;
 
 	      // Some fields
-	      this._ql     = document.getElementById("ql-field");
-	      this._q      = document.getElementById("q-field")
-	      this._cutoff = document.getElementById("q-cutoff-field");
+	      t._ql     = d.getElementById("ql-field");
+	      t._q      = d.getElementById("q-field")
+	      t._cutoff = d.getElementById("q-cutoff-field");
       };
 
-      return this;
+      return t;
     },
 
 
@@ -66,41 +77,43 @@
      * Initialize a search with a defined query.
      */
     useQuery : function (e) {
-      var q  = e.getAttribute("data-query");
-      var ql = e.getAttribute("data-query-language");
-      var qc = e.getAttribute("data-query-cutoff");
+      const t = this;
+      const q  = e.getAttribute("data-query"),
+            ql = e.getAttribute("data-query-language"),
+            qc = e.getAttribute("data-query-cutoff");
+
       if (qc !== 0 && qc !== "0" && qc !== "off" && qc !== null) {
-	      this._cutoff.checked = true;
+        if (t._cuttoff)
+	        t._cutoff.checked = true;
       };
 
       if (KorAP.QLmenu) {
         KorAP.QLmenu.selectValue(ql);
-      };
-      /*
-      var qlf = this._ql.options;
-      for (var i in qlf) {
-	      if (qlf[i].value == ql) {
-	        qlf[i].selected = true;
-          break;
-	      };
-      };
-      */
+      }
 
-      this._q.value = q;
-      this.setPage(e);
-      this.hide();
+      else if (t._ql) {
+        let found = Array.from(t._ql.options).find(o => o.value === ql);
+        if (found)
+          found.selected = true;
+      };
+
+      if (t._q)
+        t._q.value = q;
+
+      t.setPage(e);
+      t.hide();
     },
 
+
     /**
      * Decorate a page with query event handler.
      */
     initQueries : function (d) {
-      let that = this;
       Array.from(d.querySelectorAll('pre.query.tutorial:not(.unsupported)')).forEach(
         i =>
 	        i.onclick = function (e) {
-	          that.useQuery(this,e);
-	        }
+	          this.useQuery(this,e);
+	        }.bind(this)
       );
     },
 
@@ -108,14 +121,14 @@
      * Decorate a page with documentation links
      */
     initDocLinks : function (d) {
-      let that = this;
+      const that = this;
       Array.from(d.getElementsByClassName('doc-link')).forEach(
 	      i =>
-          i.onclick = function (e) {
+          i.onclick = function () {
 	          that.setPage(this.getAttribute('href'));
 	          return true;
 	        }
-      );    
+      );
     },
 
 
@@ -123,25 +136,26 @@
      * Show the tutorial page embedded.
      */
     show : function () {
-      var element = this._element;
+      const t = this;
+      const element = t._element;
       if (element.style.display === 'block')
 	      return;
 
-      if (this._iframe === null) {
-	      this._iframe = document.createElement('iframe');
-	      this._iframe.setAttribute(
+      if (t._iframe === null) {
+	      t._iframe = d.createElement('iframe');
+	      t._iframe.setAttribute(
 	        'src',
-	        (this.getPage() || this.start) + '?embedded=true'
+	        (t.getPage() || t.start) + '?embedded=true'
 	      );
 
-        var btn = buttonGroupClass.create(
+        const btn = buttonGroupClass.create(
           ['action','button-view']
         );
 
-        var that = this;
         btn.add(loc.CLOSE, {'cls':['button-icon','close']}, function () {
           element.style.display = 'none';
         });
+
         element.appendChild(btn.element());
 
 	      // Add open in new window button
@@ -152,19 +166,17 @@
 	        .appendChild(document.createTextNode(loc.SHOWINFO));
 	        info.classList.add('info');
 	        info.setAttribute('title', loc.SHOWINFO);
-	      */
 
-        /*
-	      ul.appendChild(close);
-
-	      element.appendChild(ul);
+	        ul.appendChild(close);
+	        element.appendChild(ul);
         */
-	      element.appendChild(this._iframe);
+	      element.appendChild(t._iframe);
       };
 
       element.style.display = 'block';
     },
 
+
     /**
      * Close tutorial window.
      */
@@ -172,34 +184,36 @@
       this._element.style.display = 'none';
     },
 
+
     /**
      * Set a page to be the current tutorial page.
      * Expects either a string or an element.
      */
     setPage : function (obj) {
-      var page = obj;
+      let page = obj;
+
       if (typeof page != 'string') {
-	      var l = this._iframe !== null ? window.frames[0].location : window.location;
+	      const l = this._iframe !== null ? window.frames[0].location : window.location;
+
 	      page = l.pathname + l.search;
 
-	      for (var i = 1; i < 5; i++) {
-	        if (obj.nodeName === 'SECTION') {
-	          if (obj.hasAttribute('id'))
-	            page += '#' + obj.getAttribute('id');
-	          break;
-	        }
-	        else if (obj.nodeName === 'PRE' && obj.hasAttribute('id')) {
+	      for (let i = 1; i < 5; i++) {
+	        if ((obj.nodeName === 'SECTION' || obj.nodeName === 'PRE') && obj.hasAttribute('id')) {
 	          page += '#' + obj.getAttribute('id');
 	          break;
 	        }
 	        else {
 	          obj = obj.parentNode;
+            if (obj === null)
+              break;
 	        };
 	      };
       };
+
       this._session.set('tutpage', page);
     },
 
+
     /**
      * Get the current tutorial URL
      */
