diff --git a/xtrn/startrek/sprites/borg.ini b/xtrn/startrek/sprites/borg.ini
index 7537b01cfac948b95dcb4b6e29698196d6999ce8..6e15294345cc012606ce49c3af941b64b4694897 100644
--- a/xtrn/startrek/sprites/borg.ini
+++ b/xtrn/startrek/sprites/borg.ini
@@ -4,11 +4,11 @@ bearings = n,ne,e,se,s,sw,w,nw
 positions = normal,destroyed
 movement = rotating
 constantmotion = 1
-speed = .75
+speed = .7
 speedstep = .1
-minimumspeed = .75
+minimumspeed = .7
 maximumspeed = .05
-weapon = photonTorpedo
+weapon = photonTorpedo2
 attackspeed = .5
 name = The Borg
 type = ship
diff --git a/xtrn/startrek/sprites/cardassian.ini b/xtrn/startrek/sprites/cardassian.ini
index c54f44b0f2d7f4610c26d197f6d41e32bb9b8797..aff7e9fd53f0494e3306a2cf2cb6e9b533a4352b 100644
--- a/xtrn/startrek/sprites/cardassian.ini
+++ b/xtrn/startrek/sprites/cardassian.ini
@@ -4,11 +4,11 @@ bearings = n,ne,e,se,s,sw,w,nw
 positions = normal,destroyed
 movement = rotating
 constantmotion = 1
-speed = .25
+speed = .3
 speedstep = .1
 minimumspeed = .5
 maximumspeed = .05
-weapon = photonTorpedo
+weapon = photonTorpedo3
 attackspeed = .5
 name = Cardassians
 type = ship
diff --git a/xtrn/startrek/sprites/defiant.bin b/xtrn/startrek/sprites/defiant.bin
new file mode 100644
index 0000000000000000000000000000000000000000..07b929e7efad97916e7a43a63cb9f621a5db7f64
Binary files /dev/null and b/xtrn/startrek/sprites/defiant.bin differ
diff --git a/xtrn/startrek/sprites/defiant.ini b/xtrn/startrek/sprites/defiant.ini
new file mode 100644
index 0000000000000000000000000000000000000000..a524d92c100e91ec676c0bd0375e965746b52329
--- /dev/null
+++ b/xtrn/startrek/sprites/defiant.ini
@@ -0,0 +1,14 @@
+width = 8
+height = 4
+bearings = n,ne,e,se,s,sw,w,nw
+positions = normal,destroyed
+movement = rotating
+constantmotion = 1
+speed = .5
+speedstep = .05
+minimumspeed = .6
+maximumspeed = .2
+weapon = photonTorpedo3
+attackspeed = .2
+type = ship
+health = 9
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/enterprise.bin b/xtrn/startrek/sprites/galaxy.bin
similarity index 100%
rename from xtrn/startrek/sprites/enterprise.bin
rename to xtrn/startrek/sprites/galaxy.bin
diff --git a/xtrn/startrek/sprites/galaxy.ini b/xtrn/startrek/sprites/galaxy.ini
new file mode 100644
index 0000000000000000000000000000000000000000..fdba0c9aa51c10079f5dd622d4e6a389276d9e7f
--- /dev/null
+++ b/xtrn/startrek/sprites/galaxy.ini
@@ -0,0 +1,14 @@
+width = 8
+height = 4
+bearings = n,ne,e,se,s,sw,w,nw
+positions = normal,destroyed
+movement = rotating
+constantmotion = 1
+speed = .6
+speedstep = .1
+minimumspeed = .7
+maximumspeed = .3
+weapon = photonTorpedo2
+attackspeed = .3
+type = ship
+health = 11
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/gorn.ini b/xtrn/startrek/sprites/gorn.ini
index 89c65bb40292a9742b0170058ed51143e0bf8be7..daf0c1f065fdace4f2ef962a66784199e4676a79 100644
--- a/xtrn/startrek/sprites/gorn.ini
+++ b/xtrn/startrek/sprites/gorn.ini
@@ -4,11 +4,11 @@ bearings = n,ne,e,se,s,sw,w,nw
 positions = normal,destroyed
 movement = rotating
 constantmotion = 1
