diff --git a/dev/js/src/init.js b/dev/js/src/init.js
index eafb021..90592ec 100644
--- a/dev/js/src/init.js
+++ b/dev/js/src/init.js
@@ -140,9 +140,12 @@
     };
 
     // Replace QL select menus with KorAP menus
-    selectMenuClass.create(
-      document.getElementById('ql-field').parentNode
-    ).limit(5);
+    var qlField = document.getElementById('ql-field');
+    if (qlField !== null) {
+      selectMenuClass.create(
+        document.getElementById('ql-field').parentNode
+      ).limit(5);
+    };
 
     var result = document.getElementById('resultinfo');
     var resultButton = null;
diff --git a/dev/js/src/selectMenu.js b/dev/js/src/selectMenu.js
index db5a52b..d8db4cd 100644
--- a/dev/js/src/selectMenu.js
+++ b/dev/js/src/selectMenu.js
@@ -5,88 +5,106 @@
     return {
       create : function (element) {
 
-	var select = element.getElementsByTagName('select')[0];
+	      var select = element.getElementsByTagName('select')[0];
 
-	// Prepare list before object upgras
-	var list = [];
-	var options = select.getElementsByTagName('option');
+        if (select === null)
+          return;
 
-	for (var i = 0; i < options.length; i++) {
+	      // Prepare list before object upgras
+	      var list = [];
+	      var options = select.getElementsByTagName('option');
 
-	  var item = options.item(i);
-	  var opt = [
-	    item.textContent,
-	    item.getAttribute('value')
-	  ];
+        // Iterate through options list
+	      for (var i = 0; i < options.length; i++) {
 
-	  if (item.hasAttribute('desc'))
-	    opt.push(item.getAttribute('desc'));
+          // Get option item and add to list
+	        var item = options.item(i);
+	        var opt = [
+	          item.textContent,
+	          item.getAttribute('value')
+	        ];
 
-	  list.push(opt);
-	};
+          // If the item has an attribute - list
+	        if (item.hasAttribute('desc'))
+	          opt.push(item.getAttribute('desc'));
 
-	// Create object with list
-	var obj = Object.create(menuClass).upgradeTo(this)
-	  ._init(list, {
-	    itemClass : selectMenuItemClass
-	  });
+	        list.push(opt);
+	      };
 
-	obj._container = element;
-	obj._select = select;
-	obj._select.style.display = 'none';
+	      // Create object with list
+	      var obj = Object.create(menuClass).upgradeTo(this)
+	          ._init(list, {
+	            itemClass : selectMenuItemClass
+	          });
 
-	// Create title
-	obj._title = obj._container.appendChild(document.createElement('span'));
-	obj._title.appendChild(document.createTextNode(''));
-	obj._container.appendChild(obj.element());
+	      obj._container = element;
+	      obj._select = select;
+	      obj._select.style.display = 'none';
 
-	obj._container.addEventListener('click', obj.showSelected.bind(obj));
+	      // Create title
+	      obj._title = obj._container.appendChild(document.createElement('span'));
+	      obj._title.appendChild(document.createTextNode(''));
+	      obj._container.appendChild(obj.element());
 
-	// Add index information to each item
-	for (i in obj._items) {
-	  obj._items[i]._index = i;
-	};
+        // Show the menu
+	      obj._container.addEventListener('click', obj.showSelected.bind(obj));
 
-	// This is only domspecific
-	obj.element().addEventListener('blur', function (e) {
-	  this.menu.hide();
-	  this.menu.showTitle();
-	});
+	      // Add index information to each item
+	      for (i in obj._items) {
+	        obj._items[i]._index = i;
+	      };
 
+	      // This is only domspecific
+	      obj.element().addEventListener('blur', function (e) {
+	        this.menu.hide();
+	        this.menu.showTitle();
+	      });
 
-	// In case another tool changes
-	// the option via JS - this needs
-	// to be reflected!
-	select.addEventListener('change', function (e) {
-	  this.showTitle();
-	}.bind(obj));
+	      // In case another tool changes
+	      // the option via JS - this needs
+	      // to be reflected!
+	      select.addEventListener('change', function (e) {
+	        this.showTitle();
+	      }.bind(obj));
 
-	obj.showTitle();
-	return obj;
+        // Show the title
+	      obj.showTitle();
+	      return obj;
       },
 
+      /**
+       * Get or set the selection index
+       */
       select : function (index) {
-	if (arguments.length > 0) {
-	  this._selected = index;
-	  this._select.selectedIndex = index;
-	};
+	      if (arguments.length > 0) {
+	        this._selected = index;
+	        this._select.selectedIndex = index;
+	      };
 
-	return this._selected || 0;
+	      return this._selected || 0;
       },
 
+      /**
+       * Show the select menu
+       */
       showSelected : function () {
-	this._title.style.display = 'none';
-	this._selected = this._select.selectedIndex;
-	this.show(this._selected);
-	this.focus();
+	      this._title.style.display = 'none';
+	      this._selected = this._select.selectedIndex;
+	      this.show(this._selected);
+	      this.focus();
       },
 
+      /**
+       * Show the title
+       */
       showTitle : function () {
-	var s = this.select();
-	this._title.textContent = this.item(
-	  this.select()
-	).title();
-	this._title.style.display = 'inline';
+
+        // Get the selection context
+	      var s = this.select();
+	      this._title.textContent = this.item(
+	        this.select()
+	      ).title();
+	      this._title.style.display = 'inline';
       }
     }
   }
diff --git a/dev/js/src/selectMenu/item.js b/dev/js/src/selectMenu/item.js
index cc6cdf0..75003b8 100644
--- a/dev/js/src/selectMenu/item.js
+++ b/dev/js/src/selectMenu/item.js
@@ -11,7 +11,7 @@
      */
     create : function (params) {
       return Object.create(itemClass)
-	.upgradeTo(this)._init(params);
+	      .upgradeTo(this)._init(params);
     },
 
     /**
