Index: components/blackjack/BlackjackHeader.jsx
===================================================================
--- components/blackjack/BlackjackHeader.jsx	(revision 433e0c5f4289ea953d6d2c2d010c6bd651bd0c8f)
+++ components/blackjack/BlackjackHeader.jsx	(revision 55701f0270de2168597a7ca5d1a05ae6a66f516b)
@@ -30,15 +30,5 @@
         }));
 
-        dispatch(setBlackjack({
-            ...styleState.blackjack,
-            inputControls: {
-                ...styleState.blackjack.inputControls,
-                initialBet: {
-                    ...styleState.blackjack.inputControls.initialBet,
-                    chosenCredits: parseInt(playerState.player.credits/2),
-                }
-            }
-        }));
-
+        let interval = null;
         axios.get(`/api/blackjack?action=get_player_info_on_enter&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(res => {
             if (res.data?.success) {
@@ -48,185 +38,81 @@
                     session_id: res.data?.session_id,
                     credits: res.data?.credits,
-                }));
-
-                dispatch(setBlackjackGame({
-                    ...playerState.blackjackGame,
-                    status: res.data?.status,
-                    playerCards: res.data?.playerCards,
-                    dealerCards: res.data?.dealerCards,
                 }))
 
-                dispatch(setStyle({
-                    ...styleState.style,
-                    displayLoadingScreen: false,
+                dispatch(setBlackjack({
+                    ...styleState.blackjack,
+                    inputControls: {
+                        ...styleState.blackjack.inputControls,
+                        initialBet: {
+                            ...styleState.blackjack.inputControls.initialBet,
+                            chosenCredits: parseInt(playerState.player.credits/2),
+                        },
+                        sideBet: {
+                            ...styleState.blackjack.inputControls.sideBet,
+                            chosenCredits: parseInt(playerState.player.credits/2),
+                        }
+                    },
                 }))
 
-                if (parseInt(res.data?.status.toString().substr(1, 1)) == 5) {
-                    dispatch(setBlackjack({
-                        ...styleState.blackjack,
-                        inputControls: {
-                            ...styleState.blackjack.inputControls,
-                            initialBet: {
-                                ...styleState.blackjack.inputControls.initialBet,
-                                chosenCredits: parseInt(res.data?.initialBet),
-                            },
-                            sideBet: {
-                                ...styleState.blackjack.inputControls.sideBet,
-                                chosenCredits: 0,
+                if (interval !== null) clearInterval(interval);
+                
+                interval = setInterval(() => {
+                    axios.get(`/api/blackjack?action=update_state&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(newRes => {
+                        if (newRes.data?.success) {
+                            dispatch(setBlackjackGame(newRes.data?.blackjackGame))
+
+                            if (newRes.data?.blackjackGame?.credits !== playerState.player.credits && parseInt(newRes.data?.blackjackGame?.credits) > 0) {
+                                dispatch(setPlayer({
+                                    ...playerState.player,
+                                    displayName: res.data?.displayName,
+                                    session_id: res.data?.session_id,
+                                    credits: newRes.data?.blackjackGame?.credits,
+                                }))
                             }
-                        },
-                        displays: {
-                            ...styleState.blackjack.displays,
-                            initialBet: false,
-                            hitStand: true,
+
+                            dispatch(setStyle({
+                                ...styleState.style,
+                                displayLoadingScreen: false,
+                                notification: {
+                                    ...styleState.style.notification,
+                                    show: false,
+                                },
+                                lostConnectionInfo: {
+                                    show: false,
+                                    message: ''
+                                },
+                                alert: (newRes.data?.blackjackGame?.status?.includes('_5_') && !newRes.data?.blackjackGame?.betOutcomeMessageShown) ? {
+                                    show: true,
+                                    title: newRes.data?.blackjackGame?.messageTitle,
+                                    subtitle: newRes.data?.blackjackGame?.messageDescription,
+                                    button: {
+                                        text: 'Play Again',
+                                        action: 'play_again',
+                                    }
+                                } : (newRes.data?.blackjackGame?.status?.includes('_4_') && !newRes.data?.blackjackGame?.sideBetOutcomeMessageShown && newRes.data?.blackjackGame?.sideBet > 0) ? {
+                                    show: true,
+                                    title: newRes.data?.blackjackGame?.messageTitle,
+                                    subtitle: newRes.data?.blackjackGame?.messageDescription,
+                                    button: {
+                                        text: 'Continue',
+                                        action: 'continue_from_side_bet',
+                                    }
+                                } : {
+                                    ...styleState.style.alert,
+                                    show: false,
+                                },
+                            }))
                         }
-                    }))
-
-                    if (res.data?.outcome === 'player_busted') {
+                    }).catch(error => {
                         dispatch(setStyle({
                             ...styleState.style,
-                            alert: {
+                            displayLoadingScreen: false,
+                            lostConnectionInfo: {
                                 show: true,
-                                title: 'You busted!',
-                                subtitle: `You lost $${-1*res.data?.earnings}`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
+                                message: 'Game will resume upon reconnection to the server.'
                             }
                         }))
-                    }
-                    else if (res.data?.outcome === 'dealer_busted') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'Dealer busted!',
-                                subtitle: `You won $${res.data?.earnings}`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                    else if (res.data?.outcome === 'player_won') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'You won!',
-                                subtitle: `You won $${res.data?.earnings}`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                    else if (res.data?.outcome === 'player_lost') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'You lost!',
-                                subtitle: `You lost $${-1*res.data?.earnings}`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                    else if (res.data?.outcome === 'draw') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'Draw!',
-                                subtitle: `You got your $${res.data?.earnings} back`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                }
-
-                if (parseInt(res.data?.status.toString().substr(1, 1)) == 4) {
-                    dispatch(setBlackjack({
-                        ...styleState.blackjack,
-                        inputControls: {
-                            ...styleState.blackjack.inputControls,
-                            initialBet: {
-                                ...styleState.blackjack.inputControls.initialBet,
-                                chosenCredits: parseInt(res.data?.initialBet),
-                            },
-                            sideBet: {
-                                ...styleState.blackjack.inputControls.sideBet,
-                                chosenCredits: 0,
-                            }
-                        },
-                        displays: {
-                            ...styleState.blackjack.displays,
-                            initialBet: false,
-                            hitStand: true,
-                        }
-                    }))
-                }
-
-                if (parseInt(res.data?.status.toString().substr(1, 1)) == 3) {
-                    dispatch(setBlackjack({
-                        ...styleState.blackjack,
-                        inputControls: {
-                            ...styleState.blackjack.inputControls,
-                            initialBet: {
-                                ...styleState.blackjack.inputControls.initialBet,
-                                chosenCredits: parseInt(res.data?.initialBet),
-                            },
-                            sideBet: {
-                                ...styleState.blackjack.inputControls.sideBet,
-                                chosenCredits: parseInt(res.data?.sideBet),
-                            }
-                        },
-                        displays: {
-                            ...styleState.blackjack.displays,
-                            initialBet: false,
-                            hitStand: true,
-                        }
-                    }))
-                }
-
-                if (parseInt(res.data?.status.toString().substr(1, 1)) == 2) {
-                    dispatch(setBlackjack({
-                        ...styleState.blackjack,
-                        inputControls: {
-                            ...styleState.blackjack.inputControls,
-                            initialBet: {
-                                ...styleState.blackjack.inputControls.initialBet,
-                                chosenCredits: parseInt(res.data?.initialBet),
-                            }
-                        },
-                        displays: {
-                            ...styleState.blackjack.displays,
-                            initialBet: false,
-                            sideBet: true,
-                        }
-                    }))
-                }
-
-                if (parseInt(res.data?.status.toString().substr(1, 1)) == 1) {
-                    dispatch(setBlackjack({
-                        ...styleState.blackjack,
-                        inputControls: {
-                            ...styleState.blackjack.inputControls,
-                            initialBet: {
-                                ...styleState.blackjack.inputControls.initialBet,
-                                chosenCredits: parseInt(res.data?.credits/2),
-                            }
-                        },
-                    }))
-                }
+                    });
+                }, 1000);
             }
             else {
@@ -244,4 +130,8 @@
             }
         });