-speed = .2
+speed = .3
 speedstep = .1
 minimumspeed = .2
 maximumspeed = .05
-weapon = photonTorpedo
+weapon = photonTorpedo1
 attackspeed = .5
 name = Gorn
 type = ship
diff --git a/xtrn/startrek/sprites/intrepid.bin b/xtrn/startrek/sprites/intrepid.bin
new file mode 100644
index 0000000000000000000000000000000000000000..0a87eda24e43e487e0b64887153a5a895f0ab213
--- /dev/null
+++ b/xtrn/startrek/sprites/intrepid.bin
@@ -0,0 +1 @@
+  ����  �   ��   ������  � ��� �� ���� � �� �  ��{�������{ � � ��    ������   ��   � ����� � ��� ��������  �� �  �����{�    � � �� ��� ��  �   ��  �������� � ��� ��������� �� �  ���� ��   � � �� ����{�   �   ��  �������  � ��� � � ����� �� �  �   ����� � � �� �{�������{�   ��  � ���� � � ��� � ������  �� �  �  ����   � � ��    ��{����   ��   ������� � ��� ������ �  �� �  ������    � � ��   �� ����   ��  �������� � ��� ��������� �� �  �  �� ��� � � �� �����   �   ��  ����� �  � ��� � ������� �� �  �   ��{��� � � �� 
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/enterprise.ini b/xtrn/startrek/sprites/intrepid.ini
similarity index 72%
rename from xtrn/startrek/sprites/enterprise.ini
rename to xtrn/startrek/sprites/intrepid.ini
index 15bfca3a5225043883b9864d71fb75b50927f7bf..ce0aeb99b79be111d0ea2621ef2aeee8a611f284 100644
--- a/xtrn/startrek/sprites/enterprise.ini
+++ b/xtrn/startrek/sprites/intrepid.ini
@@ -5,10 +5,10 @@ positions = normal,destroyed
 movement = rotating
 constantmotion = 1
 speed = .5
-speedstep = .1
+speedstep = .05
 minimumspeed = .5
 maximumspeed = .1
-weapon = photonTorpedo
-attackspeed = .3
+weapon = photonTorpedo1
+attackspeed = .4
 type = ship
-health = 11
\ No newline at end of file
+health = 7
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/klingon.ini b/xtrn/startrek/sprites/klingon.ini
index 125a1648fabdadb71a49039e8a6db133726a9768..7231e0a2703367babfeceb86099b863034882848 100644
--- a/xtrn/startrek/sprites/klingon.ini
+++ b/xtrn/startrek/sprites/klingon.ini
@@ -8,7 +8,7 @@ speed = .8
 speedstep = .1
 minimumspeed = .8
 maximumspeed = .05
-weapon = photonTorpedo
+weapon = photonTorpedo2
 attackspeed = .5
 name = Klingons
 type = ship
diff --git a/xtrn/startrek/sprites/pakled.ini b/xtrn/startrek/sprites/pakled.ini
index 7b739268df64c98f1a1a2c009ac89e82866aa7f8..fd696ae701b0b59e28ab7c5cea01a68dcd03a751 100644
--- a/xtrn/startrek/sprites/pakled.ini
+++ b/xtrn/startrek/sprites/pakled.ini
@@ -8,7 +8,7 @@ speed = 1
 speedstep = .1
 minimumspeed = 1
 maximumspeed = .05
-weapon = photonTorpedo
+weapon = photonTorpedo1
 attackspeed = .7
 name = Pakleds
 type = ship
diff --git a/xtrn/startrek/sprites/photonTorpedo.bin b/xtrn/startrek/sprites/photonTorpedo1.bin
similarity index 100%
rename from xtrn/startrek/sprites/photonTorpedo.bin
rename to xtrn/startrek/sprites/photonTorpedo1.bin
diff --git a/xtrn/startrek/sprites/photonTorpedo1.ini b/xtrn/startrek/sprites/photonTorpedo1.ini
new file mode 100644
index 0000000000000000000000000000000000000000..4e5c0aeeed7665cacfdf691ee9e705df4331026f
--- /dev/null
+++ b/xtrn/startrek/sprites/photonTorpedo1.ini
@@ -0,0 +1,10 @@
+width = 1
+height = 1
+bearings = n,ne,e,se,s,sw,w,nw
+positions = normal
+movement = rotating
+constantmotion = 1
+speed = .03
+range = 16
+type = weapon
+damage = 1
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/photonTorpedo2.bin b/xtrn/startrek/sprites/photonTorpedo2.bin
new file mode 100644
index 0000000000000000000000000000000000000000..72cff3f9b2440d3683bb2222abd70d921f9b10a6
--- /dev/null
+++ b/xtrn/startrek/sprites/photonTorpedo2.bin
@@ -0,0 +1,8 @@
+�
+�
+�
+�
+�
+�
+�
+�
diff --git a/xtrn/startrek/sprites/photonTorpedo.ini b/xtrn/startrek/sprites/photonTorpedo2.ini
similarity index 84%
rename from xtrn/startrek/sprites/photonTorpedo.ini
rename to xtrn/startrek/sprites/photonTorpedo2.ini
index c1d0dcaf247262fd95a6d65a14465f977d73f638..7d32c66c041f205f1efc1b5d1fbbeed0355fefd9 100644
--- a/xtrn/startrek/sprites/photonTorpedo.ini
+++ b/xtrn/startrek/sprites/photonTorpedo2.ini
@@ -6,4 +6,5 @@ movement = rotating
 constantmotion = 1
 speed = .03
 range = 20
-type = weapon
\ No newline at end of file
+type = weapon
+damage = 2
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/photonTorpedo3.bin b/xtrn/startrek/sprites/photonTorpedo3.bin
new file mode 100644
index 0000000000000000000000000000000000000000..35cf5f2b05513e872c12e2c22eac2b4aa96ca7db
--- /dev/null
+++ b/xtrn/startrek/sprites/photonTorpedo3.bin
@@ -0,0 +1 @@
+��������
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/photonTorpedo3.ini b/xtrn/startrek/sprites/photonTorpedo3.ini
new file mode 100644
index 0000000000000000000000000000000000000000..c27e6c26c7c22323954aeb7e2f522af113364efa
--- /dev/null
+++ b/xtrn/startrek/sprites/photonTorpedo3.ini
@@ -0,0 +1,10 @@
+width = 1
+height = 1
+bearings = n,ne,e,se,s,sw,w,nw
+positions = normal
+movement = rotating
+constantmotion = 1
+speed = .02
+range = 24
+type = weapon
+damage = 3
\ No newline at end of file
diff --git a/xtrn/startrek/sprites/romulan.ini b/xtrn/startrek/sprites/romulan.ini
index 7d1c554aa918ff4685ac52c554f3a75eeba21e5d..daab341ad4be68f2c359905ec5ac9fd99b801b84 100644
--- a/xtrn/startrek/sprites/romulan.ini
+++ b/xtrn/startrek/sprites/romulan.ini
@@ -4,11 +4,11 @@ bearings = n,ne,e,se,s,sw,w,nw
 positions = normal,destroyed
 movement = rotating
 constantmotion = 1
-speed = .5
+speed = .3
 speedstep = .1
 minimumspeed = .5
 maximumspeed = .05
-weapon = photonTorpedo
+weapon = photonTorpedo3
 attackspeed = .5
 name = Romulans
 type = ship
diff --git a/xtrn/startrek/startrek.js b/xtrn/startrek/startrek.js
index e440643de22349a42f5d5fa707cc9eafc02c055e..acb933d9dbb36d43e071970906075eb29b77be65 100644
--- a/xtrn/startrek/startrek.js
+++ b/xtrn/startrek/startrek.js
@@ -2,13 +2,18 @@ load("sbbsdefs.js");
 load("json-client.js");
 load("event-timer.js");
 load("frame.js");
+load("layout.js");
 load("sprite.js");
 
+var maxEnemies = 5;
+
 var sysStatus, userInput, player, timer, waveTimer, jsonClient, serverIni;
-var frame, splashFrame, fieldFrame, statusFrame, clockFrame, clockSubFrame, uhOhFrame, scoreFrame, helpFrame;
+var frame, fieldFrame, statusFrame, clockFrame, clockSubFrame, uhOhFrame;
+
 var player = {
 	round : 0,
 	score : 0,
+	shipName : "",
 	sprite : {}
 };
 var enemySprites = [];
@@ -20,6 +25,158 @@ var enemies = [
 	"gorn",
 	"pakled"
 ];
+var ships = [
+	"galaxy",
+	"intrepid",
+	"defiant"
+];
+
+var cycle = function() {
+	Sprite.cycle();
+	timer.cycle();
+	if(frame.cycle())
+		console.gotoxy(console.screen_columns, console.screen_rows);
+}
+
+var splash = function() {
+	var splashFrame = new Frame(1, 1, 80, 24, 0, frame);
+	splashFrame.load(js.exec_dir + "startrek.bin", 80, 24);
+	splashFrame.top();
+	splashFrame.open();
+	cycle();
+	console.getkey();
+	splashFrame.close();
+	splashFrame.delete();
+}
+
+var init = function() {
+	js.branch_limit = 0;
+	sysStatus = bbs.sys_status;
+	bbs.sys_status|=SS_MOFF;
+	KEY_WEAPON = " ";
+
+	frame = new Frame(1, 1, 80, 24, 0);
+	fieldFrame = new Frame(1, 1, 80, 24, 0, frame);
+	statusFrame = new Frame(1, 24, 66, 1, BG_BLUE|WHITE, frame);
+	clockFrame = new Frame(67, 24, 14, 1, BG_BLUE|WHITE, frame);
+	clockSubFrame = new Frame(78, 24, 2, 1, BG_BLUE|WHITE, clockFrame);
+	uhOhFrame = new Frame(1, 12, 80, 1, 0, frame);
+	uhOhFrame.transparent = true;
+	fieldFrame.load(js.exec_dir + "starfield.bin", 80, 24);
+
+	timer = new Timer();
+	
+	var f = new File(js.exec_dir + "server.ini");
+	f.open("r");
+	serverIni = f.iniGetObject();
+	f.close();
+	
+	frame.open();	
+	statusFrame.top();
+	frame.draw();
+}
+
+var removeShip = function(s) {
+	Sprite.aerials[s].remove();
+	Sprite.aerials[s].frame.delete();
+}
+
+var rotateSprites = function(sprites) {
+	for(var s in sprites)
+		sprites[s].turn("cw");
+}
+
+var ucfl = function(str) {
+	str = str[0].toUpperCase() + str.substr(1);
+	return str;
+}
+
+var dots = function(d) {
+	var str = "";
+	for(var dd = 0; dd < d; dd++)
+		str += ascii(254);
+	return str;
+}
+
+var setup = function() {
+	var setupFrame = new Frame(1, 1, 80, 24, 0, frame);
+	setupFrame.load(js.exec_dir + "starfield.bin", 80, 24);
+	
+	var layout = new Layout(setupFrame);
+	
+	var shipSprites = [];
+	var viewWidth = 13;
+	var x = Math.floor((80 - (ships.length * viewWidth)) / 2);
+	for(var s = 0; s < ships.length; s++) {
+		var view = layout.addView(ucfl(ships[s]), x, 4, viewWidth - 1, 16);
+		view.show_tabs = false;
+		var tab = view.addTab("frame", "frame");
+		var sprite = new Sprite.Aerial(ships[s], tab.frame, tab.frame.x, tab.frame.y, 'n');
+		var weapon = new Sprite.Aerial(sprite.ini.weapon, tab.frame, tab.frame.x, tab.frame.y, 'n');
+		sprite.ini.constantmotion = 0;
+		shipSprites.push(sprite);
+		weapon.remove();
+		weapon.frame.delete();
+		tab.frame.gotoxy(1, 7);
+		tab.frame.putmsg(
+			format(
+				"Speed\r\n\1h\1g%s\r\n\r\n\1h\1wShields\r\n\1h\1c%s\r\n\r\n\1h\1wWeapons\r\n\1h\1r%s",
+				dots(Math.floor((1 - sprite.ini.maximumspeed) * 10)),
+				dots(sprite.ini.health - 1),
+				dots(weapon.ini.damage * 3)
+			),
+			WHITE
+		);
+		x = x + viewWidth;
+	}
+	timer.addEvent(1000, true, rotateSprites, [shipSprites]);
+	
+	layout.open();
+	setupFrame.open();
+	setupFrame.gotoxy(1, 2);
+	setupFrame.center("What class of ship do you want to command, Captain " + ucfl(user.alias) + "?", WHITE);
+	setupFrame.draw();
+
+	var userInput = "";
+	setupFrame.top();
+	while(ascii(userInput) != 13) {
+		userInput = console.inkey(K_NONE, 5);
+		if(userInput == KEY_LEFT || userInput == KEY_RIGHT)
+			userInput = "\x09";
+		layout.getcmd(userInput);
+		layout.cycle();
+		cycle();
+	}
+	
+	setupFrame.gotoxy(1, 21);
+	setupFrame.center("What is the name of your " + layout.current.title + "-class starship?", WHITE);
+	cycle();
+	while(player.shipName == "") {
+		console.gotoxy(25, 23);
+		player.shipName = console.getstr("USS ", 30, K_LINE|K_EDIT);
+	}
+
+	for(var s in Sprite.aerials)
+		removeShip(s);
+
+	player.sprite = new Sprite.Aerial(layout.current.title.toLowerCase(), fieldFrame, 40, 10, 'n', 'normal');
+	layout.close();
+	setupFrame.close();
+	setupFrame.delete();
+	frame.invalidate();
+	timer.events = [];
+}
+
+var showHelp = function() {
+	var helpFrame = new Frame(8, 4, 64, 16, 0, frame);
+	helpFrame.load(js.exec_dir + "help.bin", 64, 16);
+	helpFrame.top();
+	helpFrame.open();
+	cycle();
+	console.getkey();
+	helpFrame.close();
+	helpFrame.delete();
+}
 
 var checkScreenEdge = function(sprite) {
 	if(sprite.x < -3)
@@ -46,7 +203,8 @@ var putEnemy = function(re) {
 
 var spawnEnemies = function() {
 	var re = Math.floor(Math.random() * enemies.length);
-	for(var x = 0; x < player.round; x++) {
+	var roundMax = Math.floor((player.round + 1) / 2);
+	for(var x = 0; x < ((roundMax > maxEnemies) ? maxEnemies : roundMax); x++) {
 		while(!putEnemy(re)) {
 		}
 	}
@@ -61,18 +219,21 @@ var spawnEnemies = function() {
 	putStats();
 	uhOhFrame.top();
 	statusFrame.top();
-	timer.addEvent(250, 12, cycleWarning, [Sprite.aerials[Sprite.aerials.length - 1].ini.name]);
+	timer.addEvent(250, 12, cycleWarning, ["Oh no! " + Sprite.aerials[Sprite.aerials.length - 1].ini.name + "!"]);
 	timer.addEvent(3000, false, removeWarning);
+	if(player.round % 5 == 0)
+		waveTimer.interval = waveTimer.interval - 5000;
 }
 
-var removeShip = function(s) {
-	Sprite.aerials[s].remove();
+var countdown = function() {
+	clockSubFrame.clear();
+	clockSubFrame.putmsg(parseInt(waveTimer.nextrun * .001));
 }
 
-var cycleWarning = function(enemy) {
+var cycleWarning = function(warning) {
 	var c = Math.floor(Math.random() * 15) + 1;
 	uhOhFrame.clear();
-	uhOhFrame.center("Oh no! " + enemy + "!", c);
+	uhOhFrame.center(warning, c);
 }
 
 var removeWarning = function() {
@@ -90,66 +251,28 @@ var putStats = function() {
 	);
 }
 
-var countdown = function() {
-	clockSubFrame.clear();
-	clockSubFrame.putmsg(parseInt(waveTimer.nextrun * .001));
-}
-
-var init = function() {
-	js.branch_limit = 0;
-	sysStatus = bbs.sys_status;
-	bbs.sys_status|=SS_MOFF;
-	KEY_WEAPON = " ";
-
-	frame = new Frame(1, 1, 80, 24, 0);
-	splashFrame = new Frame(1, 1, 80, 24, 0, frame);
-	fieldFrame = new Frame(1, 1, 80, 24, 0, frame);
-	statusFrame = new Frame(1, 24, 66, 1, BG_BLUE|WHITE, frame);
-	clockFrame = new Frame(67, 24, 14, 1, BG_BLUE|WHITE, frame);
-	clockSubFrame = new Frame(78, 24, 2, 1, BG_BLUE|WHITE, clockFrame);
-	uhOhFrame = new Frame(1, 12, 80, 1, 0, frame);
-	scoreFrame = new Frame(1, 1, 80, 24, BG_BLACK|WHITE, frame);
-	helpFrame = new Frame(8, 4, 64, 16, 0, frame);
-
-	uhOhFrame.transparent = true;
-	splashFrame.load(js.exec_dir + "startrek.bin", 80, 24);
-	fieldFrame.load(js.exec_dir + "starfield.bin", 80, 24);
-	helpFrame.load(js.exec_dir + "help.bin", 64, 16);
-
-	player.sprite = new Sprite.Aerial("enterprise", fieldFrame, 40, 10, 'n', 'normal');
-
-	timer = new Timer();
-	
-	var f = new File(js.exec_dir + "server.ini");
-	f.open("r");
-	serverIni = f.iniGetObject();
-	f.close();
-
-	frame.open();	
-	scoreFrame.bottom();
-	helpFrame.bottom();
-	statusFrame.top();
-	splashFrame.top();
-	frame.draw();
-}
-
-var showHelp = function() {
-	helpFrame.top();
-	frame.cycle();
-	console.getkey();
-	helpFrame.bottom();
+var deathKnell = function() {
+	uhOhFrame.top();
+	for(var n = 0; n < 20; n++) {
+		cycleWarning("You done goofed!");
+		cycle();
+		mswait(200);
+	}
+	while(console.input_buffer_level > 0) {
+		console.inkey();
+	}
 }
 
 var gamePlay = function() {
 	player.round = 1;
-	timer.addEvent(5000, 1, spawnEnemies);
+	player.sprite.frame.draw();
+	timer.addEvent(2000, 1, spawnEnemies);
 	waveTimer = timer.addEvent(30000, true, spawnEnemies);
 	putStats();
+	statusFrame.top();
 	while(!js.terminated) {
-		if(player.sprite.ini.health < 1) {
-			deathKnell();
+		if(player.sprite.ini.health < 1)
 			break;
-		}
 		userInput = console.inkey(K_NONE, 5);
 		if(ascii(userInput) == 27)
 			break;
@@ -185,7 +308,7 @@ var gamePlay = function() {
 					&&
 					(o[oo].owner != Sprite.aerials[s])
 				) {
-					Sprite.aerials[s].ini.health = Sprite.aerials[s].ini.health - 1;
+					Sprite.aerials[s].ini.health = Sprite.aerials[s].ini.health - parseInt(o[oo].ini.damage);
 					o[oo].remove();
 				} else if(
 					o[oo].ini.type == "ship" && Sprite.aerials[s].ini.type == "ship"
@@ -206,80 +329,87 @@ var gamePlay = function() {
 				putStats();
 			}
 		}
-		timer.cycle();
-		Sprite.cycle();
-		if(frame.cycle())
-			console.gotoxy(80, 24);
-	}
-	waveTimer.abort = true;
-}
-
-var deathKnell = function() {
-	uhOhFrame.top();
-	for(var n = 0; n < 20; n++) {
-		cycleWarning("You done goofed");
-		frame.cycle();
-		mswait(200);
+		cycle();
 	}
+	if(player.sprite.ini.health < 1)
+			deathKnell();
+	timer.events = [];
 }
 
 var scoreBoard = function() {
 	var scoreObj = {
 		'alias' : user.alias,
 		'system' : system.name,
+		'shipName' : player.shipName,
 		'round' : player.round - 1,
 		'score' : player.score,
 		'when' : time()
 	};
 	try {
 		jsonClient = new JSONClient(serverIni.host, serverIni.port);
-		var scores = jsonClient.read("STARTREK", "STARTREK.SCORES", 1);
+		var scores = jsonClient.read("STARTREK", "STARTREK.HIGHSCORES", 1);
 		if(scores === undefined) {
-			scores = [];
-			jsonClient.write("STARTREK", "STARTREK.SCORES", scores, 2);
+			scores = [scoreObj];
+			jsonClient.write("STARTREK", "STARTREK.HIGHSCORES", scores, 2);
 		}
-		jsonClient.push("STARTREK", "STARTREK.SCORES", scoreObj, 2);
-		jsonClient.disconnect();
 	} catch(err) {
 		log(LOG_ERR, "JSON client error: " + err);
 		return false;
 	}
-	scoreFrame.center("Recent scores");
+	var scoreFrame = new Frame(1, 1, 80, 24, BG_BLACK|WHITE, frame);
+	scoreFrame.open();
+	scoreFrame.center("High scores");
 	scoreFrame.putmsg("\r\n\r\n");
 	scoreFrame.putmsg(
 		format(
 			"%-30s%-30s%-10s%s\r\n\r\n",
-			"Player", "System", "Round", "Score"
+			"Player", "Ship", "Round", "Score"
 		),
 		LIGHTCYAN
 	);
-	scores.push(scoreObj);
-	shownUsers = [];
-	for(var s = scores.length - 1; s > (scores.length >= 19) ? scores.length - 20 : 0; s = s - 1) {
-		if(shownUsers.indexOf(scores[s].alias) >= 0)
-			continue;
-		shownUsers.push(scores[s].alias);
+	var writeBack = false;
+	for(var s = 0; s < scores.length; s++) {
+		if(player.score > scores[s].score && !writeBack) {
+			writeBack = true;
+			scores.splice(s, 0, scoreObj);
+		}
+		scoreFrame.putmsg(
+			format(
+				"%-30s%-30s%-10s%s\r\n",
+				scores[s].alias, scores[s].shipName, scores[s].round, scores[s].score
+			),
+			WHITE
+		);
+	}
+	if(!writeBack && scores.length < 18) {
+		writeBack = true;
+		scores.push(scoreObj);
 		scoreFrame.putmsg(
 			format(
 				"%-30s%-30s%-10s%s\r\n",
-				scores[s].alias, scores[s].system, scores[s].round, scores[s].score
-			)
+				scores[s].alias, scores[s].shipName, scores[s].round, scores[s].score
+			),
+			WHITE
 		);
 	}
+	if(writeBack) {
+		while(scores.length > 18) {
+			scores.pop();
+		}
+		jsonClient.write("STARTREK", "STARTREK.HIGHSCORES", scores, 2);
+	}
+	jsonClient.disconnect();
+	
 	scoreFrame.crlf();
 	scoreFrame.center("<Press any key>", LIGHTRED);
 	scoreFrame.top();
-	frame.cycle();
-	mswait(1000);
-	while(console.input_buffer_level > 0) {
-		console.inkey();
-	}
+	cycle();
 	console.getkey();
 }
 
 var main = function() {
-	console.getkey();
-	splashFrame.close();
+	splash();
+	setup();
 	gamePlay();
 	scoreBoard();
 }