diff --git a/dev/js/src/hint/menu.js b/dev/js/src/hint/menu.js
index df27a11..1763306 100644
--- a/dev/js/src/hint/menu.js
+++ b/dev/js/src/hint/menu.js
@@ -13,7 +13,11 @@
     create : function (hint, context, params) {
       var obj = Object.create(menuClass)
 	.upgradeTo(this)
-	._init(itemClass, prefixClass, lengthFieldClass, params);
+	._init(params, {
+	  itemClass : itemClass,
+	  prefixClass : prefixClass,
+	  lengthFieldClass : lengthFieldClass
+	});
       obj._context = context;
       obj._element.classList.add('hint');
       obj._hint = hint;
diff --git a/dev/js/src/init.js b/dev/js/src/init.js
index 3b911b6..8fcc162 100644
--- a/dev/js/src/init.js
+++ b/dev/js/src/init.js
@@ -1,3 +1,15 @@
+/*
+ * TODO: Create lazy loading of objects including
+ * - obj.hint()
+ * - obj.alertify()
+ * - obj.session()
+ * - obj.tutorial()
+ * - obj.vc() // toggle
+ * - obj.matchCreate() (using webpack)
+ * - obj.koral() (show result, parse for errors ...)
+ * - obj.alignment() // toggle
+ */
+
 define([
   'match',
   'hint',
@@ -104,6 +116,7 @@
 	if (this._match !== undefined)
 	  this._match.open();
 	else {
+	  // lazyLoad
 	  matchClass.create(this).open();
 	};
 	e.halt();
@@ -116,6 +129,7 @@
 	  if (this._match !== undefined)
 	    this._match.toggle();
 	  else {
+	    // lazyLoad
 	    matchClass.create(this).open();
 	  };
 	  e.halt();
diff --git a/dev/js/src/match/tree.js b/dev/js/src/match/tree.js
index dcecd5e..5e39a1a 100644
--- a/dev/js/src/match/tree.js
+++ b/dev/js/src/match/tree.js
@@ -1,6 +1,8 @@
 /**
  * Visualize span annotations as a tree
  * using Dagre.
+ *
+ * This should be lazy loaded!
  */
 define(['lib/dagre'], function (dagre) {
   "use strict";
diff --git a/dev/js/src/match/treemenu.js b/dev/js/src/match/treemenu.js
index fec7703..5af4619 100644
--- a/dev/js/src/match/treemenu.js
+++ b/dev/js/src/match/treemenu.js
@@ -18,7 +18,7 @@
     create : function (info, params) {
       var obj = Object.create(menuClass)
 	.upgradeTo(this)
-	._init(itemClass, undefined, undefined, params);
+	._init(params, {itemClass : itemClass});
       obj.limit(6);
       obj._info = info;
 
diff --git a/dev/js/src/menu.js b/dev/js/src/menu.js
index e8028ea..9ed6e7c 100644
--- a/dev/js/src/menu.js
+++ b/dev/js/src/menu.js
@@ -41,23 +41,30 @@
      * Create new Menu based on the action prefix
      * and a list of menu items.
      *
+     *
+     * Accepts an associative array containg the elements
+     * itemClass, prefixClass, lengthFieldClass
+     *
      * @this {Menu}
      * @constructor
      * @param {string} Context prefix
      * @param {Array.<Array.<string>>} List of menu items
      */
-    create : function (params) {
-      return Object.create(this)._init(params);
+    create : function (list, params) {
+      return Object.create(this)._init(list, params);
     },
 
     // Initialize list
-    _init : function (itemClass, prefixClass, lengthFieldClass, params) {
+    _init : function (list, params) {
 
-      this._itemClass = itemClass || defaultItemClass;
+      if (params === undefined)
+	params = {};
+
+      this._itemClass = params["itemClass"] || defaultItemClass;
 
       // Add prefix object
-      if (prefixClass !== undefined) {
-	this._prefix = prefixClass.create();
+      if (params["prefixClass"] !== undefined) {
+	this._prefix = params["prefixClass"].create();
       }
       else {
 	this._prefix = defaultPrefixClass.create();
@@ -65,8 +72,8 @@
       this._prefix._menu = this;
 
       // Add lengthField object
-      if (lengthFieldClass !== undefined) {
-	this._lengthField = lengthFieldClass.create();
+      if (params["lengthFieldClass"] !== undefined) {
+	this._lengthField = params["lengthFieldClass"].create();
       }
       else {
 	this._lengthField = defaultLengthFieldClass.create();
@@ -116,12 +123,12 @@
 
       var i = 0;
       // Initialize item list based on parameters
-      for (i in params) {
-	var obj = this._itemClass.create(params[i]);
+      for (i in list) {
+	var obj = this._itemClass.create(list[i]);
 
 	// This may become circular
 	obj["_menu"] = this;
-	this._lengthField.add(params[i]);
+	this._lengthField.add(list[i]);
 	this._items.push(obj);
       };
 
@@ -405,7 +412,7 @@
 	if (active < 0) {
 	  active = 0;
 	}
-	else if (active > this.liveLength()) {
+	else if (active >= this.liveLength()) {
 	  active = this.liveLength() - 1;
 	};
 
diff --git a/dev/js/src/menu/item.js b/dev/js/src/menu/item.js
index 8278d17..873d81b 100644
--- a/dev/js/src/menu/item.js
+++ b/dev/js/src/menu/item.js
@@ -170,7 +170,6 @@
 
   // Highlight a certain substring of the menu item
   _highlight : function (elem, prefix) {
-    
     if (elem.nodeType === 3) {
       
       var text   = elem.nodeValue;
@@ -228,7 +227,7 @@
       this._action = params[1];
 
     this._lcField = ' ' + this.content().textContent.toLowerCase();
-    this._highlight = null;
+    this._prefix = null;
 
     return this;
   },
diff --git a/dev/js/src/vc/menu.js b/dev/js/src/vc/menu.js
index fddb3f0..5840438 100644
--- a/dev/js/src/vc/menu.js
+++ b/dev/js/src/vc/menu.js
@@ -6,7 +6,7 @@
     create : function (params) {
       var obj = Object.create(menuClass)
 	.upgradeTo(this)
-	._init(itemClass, undefined, undefined, params);
+	._init(params, {itemClass : itemClass});
       obj.limit(6);
 
       // This is only domspecific
