diff --git a/xtrn/dovebowl/dovebowl.ini b/xtrn/dovebowl/dovebowl.ini
index be35d097cd28b618318e43bc3e754dbf28e6b398..5b54fa2c0e1be681c7e44c41406264c632b9d1f4 100644
--- a/xtrn/dovebowl/dovebowl.ini
+++ b/xtrn/dovebowl/dovebowl.ini
@@ -17,7 +17,7 @@ Datafile=nfl.league
 GamesImage=gamelist.asc
 Owner=Deuce@SYNCNIX
 Datafile=cfl.league
-MessagePointer=4
+MessagePointer=10
 
 [ML|B]
 GamesImage=gamelist.asc
diff --git a/xtrn/dovebowl/dovebowl.js b/xtrn/dovebowl/dovebowl.js
index bb18aba2fb9f76fd496cc312cf713c8441988ff1..3e35d79a5471c9fac9f22b66929d26bf37b6a778 100644
--- a/xtrn/dovebowl/dovebowl.js
+++ b/xtrn/dovebowl/dovebowl.js
@@ -10,11 +10,18 @@ vote_check/*
 
 load("lightbar.js");
 
+//var sports=new MsgBase('DOVE-SPO');
+var sports=new MsgBase('ENTERTAI');
+if(!sports.open())
+	return_error("Cannot open message base!",1);
+
 var path;
 try { barfitty.barf(barf); } catch(e) { path = e.fileName; }
 path = path.replace(/[^\/\\]*$/,'');
 
 var inifile=new File(path + "dovebowl.ini");
+var tmpfile=new File(path+format("%04d.tmp",user.number));
+
 var leaguefile;
 if(!inifile.open("r+", true))
 	return_error("Cannot open "+inifile.name,1);
@@ -52,11 +59,10 @@ while(1) {
 		league=leagueslb.getval();
 	}
 
-	inifile.iniSetValue(league,"MessagePointer",read_messages(league, inifile.iniGetValue(league, "MessagePointer", 0)));
-
 	leaguefile=new File(path+league.replace(/[\[\]\/\\\=\+\<\>\:\;\"\,\*\|\^]/g,''));
 	if(!leaguefile.open(file_exists(leaguefile.name)?"r+":"w+",true,4096))
 		return_error("Cannot open "+leaguefile.name,1);
+	inifile.iniSetValue(league,"MessagePointer",read_messages(league, inifile.iniGetValue(league, "MessagePointer", 0)));
 
 	while(!done_league) {
 		/* Read the league owner ID */
@@ -119,7 +125,7 @@ function play(league)
 	if(gameslb.current==-1)
 		gameslb.current=0;
 	var set=gameslb.getval();
-	make_picks(set, false);
+	make_picks(league, set, false);
 }
 
 function onevote(away, home, vote, results, xpos, ypos)
@@ -137,26 +143,33 @@ function onevote(away, home, vote, results, xpos, ypos)
 	return(votelb.getval());
 }
 
-function make_picks(set, results)
+function make_picks(league, set, results)
 {
 	var games;
 	var game=0;
 	var gamedata=new Array();
 	var PickXPos=parseInt(inifile.iniGetValue(null,"PickXPos",1));
 	var PickYPos=parseInt(inifile.iniGetValue(null,"PickYPos",2));
+	var maxawaylen=0;
+	var maxhomelen=0;
 
 	games=leaguefile.iniGetValue(set, "Games", 0);
 	for(i=0; i<games; i++) {
 		gamedata[i]=new Object;
 		gamedata[i].vote=2;
 		gamedata[i].away=leaguefile.iniGetValue(set, "Game"+(i+1)+"Away", '');
+		if(gamedata[i].away.length > maxawaylen)
+			maxawaylen = gamedata[i].away.length;
 		gamedata[i].home=leaguefile.iniGetValue(set, "Game"+(i+1)+"Home", '');
+		if(gamedata[i].home.length > maxhomelen)
+			maxhomelen = gamedata[i].home.length;
 		var votes=leaguefile.iniGetValue(set, "Game"+(i+1)+"AwayVotes", '');
 		if(vote_check(votes))
 			gamedata[i].vote=0;
 		votes=leaguefile.iniGetValue(set, "Game"+(i+1)+"HomeVotes", '');
 		if(vote_check(votes))
 			gamedata[i].vote=1;
+		gamedata[i].orig_vote=gamedata[i].vote;
 	}
 
 	var current=-1;
@@ -179,10 +192,38 @@ function make_picks(set, results)
 		gameslb.add("--------------------------- --------------------------- -----"+(results?'':'----'),-1);
 		if((game=gameslb.getval()) != -1) {
 			gamedata[game].vote=onevote(gamedata[game].away, gamedata[game].home, gamedata[game].vote, results, PickXPos, PickYPos+parseInt(game));
-			set_vote(set, game, vote);
+			set_vote(user.alias+'@'+system.qwk_id, set, game, vote);
 		}
 		current=gameslb.current;
 	} while(game != -1);
