diff --git a/xtrn/lord2/lord2.js b/xtrn/lord2/lord2.js
index b4b808077400acf8aefe8cfe20b5c72761cc7045..da2383b763f14dc3416d61cb509fe7ed8f7e4510 100644
--- a/xtrn/lord2/lord2.js
+++ b/xtrn/lord2/lord2.js
@@ -3275,6 +3275,7 @@ function view_inventory()
 	var lb;
 	var choices;
 	var i;
+	var it;
 	var ch;
 	var cur = 0;
 	var str;
@@ -3284,12 +3285,17 @@ function view_inventory()
 	var ret;
 
 	function draw_menu() {
-		choices.forEach(function(c, i) {
+		var i;
+		var iv;
+		var c;
+
+		for (i = 0; i < choices.length; i++) {
+			c = choices[i];
 			dk.console.gotoxy(0, 12+i);
-			if (i === cur)
+			if (i === (cur % 11))
 				c = '`r1'+c+'`r0';
 			lw(c);
-		});
+		}
 		dk.console.gotoxy(0, 12+i);
 	}
 
@@ -3316,8 +3322,6 @@ rescan:
 	while(1) {
 		run_ref('stats', 'gametxt.ref');
 		inv = [];
-		lb = [];
-		choices = [];
 		for (i = 0; i < 99; i++) {
 			if (player.i[i] > 0)
 				inv.push(i);
@@ -3331,140 +3335,169 @@ rescan:
 			return;
 		}
 		else {
-			inv.forEach(function(i) {
-				desc = items[i].description;
-				str = '`2  '+items[i].name;
-				choices.push(str);
-				str += decorate_item(items[i]);
-				if (items[i].armour) {
-					if (player.armournumber === i + 1)
-						desc = 'Currently wearing as armour.';
-				}
-				if (items[i].weapon) {
-					if (player.weaponnumber === i + 1)
-						desc = 'Currently armed as weapon.';
+newpage:
+			while (1) {
+				lb = [];
+				choices = [];
+				for (i = Math.floor(cur / 11) * 11; i < inv.length && (i <= cur || i % 11); i++) {
+					it = inv[i];
+					desc = items[it].description;
+					str = '`2  '+items[it].name;
+					choices.push(str);
+					str += decorate_item(items[it]);
+					if (items[it].armour) {
+						if (player.armournumber === it + 1)
+							desc = 'Currently wearing as armour.';
+					}
+					if (items[it].weapon) {
+						if (player.weaponnumber === it + 1)
+							desc = 'Currently armed as weapon.';
+					}
+					str += spaces(37 - displen(str));
+					str += '`2 (`0'+player.i[it]+'`2)';
+					str += spaces(47 - displen(str));
+					str += '`2 ' + desc;
+					str += spaces(79 - displen(str));
+					lb.push(str);
 				}
-				str += spaces(37 - displen(str));
-				str += '`2 (`0'+player.i[i]+'`2)';
-				str += spaces(47 - displen(str));
-				str += '`2 ' + desc;
-				str += spaces(79 - displen(str));
-				lb.push(str);
-			});
 
-			draw_inv();
-			while(1) {
-				draw_menu();
-				dk.console.gotoxy(0, 23);
-				ch = getkey().toUpperCase();
-				switch(ch) {
-					case '8':
-					case 'KEY_UP':
-					case '4':
-					case 'KEY_LEFT':
-						cur--;
-						if (cur < 0)
-							cur = lb.length - 1;
-						break;
-					case '2':
-					case 'KEY_DOWN':
-					case '6':
-					case 'KEY_RIGHT':
-						cur++;
-						if (cur >= lb.length)
-							cur = 0;
-						break;
-					case 'D':
-						dk.console.gotoxy(17, 12);
-						lw(box_top(42, items[inv[cur]].name));
-						dk.console.gotoxy(17, 13);
-						lw(box_middle(42, ''));
-						dk.console.gotoxy(17, 14);
-						lw(box_middle(42, '   `$Drop how many? '));
-						dk.console.gotoxy(17, 15);
-						lw(box_middle(42, ''));
-						dk.console.gotoxy(17, 16);
-						lw(box_bottom(42, ''));
-						dk.console.gotoxy(38, 14);
-						// TODO: This isn't exactly right... cursor is in wrong position, and selected colour is used.
-						ch = dk.console.getstr({edit:player.i[inv[cur]].toString(), integer:true, input_box:true, attr:new Attribute(47), len:11});
-						lw('`r1`0');
-						ch = parseInt(ch, 10);
-						if (!isNaN(ch) && ch <= player.i[inv[cur]]) {
-							player.i[inv[cur]] -= ch;
-							if (player.i[inv[cur]] === 0) {
-								if (player.weaponnumber - 1 === inv[cur])
-									player.weaponnumber = 0;
-								if (player.armournumber - 1 === inv[cur])
-									player.armournumber = 0;
+				draw_inv();
+				while(1) {
+					draw_menu();
+					dk.console.gotoxy(0, 23);
+					ch = getkey().toUpperCase();
+					switch(ch) {
+						case '8':
+						case 'KEY_UP':
+						case '4':
+						case 'KEY_LEFT':
+							cur--;
+							if (cur < 0) {
+								cur = inv.length - 1;
+								if (inv.length > 11)
+									continue newpage;
 							}
-							dk.console.gotoxy(21, 14);
-							if (ch === 1)
-								lw('`$You go ahead and throw it away.`0');
-							else
-								lw('`$You drop the offending items!`0');
-							getkey();
-						}
-						clear_block();
-						continue rescan;
-					case '\r':
-						use_opts = [];
-						if (items[inv[cur]].weapon) {
-							if (player.weaponnumber - 1 !== inv[cur])
-								use_opts.push({txt:'Arm as weapon', ret:'A'});
-							else
-								use_opts.push({txt:'Unarm as weapon', ret:'U'});
-						}
-						if (items[inv[cur]].armour) {
-							if (player.armournumber - 1 !== inv[cur])
-								use_opts.push({txt:'Wear as armour', ret:'W'});
-							else
-								use_opts.push({txt:'Take it off', ret:'T'});
-						}
-						if (items[inv[cur]].refsection.length > 0 && items[inv[cur]].useaction.length > 0) {
-							use_opts.push({txt:items[inv[cur]].useaction, ret:'S'});
-						}
-						if (use_opts.length === 0)
-							// TODO: Test this... it's almost certainly broken.
-							use_opts.push({txt:'You can\'t think of any way to use this item', ret:'N'});
-						else
-							use_opts.push({txt:'Nevermind', ret:'N'});
-						ch = popup_menu(items[inv[cur]].name, use_opts);
-						clear_block();
-						ret = undefined;
-						switch(ch) {
-							case 'A':
-								player.weaponnumber = inv[cur] + 1;
-								break;
-							case 'U':
-								player.weaponnumber = 0;
-								break;
-							case 'W':
-								player.armournumber = inv[cur] + 1;
+							if (cur % 11 === 10)
+								continue newpage;
+							break;
+						case '2':
+						case 'KEY_DOWN':
+						case '6':
+						case 'KEY_RIGHT':
+							cur++;
+							if (cur >= inv.length) {
+								cur = 0;
+								if (inv.length > 11)
+									continue newpage;
+							}
+							if (cur % 11 === 0)
+								continue newpage;
+							break;
+						case 'D':
+							dk.console.gotoxy(17, 12);
+							lw(box_top(42, items[inv[cur]].name));
+							dk.console.gotoxy(17, 13);
+							lw(box_middle(42, ''));
+							dk.console.gotoxy(17, 14);
+							lw(box_middle(42, '   `$Drop how many? '));
+							dk.console.gotoxy(17, 15);
+							lw(box_middle(42, ''));
+							dk.console.gotoxy(17, 16);
+							lw(box_bottom(42, ''));
+							dk.console.gotoxy(38, 14);
+							// TODO: This isn't exactly right... cursor is in wrong position, and selected colour is used.
+							ch = dk.console.getstr({edit:player.i[inv[cur]].toString(), integer:true, input_box:true, attr:new Attribute(47), len:11});
+							lw('`r1`0');
+							ch = parseInt(ch, 10);
+							if (!isNaN(ch) && ch <= player.i[inv[cur]]) {
+								player.i[inv[cur]] -= ch;
+								if (player.i[inv[cur]] === 0) {
+									if (player.weaponnumber - 1 === inv[cur])
+										player.weaponnumber = 0;
+									if (player.armournumber - 1 === inv[cur])
+										player.armournumber = 0;
+								}
+								dk.console.gotoxy(21, 14);
+								if (ch === 1)
+									lw('`$You go ahead and throw it away.`0');
+								else
+									lw('`$You drop the offending items!`0');
+								getkey();
+							}
+							clear_block();
+							continue rescan;
+						case 'N':
+							i = cur + 11;
+							if (i >= inv.length)
+								i = inv.length - 1;
+							if (i < ((Math.floor((cur)/11)+1)*11))
 								break;
-							case 'T':
-								player.armournumber = 0;
+							cur = i;
+							continue newpage;
+						case 'P':
+							if (cur < 11)
 								break;
-							case 'S':
-								ret = run_ref(items[inv[cur]].refsection, 'items.ref');
-								if (items[inv[cur]].useonce) {
-									player.i[inv[cur]]--;
-									if (player.i[inv[cur]] === 0) {
-										if (player.weaponnumber - 1 === inv[cur])
-											player.weaponnumber = 0;
-										if (player.armournumber - 1 === inv[cur])
-											player.armournumber = 0;
+							cur -= 11;
+							continue newpage;
+						case '\r':
+							use_opts = [];
+							if (items[inv[cur]].weapon) {
+								if (player.weaponnumber - 1 !== inv[cur])
+									use_opts.push({txt:'Arm as weapon', ret:'A'});
+								else
+									use_opts.push({txt:'Unarm as weapon', ret:'U'});
+							}
+							if (items[inv[cur]].armour) {
+								if (player.armournumber - 1 !== inv[cur])
+									use_opts.push({txt:'Wear as armour', ret:'W'});
+								else
+									use_opts.push({txt:'Take it off', ret:'T'});
+							}
+							if (items[inv[cur]].refsection.length > 0 && items[inv[cur]].useaction.length > 0) {
+								use_opts.push({txt:items[inv[cur]].useaction, ret:'S'});
+							}
+							if (use_opts.length === 0)
+								// TODO: Test this... it's almost certainly broken.
+								use_opts.push({txt:'You can\'t think of any way to use this item', ret:'N'});
+							else
+								use_opts.push({txt:'Nevermind', ret:'N'});
+							ch = popup_menu(items[inv[cur]].name, use_opts);
+							clear_block();
+							ret = undefined;
+							switch(ch) {
+								case 'A':
+									player.weaponnumber = inv[cur] + 1;
+									break;
+								case 'U':
+									player.weaponnumber = 0;
+									break;
+								case 'W':
+									player.armournumber = inv[cur] + 1;
+									break;
+								case 'T':
+									player.armournumber = 0;
+									break;
+								case 'S':
+									ret = run_ref(items[inv[cur]].refsection, 'items.ref');
+									if (items[inv[cur]].useonce) {
+										player.i[inv[cur]]--;
+										if (player.i[inv[cur]] === 0) {
+											if (player.weaponnumber - 1 === inv[cur])
+												player.weaponnumber = 0;
+											if (player.armournumber - 1 === inv[cur])
+												player.armournumber = 0;
+										}
 									}
-								}
-								break;
-						}
-						if (ret === undefined || ret !== 'ITEMEXIT')
-							continue rescan;
-						// Fallthrough
-					case 'Q':
-						dk.console.gotoxy(0, 12+lb.length-1);
-						dk.console.attr.value = attr;
-						return;
+									break;
+							}
+							if (ret === undefined || ret !== 'ITEMEXIT')
+								continue rescan;
+							// Fallthrough
+						case 'Q':
+							dk.console.gotoxy(0, 12+lb.length-1);
+							dk.console.attr.value = attr;
+							return;
+					}
 				}
 			}
 		}