diff --git a/dev/js/src/menu.js b/dev/js/src/menu.js
index bd363e3..ce59f3c 100644
--- a/dev/js/src/menu.js
+++ b/dev/js/src/menu.js
@@ -54,6 +54,10 @@
      * mark and sweep GC)!
      */
     destroy : function () {
+      this._prefix._menu = undefined;
+      this._lengthField._menu = undefined;
+      this._slider._menu = undefined;
+
       if (this._element != undefined)
 	delete this._element["menu"]; 
 
@@ -155,6 +159,16 @@
       };
     },
 
+    /**
+     * Show screen X
+     */
+    screen : function (nr) {
+      if (this._offset === nr)
+	return;
+
+      this._showItems(nr);
+    },
+
     // Initialize list
     _init : function (itemClass, prefixClass, lengthFieldClass, params) {
       var that = this;
@@ -179,7 +193,7 @@
       this._lengthField._menu = this;
 
       // Initialize the slider
-      this._slider = sliderClass.create();
+      this._slider = sliderClass.create(this);
 
       var e = document.createElement("ul");
       e.style.opacity = 0;
@@ -318,10 +332,14 @@
 
       // Set the first element to active
       // Todo: Or the last element chosen
-      if (this._firstActive)
+      if (this._firstActive) {
 	this.liveItem(0).active(true);
-
-      this.position = 0;
+	this.position = 0;
+	this._active = 0;
+      }
+      else {
+	this.position = -1;
+      }
 
       this._prefix.active(false);
 
@@ -438,21 +456,33 @@
     },
 
     // Append Items that should be shown
-    _showItems : function (offset) {
+    _showItems : function (off) {
+
       this.delete();
 
       // Use list
       var shown = 0;
       var i;
       for (i in this._list) {
-
 	// Don't show - it's before offset
-	if (shown++ < offset)
+	if (shown++ < off)
 	  continue;
 
-	this._append(this._list[i]);
+	var itemNr = this._list[i];
+	var item = this.item(itemNr);
+	this._append(itemNr);
 
-	if (shown >= (this.limit() + this._offset))
+	/*
+	this._items[this._list[i]].active();
+	console.dir([i, this._active]);
+	if (this._active === i) {
+console.log('True!')
+	  this._items[this._list[i]].active(true);
+	};
+	*/
+
+	// this._offset))
+	if (shown >= (this.limit() + off))
 	  break;
       };
     },
@@ -579,18 +609,18 @@
     next : function () {
 
       // No active element set
-      if (this.position === -1)
-	return;
-
       var newItem;
 
-      // Set new live item
-      if (!this._prefix.active()) {
-	var oldItem = this.liveItem(this.position);
-	oldItem.active(false);
+      if (this.position !== -1) {
+	// Set new live item
+	if (!this._prefix.active()) {
+	  var oldItem = this.liveItem(this.position);
+	  oldItem.active(false);
+	};
       };
 
       this.position++;
+      this._active = this.position;
 
       newItem = this.liveItem(this.position);
 
@@ -604,12 +634,14 @@
 	if (prefix.isSet() && !prefix.active()) {
 	  this.position--;
 	  prefix.active(true);
+	  this._active = -1;
 	  return;
 	}
 	else {
 	  this._offset = 0;
 	  this.position = 0;
 	  newItem = this.liveItem(0);
+	  this._active = 0;
 	  this._showItems(0);
 	};
       }
diff --git a/dev/js/src/menu/slider.js b/dev/js/src/menu/slider.js
index af9a759..c35f284 100644
--- a/dev/js/src/menu/slider.js
+++ b/dev/js/src/menu/slider.js
@@ -3,16 +3,20 @@
   /**
    * Create new prefix object.
    */
-  create : function () {
-    return Object.create(this)._init();
+  create : function (menu) {
+    return Object.create(this)._init(menu);
   },
 
   _mousemove : function (e) {
     var relativePos = e.clientY - this._event.init;
-    var currentPos = 0;
     var diffHeight = (this._rulerHeight - this._sliderHeight);
-    var relativeOffset = ((relativePos + currentPos) / diffHeight);
-    this.offset(parseInt(relativeOffset * this._screens));
+    var relativeOffset = (relativePos / diffHeight);
+
+    var off = this.offset(parseInt(relativeOffset * this._screens));
+    if (off !== undefined) {
+      this._menu.screen(off);
+    };
+
     e.halt();
 
     // Support touch!
@@ -43,7 +47,9 @@
   },
 
   // Initialize prefix object
-  _init : function () {
+  _init : function (menu) {
+
+    this._menu = menu;
 
     this._offset = 0;
     this._event = {};
@@ -55,10 +61,15 @@
       document.createElement('span')
     );
 
+    this._element.appendChild(document.createElement('div'))
+    // Do not mark the menu on mousedown
+    .addEventListener('mousedown', function (e) {
+      e.halt()
+    });
+
     // TODO: Support touch!
     this._slider.addEventListener('mousedown', this._mousedown.bind(this), false);
 
-    this._element.appendChild(document.createElement('div'));
     return this;
   },
 
@@ -83,14 +94,15 @@
   },
 
   offset : function (off) {
-    if (off === undefined)
+    if (arguments.length === 0)
       return this._offset;
 
     if (off === this._offset || off > this._screens || off < 0)
-      return;
+      return undefined;
 
     this._offset = off;
     this._slider.style.top = (this._step * off) + '%';
+    return off;
   },
 
   element : function () {