+
+	/* Post picks */
+	var subject=league.replace(/[\[\]\/\\\=\+\<\>\:\;\"\,\*\|\^]/g,'') + " " + set + " picks";
+	if(!tmpfile.open("w",false))
+		return_error("Cannot open "+tmpfile.name);
+	tmpfile.writeln("=== "+set+" Picks ===");
+	tmpfile.writeln("");
+	var newvotes=0;
+
+	for(i=0; i<games; i++) {
+		var vote="Abstain";
+		if(gamedata[i].vote != gamedata[i].orig_vote)
+			newvotes++;
+		switch(gamedata[i].vote) {
+		case 0:	/* Away */
+			vote=gamedata[i].away;
+			break;
+		case 1:	/* Home */
+			vote=gamedata[i].home;
+			break;
+		}
+
+		tmpfile.writeln(format("%*s at %-*s [%s]", maxawaylen, gamedata[i].away, maxhomelen, gamedata[i].home, vote));
+	}
+	tmpfile.close();
+	if(newvotes > 0)
+		send_message(user.alias, "DoveBowl", subject);
+	inifile.iniSetValue(league,"MessagePointer",read_messages(league, inifile.iniGetValue(league, "MessagePointer", 0)));
 }
 
 function vote_check(votestr)
@@ -239,17 +280,17 @@ function add_vote(votestr, alias)
 	return(votes.join("|"));
 }
 
