diff --git a/exec/ircbots/poker/poker_commands.js b/exec/ircbots/poker/poker_commands.js
index 4f4207b48b6439642bb1114e565bee3a5579e0fe..4f4924e6312221bc240d8c3ddb08892e6919b9df 100644
--- a/exec/ircbots/poker/poker_commands.js
+++ b/exec/ircbots/poker/poker_commands.js
@@ -44,18 +44,14 @@ Bot_Commands["GO"].command = function (target,onick,ouh,srv,lvl,cmd) {
 
 Bot_Commands["FOLD"] = new Bot_Command(0,false,false);
 Bot_Commands["FOLD"].command = function (target,onick,ouh,srv,lvl,cmd) {
-	if(!poker_verify_game_status(target,srv,onick)) return;
-	
-	poker_games[target].bet+=poker_games[target].users[onick].bet;
-	poker_games[target].users[onick].active=false;
-	srv.o(target, onick + " folded their hand.");
-	poker_next_turn(target,srv);
+	if(!poker_verify_user_status(target,srv,onick)) return;
+	poker_fold_player(target,srv,onick);
 	return;
 }
 
 Bot_Commands["CHECK"] = new Bot_Command(0,false,false);
 Bot_Commands["CHECK"].command = function (target,onick,ouh,srv,lvl,cmd) {
-	if(!poker_verify_game_status(target,srv,onick)) return;
+	if(!poker_verify_user_status(target,srv,onick)) return;
 	var poker=poker_games[target];
 	var current_player=poker.users[onick];
 	if(poker.current_bet>current_player.bet) {
@@ -70,7 +66,7 @@ Bot_Commands["CHECK"].command = function (target,onick,ouh,srv,lvl,cmd) {
 
 Bot_Commands["BET"] = new Bot_Command(0,false,false);
 Bot_Commands["BET"].command = function (target,onick,ouh,srv,lvl,cmd) {
-	if(!poker_verify_game_status(target,srv,onick)) return;
+	if(!poker_verify_user_status(target,srv,onick)) return;
 	if(!cmd[1]) {
 		srv.o(onick,"You must specify an amount to bet!","NOTICE");
 		return;
@@ -88,8 +84,8 @@ Bot_Commands["BET"].command = function (target,onick,ouh,srv,lvl,cmd) {
 		srv.o(onick,"You don't have that much money! Balance: $" + poker.users[onick].money,"NOTICE");
 		return;
 	}
-	if(cmd[1]<poker.current_bet) {
-		srv.o(onick,"You must meet the minimum bet! Minimum bet: $" + poker.current_bet,"NOTICE");
+	if(cmd[1]<poker.min_bet) {
+		srv.o(onick,"Your bet must meet the minimum! Minimum bet: $" + poker.min_bet,"NOTICE");
 		return;
 	}
 	srv.o(target,onick + " bets $" + cmd[1]);
@@ -103,20 +99,21 @@ Bot_Commands["BET"].command = function (target,onick,ouh,srv,lvl,cmd) {
 
 Bot_Commands["CALL"] = new Bot_Command(0,false,false);
 Bot_Commands["CALL"].command = function (target,onick,ouh,srv,lvl,cmd) {
-	if(!poker_verify_game_status(target,srv,onick)) return;
+	if(!poker_verify_user_status(target,srv,onick)) return;
 	var poker=poker_games[target];
 	var current_player=poker.users[onick];
 	
-	if(poker.current_bet<=current_player.bet) {
+	if(poker.current_bet==current_player.bet) {
 		srv.o(target,onick + " checks.");
 	} else if(poker.current_bet>current_player.money+current_player.bet) {
 		srv.o(onick,"You don't have enough to call!","NOTICE");
 		srv.o(onick,"Balance: $" + current_player.money,"NOTICE");
 		return;
 	} else {
+		var difference=poker.current_bet-current_player.bet;
 		srv.o(target,onick + " calls the bet: $" + poker.current_bet);
-		current_player.money-=poker.current_bet;
-		current_player.bet+=poker.current_bet;
+		current_player.money-=difference;
+		current_player.bet+=difference;
 		srv.o(onick,"Balance: $" + current_player.money,"NOTICE");
 	}
 	poker_next_turn(target,srv);
@@ -125,7 +122,7 @@ Bot_Commands["CALL"].command = function (target,onick,ouh,srv,lvl,cmd) {
 
 Bot_Commands["RAISE"] = new Bot_Command(0,false,false);
 Bot_Commands["RAISE"].command = function (target,onick,ouh,srv,lvl,cmd) {
-	if(!poker_verify_game_status(target,srv,onick)) return;
+	if(!poker_verify_user_status(target,srv,onick)) return;
 	var bet=Number(cmd[1]);
 	if(!bet) {
 		srv.o(onick,"You must specify an amount to raise!","NOTICE");
@@ -140,14 +137,16 @@ Bot_Commands["RAISE"].command = function (target,onick,ouh,srv,lvl,cmd) {
 		return;
 	}
 	var poker=poker_games[target];
-	if(poker.current_bet+bet>poker.users[onick].money) {
+	var difference=poker.current_bet-poker.users[onick].bet;
+	if(difference+bet>poker.users[onick].money) {
 		srv.o(onick,"You don't have that much money! Balance: $" + poker.users[onick].money,"NOTICE");
 		return;
 	}
-	srv.o(target,onick + " raises the bet to $" + (poker.current_bet+bet));
 	poker.users[onick].money-=bet;
+	poker.users[onick].bet+=difference;
 	poker.users[onick].bet+=bet;
 	poker.current_bet+=bet;
+	srv.o(target,onick + " raises the bet to $" + (poker.current_bet));
 	srv.o(onick,"Balance: $" + poker.users[onick].money,"NOTICE");
 	poker_next_turn(target,srv);
 	return;
@@ -217,3 +216,14 @@ Bot_Commands["HOLE"].command = function (target,onick,ouh,srv,lvl,cmd) {
 	,"NOTICE");
 }
 
+Bot_Commands["INVITE"] = new Bot_Command(0,1,false);
+Bot_Commands["INVITE"].command = function (target,onick,ouh,srv,lvl,cmd) {
+	cmd.shift();
+	if(srv.users[cmd[0].toUpperCase()]) {
+		srv.o(target,cmd[0] + " is already here!");
+		return;
+	}
+	srv.o(cmd[0],onick + " invited you to play poker in " + target
+		+ "! /J " + target + " to join.");
+	return;
+}
diff --git a/exec/ircbots/poker/poker_functions.js b/exec/ircbots/poker/poker_functions.js
index d32e393afa6623c2fc5cee1614fd207fff7ab693..a4cc1f7da06f80a3efa2ef68a57fab1cea803548 100644
--- a/exec/ircbots/poker/poker_functions.js
+++ b/exec/ircbots/poker/poker_functions.js
@@ -15,8 +15,17 @@ function poker_deal_hole_cards(target,srv) {
 
 function poker_next_turn(target,srv) {
 	var poker=poker_games[target];
-	poker.turn=get_next_player(poker.users_map,poker.turn);
+	var current_turn=poker.turn;
+	poker.users[poker.users_map[current_turn]].has_bet=true;
+	poker.turn=get_next_player(poker,poker.turn);
+	var next_turn_user=poker.users[poker.users_map[poker.turn]];
 	
+	if(poker_count_active_players(poker)==1) {
+		poker.round=3;
+		poker.deal_next=true;
+	} else	if(poker.current_bet==next_turn_user.bet && next_turn_user.has_bet) {
+		poker.deal_next=true;
+	}
 	if(poker.deal_next) {
 		poker_load_pot(poker);
 		switch(++poker.round) {
@@ -36,20 +45,53 @@ function poker_next_turn(target,srv) {
 		poker.current_bet=0;
 		poker.deal_next=false;
 		if(poker.round<4) {
+			poker.turn=get_next_player(poker,poker.dealer);
 			poker_game_status(target,srv);
 		}
-	} else {
-		var turn_user=poker.users[poker.users_map[poker.turn]];
-		if(poker.current_bet==turn_user.bet) poker.deal_next=true;
 	}
 	if(poker.round<4) {
 		poker_prompt_player(target,srv);
 	}
 }
 
-function get_next_player(map,turn) {
+function poker_count_active_players(poker_game) {
+	var count=0;
+	for(var u in poker_game.users) {
+		if(poker_game.users[u].active) count++;
+	}
+	return count;
+}
+
+function poker_verify_game_status(poker_game) {
+	var active_users=false;
+	for(var u in srv.users) {
+		if(poker.users[u] && poker.users[u].active) {
+			if(time()-srv.users[u].last_spoke<activity_timeout){
+				active_users=true;
+				break;
+			} else {
+				delete poker.users[u];
+				srv.o(u,"You have been idle too long. "
+					+ "Type 'DEAL' here to resume playing poker.", "NOTICE");
+			}
+		}
+	}
+	if(!active_users) return;
+}
+
+function poker_fold_player(target,srv,onick) {
+	poker_games[target].pot+=poker_games[target].users[onick].bet;
+	poker_games[target].users[onick].active=false;
+	srv.o(target, onick + " folded their hand.");
+	poker_next_turn(target,srv);
+}
+
+function get_next_player(poker_game,turn) {
 	turn++;
-	if(turn==map.length) turn=0;
+	if(turn==poker_game.users_map.length) turn=0;
+	if(!poker_game.users[poker_game.users_map[turn]].active) {
+		turn=get_next_player(poker_game,turn);
+	}
 	return turn;
 }
 
@@ -59,14 +101,16 @@ function poker_compare_hands(target,srv) {
 	var winning_player=-1;
 	for(var p in poker.users) {
 		var player=poker.users[p];
-		var hand=poker.community_cards.concat(player.cards)
-		var rank=Rank(hand);
-		if(rank>winning_hand) {
-			winning_hand=rank;
-			winning_player=p;
+		if(player.active) {
+			var hand=poker.community_cards.concat(player.cards)
+			var rank=Rank(hand);
+			if(rank>winning_hand) {
+				winning_hand=rank;
+				winning_player=p;
+			}
 		}
 	}
-	srv.o(target,winning_player + " won this hand with " + RANKS[winning_hand]);
+	srv.o(target,winning_player + " won this hand! Winnings: $" + poker.pot);
 	poker.users[winning_player].money+=poker.pot;
 	poker.winner=winning_player;
 
@@ -97,6 +141,7 @@ function poker_load_pot(poker_game) {
 	for(var p in poker_game.users) {
 		poker_game.pot+=poker_game.users[p].bet;
 		poker_game.users[p].bet=0;
+		poker_game.users[p].has_bet=false;
 	}
 	return;
 }
@@ -109,7 +154,7 @@ function poker_prompt_player(target,srv) {
 	srv.o(turn,"It is your turn. Minimum bet to call: $" + min_bet,"NOTICE");
 }
 
-function poker_verify_game_status(target,srv,onick) {
+function poker_verify_user_status(target,srv,onick) {
 	var poker=poker_games[target];
 	if (!poker) {
 		srv.o(target, "No poker game in progress. Type '" + get_cmd_prefix()
@@ -138,15 +183,15 @@ function poker_init_hand(target,srv) {
 	for(var u in poker.users) {
 		poker.users_map.push(u);
 	}
-	var small_blind=get_next_player(poker.users_map,poker.dealer);
-	var large_blind=get_next_player(poker.users_map,small_blind);
+	var small_blind=get_next_player(poker,poker.dealer);
+	var large_blind=get_next_player(poker,small_blind);
 	
 	srv.o(target,poker.users_map[poker.dealer] + " is the dealer for this hand.");
 	poker.users[poker.users_map[small_blind]].bet+=poker.sm_blind;
 	srv.o(target,"Small blind: " + poker.users_map[small_blind]  + " $" + poker.sm_blind);
 	poker.users[poker.users_map[large_blind]].bet+=poker.lg_blind;
 	srv.o(target,"Large blind: " + poker.users_map[large_blind]  + " $" + poker.lg_blind);
-	
+	poker.turn=get_next_player(poker,large_blind);
 	poker.min_bet=poker.lg_blind;
 }
 
@@ -168,6 +213,9 @@ function poker_game_status(target,srv) {
 	var state="";
 	var cards="";
 		
+	for(var c in poker.community_cards) {
+		if(poker.community_cards[c]) cards+=poker_show_card(poker.community_cards[c]);
+	}
 	switch(poker.round) {
 		case -1:
 			state="Status: waiting for players";
@@ -176,13 +224,13 @@ function poker_game_status(target,srv) {
 			state="Status: First round betting";
 			break;
 		case 1:
-			state="The Flop: ";
+			state="The Flop: " + cards;
 			break;
 		case 2:
-			state="The Turn: ";
+			state="The Turn: " + cards;
 			break;
 		case 3:
-			state="The River: ";
+			state="The River: " + cards;
 			break;
 		case 4:
 			state="Hand complete. Winner: " + poker.winner;
@@ -190,15 +238,12 @@ function poker_game_status(target,srv) {
 		default:
 			break;
 	}
-	for(var c in poker.community_cards) {
-		if(poker.community_cards[c]) cards+=poker_show_card(poker.community_cards[c]);
-	}
-	if(poker.round>=0) {
+	if(poker.round>=0 && poker.round<4) {
 		srv.o(target,"Current pot: $" + poker.pot);
 		srv.o(target,"Current bet: $" + poker.current_bet);
 		srv.o(target,"Current turn: " + poker.users_map[poker.turn]);
 	}
-	srv.o(target,state + cards);
+	srv.o(target,state);
 }
 
 function poker_reset_game(target,srv) {
@@ -207,9 +252,11 @@ function poker_reset_game(target,srv) {
 		poker.users[u].cards=[];
 		poker.users[u].bet=0;
 		poker.users[u].active=true;
+		poker.users[u].has_bet=false;
 	}
-	poker.dealer=get_next_player(poker.users_map,poker.dealer);
+	poker.dealer=get_next_player(poker,poker.dealer);
 	poker.round=-1;
+	poker.current_bet=poker.min_bet/2;
 	poker.pot=0;
 }
 
diff --git a/exec/ircbots/poker/pokerbot.js b/exec/ircbots/poker/pokerbot.js
index 33c6acd4accbf37de49665606fabc29087c06338..d5e11fd2ed9556420d826d42bdbecfd805ec8cef 100644
--- a/exec/ircbots/poker/pokerbot.js
+++ b/exec/ircbots/poker/pokerbot.js
@@ -19,23 +19,15 @@ function main(srv,target)
 {	
 	var poker=poker_games[target];
 	if(!poker || poker.paused) return;
-	var active_users=false;
 	for(var u in srv.users) {
-		if(poker.users[u]) {
-			if(time()-srv.users[u].last_spoke<activity_timeout){
-				active_users=true;
-				break;
-			} else {
-				delete poker.users[u];
+		if(poker.users[u] && poker.users[u].active) {
+			if(time()-srv.users[u].last_spoke>=activity_timeout){
+				poker_fold_player(target,srv,u);
 				srv.o(u,"You have been idle too long. "
 					+ "Type 'DEAL' here to resume playing poker.", "NOTICE");
 			}
 		}
 	}
-	if(!active_users) return;
-	
-	if(poker.cycle()) {
-	}
 }
 
 // Game objects
@@ -44,11 +36,11 @@ function Poker_Game()
 	this.last_update=0;
 	this.turn=0;
 	this.pot=0;
-	this.lg_blind=10;
-	this.sm_blind=5;
 	this.dealer=0;
-	this.min_bet=this.sm_blind;
+	this.min_bet=10;
 	this.current_bet=this.min_bet;
+	this.lg_blind=this.min_bet;
+	this.sm_blind=this.min_bet/2;
 	this.round=-1;
 	this.deck=new Deck();
 	this.community_cards=new Array();
@@ -71,6 +63,7 @@ function Poker_Player()
 	this.cards=[];
 	this.money=100;
 	this.bet=0;
+	this.has_bet=false;
 	this.active=true;
 }