+
+        return () => {
+            if (interval !== null) clearInterval(interval);
+        };
     }, []);
 
Index: components/blackjack/DisplayBet.jsx
===================================================================
--- components/blackjack/DisplayBet.jsx	(revision 433e0c5f4289ea953d6d2c2d010c6bd651bd0c8f)
+++ components/blackjack/DisplayBet.jsx	(revision 55701f0270de2168597a7ca5d1a05ae6a66f516b)
@@ -6,11 +6,10 @@
   const playerState = useSelector(state => state.player);
   const styleState = useSelector(state => state.style);
-
   let display = parseInt(playerState.blackjackGame.status.substr(1, 1)) >= 2 ? 'block' : 'none';
-  let displaySideBet = ( parseInt(playerState.blackjackGame.status.substr(1, 1)) >= 3 && parseInt(styleState.blackjack.inputControls.sideBet.chosenCredits) > 0 ) ? 'block' : 'none';
+  let displaySideBet = ( parseInt(playerState.blackjackGame.status.substr(1, 1)) >= 3 && parseInt(playerState.blackjackGame.sideBet) > 0 && !playerState.blackjackGame.sideBetOutcomeMessageShown ) ? 'block' : 'none';
 
   return (
     <div className="blackjackDisplayBet" style={{display: display}}>
-      <span>${styleState.blackjack.inputControls.initialBet.chosenCredits}{displaySideBet === 'block' ? ` + $${styleState.blackjack.inputControls.sideBet.chosenCredits}` : ''}</span>
+      <span>${playerState.blackjackGame.initialBet}{displaySideBet === 'block' ? ` + $${playerState.blackjackGame.sideBet}` : ''}</span>
     </div>
   )
