diff --git a/exec/load/form.js b/exec/load/form.js
index c243e797e43f858914608d4249adb33082da3ca7..8487c5fa500882eb201f3714abee2c5c0ed1ed0f 100644
--- a/exec/load/form.js
+++ b/exec/load/form.js
@@ -28,30 +28,54 @@ function formEdit(obj)
 {
 	function Form(obj) 
 	{
-		this.len = 0;
-		this.max = 25;
+		this.full_redraw = false;
+		this.keylen = 3;
+		this.max_value = 25;
+		this.max_height;
 		this.index = 0;
+		this.line = 1;
 		this.items = [];
 		
-		for(var k in obj) {
-			if(console.strlen(k) > this.len)
-				this.len = console.strlen(k);
-			this.items.push({
-				key:k,
-				value:obj[k],
-				type:typeof obj[k]
-			});
-		}
-		
-		this.box = new Layout_View(
-			printPadded("KEY",this.len+2) + splitPadded("VALUE","ESC",this.max),
-			(console.screen_columns / 2) - ((this.len + 25)/2) -1,
-			(console.screen_rows / 2) - (this.items.length / 2) -2,
-			this.len + this.max + 4,
-			this.items.length + 3
-		);
+		this.init = function() {
+			/* load object values into form */
+			for(var k in obj) {
+				if(console.strlen(k) > this.keylen)
+					this.keylen = console.strlen(k);
+				this.items.push({
+					key:k,
+					value:obj[k],
+					type:typeof obj[k]
+				});
+			}
+			
+			/* initialize editing window */
+			var posx = (console.screen_columns / 2) - ((this.keylen + 25)/2) -1;
+			var posy = (console.screen_rows / 2) - (this.items.length / 2) -2;
+			var height = this.items.length + 3;
+			var width = this.keylen + this.max_value + 4;
+			
+			if(posx < 1)
+				posx = 1;
+			if(posy < 1)
+				posy = 1;
+			if(height > (console.screen_rows))
+				height = console.screen_rows;
+			if(width > (console.screen_columns-2)) {
+				this.keylen -= (width-console.screen_columns-2);
+				width = console.screen_columns-2;
+			}
 		
-		this.box.show_tabs = false;
+			this.box = new Layout_View(
+				printPadded("KEY",this.keylen+2) + splitPadded("VALUE","ESC",this.max_value),
+				posx,
+				posy,
+				width,
+				height
+			);
+			this.max_height = this.box.height - 3;
+			this.box.show_tabs = false;
+			this.box.drawView();
+		}
 		
 		this.edit = function() {
 			var item = this.items[this.index];
@@ -63,11 +87,11 @@ function formEdit(obj)
 			else {
 				var coords = this.coords(this.index);
 				console.attributes = BG_LIGHTGRAY + BLACK;
-				console.gotoxy(coords.x + this.len + 2, coords.y);
-				clearLine(this.max);
-				console.gotoxy(coords.x + this.len + 2, coords.y);
+				console.gotoxy(coords.x + this.keylen + 2, coords.y);
+				clearLine(this.max_value);
+				console.gotoxy(coords.x + this.keylen + 2, coords.y);
 				
-				var newvalue = console.getstr(item.value.toString(),this.max,K_EDIT|K_AUTODEL);
+				var newvalue = console.getstr(item.value.toString(),this.max_value,K_EDIT|K_AUTODEL);
 				switch(item.type) {
 					case "number":
 						item.value = Number(newvalue);
@@ -87,10 +111,21 @@ function formEdit(obj)
 		}
 		
 		this.draw = function() {
-			this.box.drawView();
+			/* if a full redraw is requested, draw everything */
+			if(this.full_redraw) {
+				this.full_redraw = false;
+				this.box.drawView();
+			}
 			
-			for(var i = 0; i < this.items.length; i++) {
+			/* find starting point */
+			var i = (this.index+1) - this.max_height;
+			var c = 0;
+			if(i < 0)
+				i = 0;
+			while(i < this.items.length && c < this.max_height) {
 				this.drawItem(i,this.index == i);
+				i++;
+				c++;
 			}
 		}
 		
@@ -104,9 +139,16 @@ function formEdit(obj)
 		}
 		
 		this.coords = function(i) {
+			var posx = this.box.x + 1;
+			var posy = this.box.y + 2;
+			
+			if(this.index >= this.max_height) 
+				posy += this.max_height - (this.index - i) - 1;
+			else 
+				posy += i;
 			return {
-				x:this.box.x + 1,
-				y:this.box.y + 2 + i,
+				x:posx,
+				y:posy,
 			}
 		}
 		
@@ -115,53 +157,74 @@ function formEdit(obj)
 			console.gotoxy(coords);
 			if(curr) 
 				console.putmsg(getColor(layout_settings.lbg) + getColor(layout_settings.lfg) + 
-					printPadded(this.items[i].key,this.len + 2) + "\1w" + 
-					printPadded(this.items[i].value,this.max)
+					printPadded(this.items[i].key,this.keylen + 2) + "\1w" + 
+					printPadded(this.items[i].value,this.max_value)
 				);
 			else
 				console.putmsg(getColor(layout_settings.vbg) + getColor(layout_settings.vfg) + 
-					printPadded(this.items[i].key,this.len + 2) + "\1h" +
-					printPadded(this.items[i].value,this.max)
+					printPadded(this.items[i].key,this.keylen + 2) + "\1h" +
+					printPadded(this.items[i].value,this.max_value)
 				);
 		}
+		
+		this.init();
 	}
 
 	var form = new Form(obj);
 	var update = false;
+	var redraw = false;
 	form.draw();
 	
-	while(1) {
+	while(!js.terminated) {
 		
-		if(update) 
+		if(redraw) 
+			form.draw();
+			
+		else if(update) 
 			form.drawItem(form.index,true);
-		else
-			update = true;
-		
+			
+		redraw = false;
+		update = true;
 		var cmd = console.inkey(K_NOECHO,1);
+
 		switch(cmd) {
-			case KEY_DOWN:
-				form.drawItem(form.index);
-				form.index++;
-				if(form.index >= form.items.length)
-					form.index = 0;
-				break;
-			case KEY_UP:
-				form.drawItem(form.index);
-				form.index--;
-				if(form.index < 0)
-					form.index = form.items.length-1;
-				break;
-			case '\r':
-			case '\n':
-				form.edit();
-				break;
-			case '\b':
-			case '\x11':
-			case '\x1b':
-				return form.object;
-			default:
-				update = false;
-				break;
+		case KEY_DOWN:
+			form.drawItem(form.index);
+			form.index++;
+			if(form.line < form.max_height)
+				form.line++;
+			if(form.index >= form.max_height)
+				redraw = true;
+			if(form.index >= form.items.length) {
+				form.index = 0;
+				form.line = 1;
+			}
+			break;
+		case KEY_UP:
+			form.drawItem(form.index);
+			form.index--;
+			if(form.index < (form.line-1))
+				form.line--;
+			if(form.index < 0) {
+				form.index = form.items.length-1;
+				form.line = form.items.length;
+			}
+			if(form.index >= form.max_height - 1) {
+				form.line = form.max_height;
+				redraw = true;
+			}
+			break;
+		case '\r':
+		case '\n':
+			form.edit();
+			break;
+		case '\b':
+		case '\x11':
+		case '\x1b':
+			return form.object;
+		default:
+			update = false;
+			break;
 		}
 	}