-function set_vote(set, game, vote)
+function set_vote(alias, set, game, vote)
 {
 	var votestr=leaguefile.iniGetValue(set, "Game"+(parseInt(game)+1)+"AwayVotes","");
 
 	switch(vote) {
 	case '0':		/* Away */
-		votestr=add_vote(votestr, user.alias+'@'+system.qwk_id);
+		votestr=add_vote(votestr, alias);
 		break;
 	case '1':		/* Home */
 	default:
-		votestr=remove_vote(votestr, user.alias+'@'+system.qwk_id);
+		votestr=remove_vote(votestr, alias);
 		break;
 	}
 	leaguefile.iniSetValue(set, "Game"+(parseInt(game)+1)+"HomeVotes",votestr);
@@ -258,10 +299,10 @@ function set_vote(set, game, vote)
 	switch(vote) {
 	default:
 	case '0':		/* Away */
-		votestr=remove_vote(votestr, user.alias+'@'+system.qwk_id);
+		votestr=remove_vote(votestr, alias);
 		break;
 	case '1':		/* Home */
-		votestr=add_vote(votestr, user.alias+'@'+system.qwk_id);
+		votestr=add_vote(votestr, alias);
 		break;
 	}
 	leaguefile.iniSetValue(set, "Game"+(parseInt(game)+1)+"AwayVotes",votestr);
@@ -269,8 +310,85 @@ function set_vote(set, game, vote)
 
 function enter_results(league)
 {
-	writeln("Press any key to continue");
-	console.getkey();
+	var games;
+	var game=0;
+	var gamedata=new Array();
+	var ResultXPos=parseInt(inifile.iniGetValue(null,"ResultXPos",1));
+	var ResultYPos=parseInt(inifile.iniGetValue(null,"ResultYPos",2));
+	var maxawaylen=0;
+	var maxhomelen=0;
+
+	games=leaguefile.iniGetValue(set, "Games", 0);
+	for(i=0; i<games; i++) {
+		gamedata[i]=new Object;
+		gamedata[i].vote=2;
+		gamedata[i].away=leaguefile.iniGetValue(set, "Game"+(i+1)+"Away", '');
+		if(gamedata[i].away.length > maxawaylen)
+			maxawaylen = gamedata[i].away.length;
+		gamedata[i].home=leaguefile.iniGetValue(set, "Game"+(i+1)+"Home", '');
+		if(gamedata[i].home.length > maxhomelen)
+			maxhomelen = gamedata[i].home.length;
+		var votes=leaguefile.iniGetValue(set, "Game"+(i+1)+"AwayVotes", '');
+		if(vote_check(votes))
+			gamedata[i].vote=0;
+		votes=leaguefile.iniGetValue(set, "Game"+(i+1)+"HomeVotes", '');
+		if(vote_check(votes))
+			gamedata[i].vote=1;
+		gamedata[i].orig_vote=gamedata[i].vote;
+	}
+
+	var current=-1;
+	do {
+		var gameslb=new Lightbar;
+		gameslb.current=current;
+		gameslb.xpos=ResultXPos;
+		gameslb.ypos=ResultYPos;
+		console.clear();
+		console.printfile(path+leaguefile.iniGetValue(null,"ResultsImage","resultlist.asc"));
+		console.gotoxy(ResultXPos,ResultYPos);
+
+		for(i=0; i<games; i++) {
+			var c=gamedata[i].vote;
+			var home=gamedata[i].home;
+			var away=gamedata[i].away;
+			var gamestr=format("%s%-25.25s%s %s%-25.25s%s %s%s%s", c==0?'[':' ', away, c==0?']':' ', c==1?'[':' ', home, c==1?']':' ', c==2?'[':' ', results?"Tie":"Abstain", c==2?']':' ');
+			gameslb.add(gamestr, i.toString());
+		}
+		gameslb.add("--------------------------- --------------------------- -----"+(results?'':'----'),-1);
+		if((game=gameslb.getval()) != -1) {
+			gamedata[game].vote=onevote(gamedata[game].away, gamedata[game].home, gamedata[game].vote, results, PickXPos, PickYPos+parseInt(game));
+			set_vote(user.alias+'@'+system.qwk_id, set, game, vote);
+		}
+		current=gameslb.current;
+	} while(game != -1);
+
+	/* Post picks */
+	var subject=league.replace(/[\[\]\/\\\=\+\<\>\:\;\"\,\*\|\^]/g,'') + " " + set + " results";
+	if(!tmpfile.open("w",false))
+		return_error("Cannot open "+tmpfile.name);
+	tmpfile.writeln("=== "+set+" Results ===");
+	tmpfile.writeln("");
+	var newvotes=0;
+
+	for(i=0; i<games; i++) {
+		var vote="Not Played";
+		if(gamedata[i].vote != gamedata[i].orig_vote)
+			newvotes++;
+		switch(gamedata[i].vote) {
+		case 0:	/* Away */
+			vote=gamedata[i].away;
+			break;
+		case 1:	/* Home */
+			vote=gamedata[i].home;
+			break;
+		}
+
+		tmpfile.writeln(format("%*s at %-*s [%s]", maxawaylen, gamedata[i].away, maxhomelen, gamedata[i].home, vote));
+	}
+	tmpfile.close();
+	if(newvotes > 0)
+		send_message(user.alias, "DoveBowl", subject);
+	inifile.iniSetValue(league,"MessagePointer",read_messages(league, inifile.iniGetValue(league, "MessagePointer", 0)));
 }
 
 function create_games(league)
@@ -288,7 +406,6 @@ function create_games(league)
 	console.write('Identifier (ie: "Week 1"): ');
 	identifier = console.getstr(20);
 	subject=league.replace(/[\[\]\/\\\=\+\<\>\:\;\"\,\*\|\^]/g,'') + " " + identifier + " games";
-	var tmpfile=new File(path+format("%04d.tmp",user.number));
 	if(!tmpfile.open("w",false))
 		return_error("Cannot open "+tmpfile.name);
 	tmpfile.writeln("Comments for "+identifier+":");
@@ -359,7 +476,8 @@ function create_games(league)
 		tmpfile.writeln(format("%*s at %s", maxawaylen, games[i].away, games[i].home));
 	}
 	tmpfile.close();
-	send_message(user.alias, "DoveBowl", subject, tmpfile.name);
+	send_message(user.alias, "DoveBowl", subject);
+	inifile.iniSetValue(league,"MessagePointer",read_messages(league, inifile.iniGetValue(league, "MessagePointer", 0)));
 	file_remove(tmpfile.name);
 }
 
@@ -403,18 +521,13 @@ function format_date(dateval)
 	return(ret);
 }
 
-function send_message(from_alias, to_alias, subject, filename)
+function send_message(from_alias, to_alias, subject)
 {
-//	var sports=new MsgBase('DOVE-SPO');
-	var sports=new MsgBase('ENTERTAI');
-	if(!sports.open())
-		return_error("Cannot open message base!",1);
 	var hdr=new Object();
 	hdr.subject=subject;
 	hdr.to=to_alias;
 	hdr.from=from_alias;
 	
-	var tmpfile=new File(filename);
 	if(!tmpfile.open("r",false))
 		return_error("Cannot open "+tmpfile.name);
 	var body=tmpfile.readAll().join("\r\n");
@@ -429,10 +542,6 @@ function read_messages(league, ptr)
 	var curr_msg;
 	var hdr;
 	var subject_prefix=league.replace(/[\[\]\/\\\=\+\<\>\:\;\"\,\*\|\^]/g,'')+' ';
-	var sports=new MsgBase('ENTERTAI');
-
-	if(!sports.open())
-		return_error("Cannot open message base!",1);
 
 	last_msg=sports.last_msg;
 	for(curr_msg=ptr+1; curr_msg <= last_msg; curr_msg++) {
@@ -488,12 +597,108 @@ function read_messages(league, ptr)
 						}
 					}
 				}
-				else {
-					/* Set of Votes? */
+				else if(hdr.subject.substr(-6)==' picks') {
+					/* Set of Votes */
+					var set=hdr.subject.substr(subject_prefix.length, hdr.subject.length - subject_prefix.length - 6);
+					var body=sports.get_msg_body(curr_msg);
+					var body_lines=body.split(/\r?\n/);
+					var started=false;
+					var alias=hdr.from+"@"+((hdr.from_net_type==undefined || hdr.from_net_type==0)?system.qwk_id:((hdr.from_net_addr+'').replace(/^.*\//,'')));
+
+					/* Read game data for this set */
+					var games;
+					var game=0;
+					var gamedata=new Array();
+
+					games=leaguefile.iniGetValue(set, "Games", 0);
+					for(game=0; game<games; game++) {
+						gamedata[game]=new Object;
+						gamedata[game].away=leaguefile.iniGetValue(set, "Game"+(game+1)+"Away", '');
+						gamedata[game].home=leaguefile.iniGetValue(set, "Game"+(game+1)+"Home", '');
+					}
+
+					/* Verify this was imported BEFORE the first game date */
+					if(new Date(leaguefile.iniGetValue(set, "FirstDate", 0)) < new Date(hdr.when_imported_time*1000))
+						continue;
+
+					for(var line in body_lines) {
+						if(body_lines[line]=="=== "+set+" Picks ===")
+							started=true;
+						else if(started) {
+							if(body_lines[line].length > 0) {
+								var m=body_lines[line].match(/^\s*(.*?) at (.*?)\s+\[(.*)\]$/);
+								if(m != null) {
+									/* Find the correct game */
+									for(game=0; game<games; game++) {
+										if(m[1]==gamedata[game].away && m[2]==gamedata[game].home)
+											break;
+									}
+									if(game==games)
+										continue;
+
+									if(m[1]==m[3]) {
+										set_vote(alias, set, game, '0');
+									}
+									else if(m[2]==m[3]) {
+										set_vote(alias, set, game, '1');
+									}
+									else {
+										set_vote(alias, set, game, '2');
+									}
+								}
+							}
+						}
+					}
+				}
+				else if(hdr.subject.substr(-8==' results') {
+					/* Set of Votes */
+					var set=hdr.subject.substr(subject_prefix.length, hdr.subject.length - subject_prefix.length - 8);
+					var body=sports.get_msg_body(curr_msg);
+					var body_lines=body.split(/\r?\n/);
+					var started=false;
+					var alias=hdr.from+"@"+((hdr.from_net_type==undefined || hdr.from_net_type==0)?system.qwk_id:((hdr.from_net_addr+'').replace(/^.*\//,'')));
+
+					/* Read game data for this set */
+					var games;
+					var game=0;
+					var gamedata=new Array();
+
+					games=leaguefile.iniGetValue(set, "Games", 0);
+					for(game=0; game<games; game++) {
+						gamedata[game]=new Object;
+						gamedata[game].away=leaguefile.iniGetValue(set, "Game"+(game+1)+"Away", '');
+						gamedata[game].home=leaguefile.iniGetValue(set, "Game"+(game+1)+"Home", '');
+					}
+
+					/* Verify this was imported AFTER the first game date */
+					if(new Date(leaguefile.iniGetValue(set, "FirstDate", 0)) > new Date(hdr.when_imported_time*1000))
+						continue;
+
+					for(var line in body_lines) {
+						if(body_lines[line]=="=== "+set+" Results ===")
+							started=true;
+						else if(started) {
+							if(body_lines[line].length > 0) {
+								var m=body_lines[line].match(/^\s*(.*?) at (.*?)\s+\[(.*)\]$/);
+								if(m != null) {
+									/* Find the correct game */
+									for(game=0; game<games; game++) {
+										if(m[1]==gamedata[game].away && m[2]==gamedata[game].home)
+											break;
+									}
+									if(game==games)
+										continue;
+
+									if(m[1]==m[3] || m[2]==m[3]) {
+										leaguefile.iniSetValue(set, "Game"+(game+1)+"Winner", m[3]);
+									}
+								}
+							}
+						}
+					}
 				}
 			}
 		}
 	}
-	sports.close();
 	return(curr_msg-1);
 }
diff --git a/xtrn/dovebowl/resultslist.asc b/xtrn/dovebowl/resultslist.asc
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391