Index: components/blackjack/PlayButtons.jsx
===================================================================
--- components/blackjack/PlayButtons.jsx	(revision 433e0c5f4289ea953d6d2c2d010c6bd651bd0c8f)
+++ components/blackjack/PlayButtons.jsx	(revision 55701f0270de2168597a7ca5d1a05ae6a66f516b)
@@ -44,26 +44,5 @@
 
     function placeInitialBetClicked() {
-        axios.get(`/api/blackjack?action=make_initial_bet&session_id=${localStorage.CAESSINO_SESSION_ID}&bet=${styleState.blackjack.inputControls.initialBet.chosenCredits}`).then(res => {
-            if (res.data?.success) {
-                dispatch(setBlackjackGame({
-                    ...playerState.blackjackGame,
-                    status: res.data?.status,
-                }))
-
-                dispatch(setPlayer({
-                    ...playerState.player,
-                    credits: res.data?.credits,
-                }))
-
-                dispatch(setBlackjack({
-                    ...styleState.blackjack,
-                    displays: {
-                        ...styleState.blackjack.displays,
-                        initialBet: false,
-                        sideBet: true,
-                    }
-                }))
-            }
-        });
+        axios.get(`/api/blackjack?action=make_initial_bet&session_id=${localStorage.CAESSINO_SESSION_ID}&bet=${styleState.blackjack.inputControls.initialBet.chosenCredits}`);
     }
 
@@ -124,11 +103,7 @@
         const texts = splitTexts(e.target.innerHTML);
 
-        dispatch(setBlackjackGame({
-            ...playerState.blackjackGame,
-            sideBetName: sideBetName
-        }))
-
-        dispatch(setBlackjack({
-            ...styleState.blackjack,
+        dispatch(setBlackjack({
+            ...styleState.blackjack,
+            sideBetName: sideBetName,
             displays: {
                 ...styleState.blackjack.displays,
@@ -145,16 +120,6 @@
 
     function placeSideBetClicked() {
-        axios.get(`/api/blackjack?action=make_side_bet&session_id=${localStorage.CAESSINO_SESSION_ID}&bet=${styleState.blackjack.inputControls.sideBet.chosenCredits}&betName=${playerState.blackjackGame.sideBetName}`).then(res => {
+        axios.get(`/api/blackjack?action=make_side_bet&session_id=${localStorage.CAESSINO_SESSION_ID}&bet=${styleState.blackjack.inputControls.sideBet.chosenCredits}&betName=${styleState.blackjack.sideBetName}`).then(res => {
             if (res.data?.success) {
-                dispatch(setBlackjackGame({
-                    ...playerState.blackjackGame,
-                    status: res.data?.status,
-                }))
-
-                dispatch(setPlayer({
-                    ...playerState.player,
-                    credits: res.data?.credits,
-                }))
-
                 dispatch(setBlackjack({
                     ...styleState.blackjack,
@@ -162,6 +127,4 @@
                         ...styleState.blackjack.displays,
                         sideBetsChooseCreditsModal: false,
-                        sideBet: false,
-                        hitStand: true,
                     }
                 }))
@@ -181,13 +144,4 @@
                         sideBetsModal: false,
                         sideBetsChooseCreditsModal: false,
-                        sideBet: false,
-                        hitStand: true,
-                    },
-                    inputControls: {
-                        ...styleState.blackjack.inputControls,
-                        sideBet: {
-                            ...styleState.blackjack.inputControls.sideBet,
-                            chosenCredits: 0,
-                        }
                     },
                 }))
@@ -199,50 +153,5 @@
 
     function getCards() {
-        axios.get(`/api/blackjack?action=get_initial_cards&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(res => {
-            if (res.data?.success) {
-                dispatch(setBlackjackGame({
-                    ...playerState.blackjackGame,
-                    status: res.data?.status,
-                    playerCards: res.data?.playerCards,
-                    dealerCards: res.data?.dealerCards,
-                }))
-
-                if (res.data?.sideBetOutcome !== '') {
-                    if (res.data.sideBetOutcome === 'side_bet_won') {
-                        dispatch(setBlackjackGame({
-                            ...playerState.blackjackGame,
-                            credits: res.data?.credits,
-                        }))
-                        
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'You won the side bet!',
-                                subtitle: `You won $${res.data?.sideBetEarnings}`,
-                                button: {
-                                    text: 'Continue',
-                                    action: 'continue_from_side_bet',
-                                }
-                            }
-                        }))
-                    }
-                    else if (res.data.sideBetOutcome === 'side_bet_lost') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'You lost the side bet!',
-                                subtitle: `You lost $${-1*res.data?.sideBetEarnings}`,
-                                button: {
-                                    text: 'Continue',
-                                    action: 'continue_from_side_bet',
-                                }
-                            }
-                        }))
-                    }
-                }
-            }
-        });
+        axios.get(`/api/blackjack?action=get_initial_cards&session_id=${localStorage.CAESSINO_SESSION_ID}`);
     }
 
@@ -282,83 +191,10 @@
 
     function standClicked() {
-        axios.get(`/api/blackjack?action=stand&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(res => {
-            if (res.data?.success) {
-                dispatch(setBlackjackGame({
-                    ...playerState.blackjackGame,
-                    status: res.data?.status,
-                    playerCards: res.data?.playerCards,
-                    dealerCards: res.data?.dealerCards,
-                }))
-
-                if (res.data?.status.toString().substr(1, 1) === '5') { // game_over
-                    dispatch(setPlayer({
-                        ...playerState.player,
-                        credits: res.data?.credits,
-                    }))
-                    
-                    if (res.data?.outcome === 'dealer_busted') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'Dealer busted!',
-                                subtitle: `You won $${res.data?.earnings}`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                    else if (res.data?.outcome === 'player_won') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'You won!',
-                                subtitle: `You won $${res.data?.earnings}`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                    else if (res.data?.outcome === 'player_lost') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'You lost!',
-                                subtitle: `You lost $${-1*res.data?.earnings}`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                    else if (res.data?.outcome === 'draw') {
-                        dispatch(setStyle({
-                            ...styleState.style,
-                            alert: {
-                                show: true,
-                                title: 'Draw!',
-                                subtitle: `You got your $${res.data?.earnings} back`,
-                                button: {
-                                    text: 'Play again',
-                                    action: 'play_again',
-                                }
-                            }
-                        }))
-                    }
-                }
-            }
-        });
+        axios.get(`/api/blackjack?action=stand&session_id=${localStorage.CAESSINO_SESSION_ID}`);
     }
 
     return (
         <div className="blackjackButtons">
-            <div className="blackjackInitialBet" style={{display: styleState.blackjack.displays.initialBet ? 'flex' : 'none'}}>
+            <div className="blackjackInitialBet" style={{display: playerState.blackjackGame.status.includes('_1_') ? 'flex' : 'none'}}>
                 <div>
                     <input type="range" className="primarySlider" min={0} max={playerState.player.credits} step={1} value={styleState.blackjack.inputControls.initialBet.chosenCredits} onChange={(e) => chooseCoins(e)} />
@@ -369,9 +205,9 @@
                 <button className="primaryButton" onClick={() => placeInitialBetClicked()}>Place Initial Bet <GiTwoCoins style={{marginTop: '3px', marginBottom: '-3px'}} /></button>
             </div>
-            <div className="blackjackSideBet" style={{display: styleState.blackjack.displays.sideBet ? 'flex' : 'none'}}>
+            <div className="blackjackSideBet" style={{display: playerState.blackjackGame.status.includes('_2_') ? 'flex' : 'none'}}>
                 <button className="primaryButton" onClick={() => placeSideBetsClicked()}>Place Side Bets <GiTwoCoins style={{marginTop: '3px', marginBottom: '-3px'}} /></button>
                 <button className="primaryButton" onClick={() => skipSideBetsClicked()}>Skip <GiReturnArrow style={{marginTop: '3px', marginBottom: '-3px', transform: 'rotateZ(-15deg)'}} /></button>
             </div>
-            <div className="blackjackHitStand" style={{display: styleState.blackjack.displays.hitStand ? 'flex' : 'none'}}>
+            <div className="blackjackHitStand" style={{display: parseInt(playerState.blackjackGame.status.toString().substr(1, 1)) >= 3 ? 'flex' : 'none'}}>
                 <button className="primaryButton" onClick={() => hitClicked()}>Hit <GiCardDraw style={{marginTop: '3px', marginBottom: '-3px'}} /></button>
                 <button className="primaryButton" onClick={() => standClicked()}>Stand <AiFillCheckCircle style={{marginTop: '3px', marginBottom: '-3px'}} /></button>
