Index: components/roulette/Ball.jsx
===================================================================
--- components/roulette/Ball.jsx	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ components/roulette/Ball.jsx	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -5,9 +5,8 @@
 const Ball = () => {
     const playerState = useSelector(state => state.player);
-    const styleState = useSelector(state => state.style);
 
     return (
         <>
-            { (playerState.rouletteGame.timeToStart > styleState.roulette.COUNTDOWN_FROM || playerState.rouletteGame.timeToStart <= 0) &&
+            { (playerState.rouletteGame.game.timeToStart > playerState.rouletteGame.game.COUNTDOWN_FROM || playerState.rouletteGame.game.timeToStart <= 0) &&
                 <img id="rouletteBall" src="/images/roulette-ball.png" alt="Roulette ball"/>
             }
Index: components/roulette/BetModal.jsx
===================================================================
--- components/roulette/BetModal.jsx	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ components/roulette/BetModal.jsx	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -30,43 +30,21 @@
 
     function placeBet() {
-        axios.get(`/api/roulette?action=place_bet&session_id=${localStorage.CAESSINO_SESSION_ID}&betAmount=${styleState.roulette.inputControls.bet.chosenCredits}&whichBets=${styleState.roulette.whichBets.toString()}`).then(res => {
-            if (res.data?.success) {
-                dispatch(setPlayer({
-                    ...playerState.player,
-                    credits: res.data?.credits,
-                }));
+        axios.get(`/api/roulette?action=place_bet&session_id=${localStorage.CAESSINO_SESSION_ID}&betAmount=${styleState.roulette.inputControls.bet.chosenCredits}&whichBets=${styleState.roulette.whichBets.toString()}&coinPlacedX=${styleState.roulette.coinPlaced.x}&coinPlacedY=${styleState.roulette.coinPlaced.y}`);
 
-                dispatch(setRouletteGame(res.data?.game));
-
-                closeModal(false);
-            }
-        });
+        closeModal();
     }
 
-    function closeModal(removeCoin = true) {
-        if (removeCoin) {
-            dispatch(setRoulette({
-                ...styleState.roulette,
-                displays: {
-                  ...styleState.roulette.displays,
-                  betModal: false,
-                },
-                showCoin: false,
-              }))
-        }
-        else {
-            dispatch(setRoulette({
-                ...styleState.roulette,
-                displays: {
-                    ...styleState.roulette.displays,
-                    betModal: false,
-                },
-                showCoin: true,
-            }));
-        }
+    function closeModal() {
+        dispatch(setRoulette({
+            ...styleState.roulette,
+            displays: {
+                ...styleState.roulette.displays,
+                betModal: false,
+            },
+        }));
     }
 
     return (
-        <div className="rouletteBetModal" style={{display: styleState.roulette.displays.betModal && playerState.rouletteGame.timeToStart > 10 ? 'flex' : 'none'}}>
+        <div className="rouletteBetModal" style={{display: styleState.roulette.displays.betModal && playerState.rouletteGame.game.timeToStart > 10 && playerState.rouletteGame.game.timeToStart <= playerState.rouletteGame.game.COUNTDOWN_FROM ? 'flex' : 'none'}}>
             <p>You have chosen to bet on: <span>{styleState.roulette.whichBets.map((bet, i) => `${bet} `)}</span><br/>Please select the amount you will bet</p>
             <div>
Index: components/roulette/BetsImage.jsx
===================================================================
--- components/roulette/BetsImage.jsx	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ components/roulette/BetsImage.jsx	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -25,7 +25,6 @@
         let clicked = getClickedArray(xOffset, singleX, yOffset, singleY);
 
-        if (clicked.length > 0 && playerState.rouletteGame.status.substr(1, 1) === '1') {
-          const playerIdx = playerState.rouletteGame.players.map(e=>e.session_id).indexOf(localStorage.CAESSINO_SESSION_ID);
-          if (playerIdx !== -1 && playerState.rouletteGame.players[playerIdx].status.substr(1, 1) === '1') {
+        if (clicked.length > 0 && playerState.rouletteGame.game.status.includes("_1_")) {
+          if (playerState.rouletteGame.player.status.includes("_1_")) {
             openModal(clicked, e);
           }
Index: components/roulette/CoinOnTable.jsx
===================================================================
--- components/roulette/CoinOnTable.jsx	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ components/roulette/CoinOnTable.jsx	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -4,9 +4,9 @@
 
 const CoinOnTable = () => {
-    const styleState = useSelector(state => state.style);
+    const playerState = useSelector(state => state.player);
 
     return (
         <>
-            {styleState.roulette.showCoin && <img id="coinOnTable" src="/gold-coin.cur" alt="Gold coin" style={{zIndex: 20, position: 'absolute', left: `${styleState.roulette.coinPlaced.x}px`, top: `${styleState.roulette.coinPlaced.y}px`, transform: 'translate(-50%, -50%)'}}/>}
+            {playerState.rouletteGame?.player.coinPlaced.x && playerState.rouletteGame.player.coinPlaced.x !== -1 && <img id="coinOnTable" src="/gold-coin.cur" alt="Gold coin" style={{zIndex: 20, position: 'absolute', left: `${playerState.rouletteGame.player.coinPlaced.x}px`, top: `${playerState.rouletteGame.player.coinPlaced.y}px`, transform: 'translate(-50%, -50%)'}}/>}
         </>
     )
Index: components/roulette/PlayersDisplay.jsx
===================================================================
--- components/roulette/PlayersDisplay.jsx	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ components/roulette/PlayersDisplay.jsx	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -5,8 +5,7 @@
 const PlayersDisplay = () => {
     const playerState = useSelector(state => state.player);
-    const styleState = useSelector(state => state.style);
 
     // See results.
-    if (playerState.rouletteGame.timeToStart > styleState.roulette.COUNTDOWN_FROM) {
+    if (playerState.rouletteGame.game.timeToStart > playerState.rouletteGame.game.COUNTDOWN_FROM) {
         return (
             <div className="roulettePlayersContainer">
@@ -14,5 +13,5 @@
                     <p>Winners:</p>
                     <hr/>
-                    {playerState.rouletteGame?.players.map((player, i) => (
+                    {playerState.rouletteGame?.game.players.map((player, i) => (
                         player.betAmount > 0 && player.outcome === 'won' ? <p key={player + i}>{player.name} <span style={{color: '#ead24d'}}>[{player.whichBets.toString()}]</span></p> : <span key={player + i}></span>
                     ))}
@@ -21,5 +20,5 @@
                     <p>Losers:</p>
                     <hr/>
-                    {playerState.rouletteGame?.players.map((player, i) => (
+                    {playerState.rouletteGame?.game.players.map((player, i) => (
                         player.betAmount > 0 && player.outcome === 'lost' ? <p key={player + i}>{player.name} <span style={{color: '#ead24d'}}>[{player.whichBets.toString()}]</span></p> : <span key={player + i}></span>
                     ))}
@@ -35,5 +34,5 @@
                     <p>Online:</p>
                     <hr/>
-                    {playerState.rouletteGame?.players.map((player, i) => (
+                    {playerState.rouletteGame?.game.players.map((player, i) => (
                         player.status.substr(1, 1) === '1' ? <p key={player + i}>{player.name}</p> : <span key={player + i}></span>
                     ))}
@@ -42,5 +41,5 @@
                     <p>Betted:</p>
                     <hr/>
-                    {playerState.rouletteGame?.players.map((player, i) => (
+                    {playerState.rouletteGame?.game.players.map((player, i) => (
                         player.status.substr(1, 1) === '2' ? <p key={player + i}>{player.name} <span style={{color: '#ead24d'}}>[{player.whichBets.toString()}]</span></p> : <span key={player + i}></span>
                     ))}
Index: components/roulette/RouletteHeader.jsx
===================================================================
--- components/roulette/RouletteHeader.jsx	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ components/roulette/RouletteHeader.jsx	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -24,4 +24,30 @@
 
     useEffect(() => {
+        function spin_wheel(magicNumber, winningBets) {
+            document.getElementById('rouletteWheelImg').classList.add('spin');
+    
+            setTimeout(() => {
+                document.getElementById('rouletteWheelImg').classList.remove('spin');
+    
+                const extraSpin = ( 5 + numbersOfWheel.indexOf(playerState.rouletteGame.game?.magicNumber) * (360 / 37.0) ) + 'deg';
+                document.getElementById('rouletteWheelImg').style.transform = `translate(-50%, -50%) rotateZ(${extraSpin})`;
+    
+                setTimeout(() => {
+                    dispatch(setStyle({
+                        ...styleState.style,
+                        alert: {
+                            show: true,
+                            title: `Winning number: ${magicNumber}`,
+                            subtitle: `Winning bets: [${winningBets.join(', ')}]`,
+                            button: {
+                                text: 'Continue',
+                                action: '',
+                            }
+                        }
+                    }))
+                }, 2000);
+            }, 4000);
+        }
+
         // display loading screen
         dispatch(setStyle({
@@ -29,4 +55,6 @@
             displayLoadingScreen: true,
         }));
+
+        let interval = null;
 
         axios.get(`/api/roulette?action=get_player_info_on_enter&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(res => {
@@ -39,5 +67,22 @@
                 }));
 
-                dispatch(setRouletteGame(res.data?.game));
+                interval = setInterval(() => {
+                    axios.get(`/api/roulette?action=update_state&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(newRes => {
+                        if (newRes.data?.success) {
+                            dispatch(setRouletteGame(newRes.data?.rouletteGame));
+
+                            if (newRes.data?.extraAction === "spin_wheel") {
+                                spin_wheel(newRes.data.magicNumber ?? -1, newRes.data.winningBets ?? -1);
+                            }
+
+                            if (newRes.data?.rouletteGame?.player?.credits !== playerState.player.credits && newRes.data?.rouletteGame?.player?.credits > 0) {
+                                dispatch(setPlayer({
+                                    ...playerState.player,
+                                    credits: newRes.data?.rouletteGame?.player?.credits,
+                                }))
+                            }
+                        }
+                    });
+                }, 1000);
 
                 dispatch(setRoulette({
@@ -91,3 +136,6 @@
 }
 
+// 10 starts from 5deg
+const numbersOfWheel = [10, 23, 8, 30, 11, 36, 13, 27, 6, 34, 17, 25, 2, 21, 4, 19, 15, 32, 0, 26, 3, 35, 12, 28, 7, 29, 18, 22, 9, 31, 14, 20, 1, 33, 16, 24, 5];
+
 export default RouletteHeader
Index: components/roulette/Timer.jsx
===================================================================
--- components/roulette/Timer.jsx	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ components/roulette/Timer.jsx	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -14,77 +14,8 @@
     const styleState = useSelector(state => state.style);
 
-    useEffect(() => {
-        let interval = setInterval(() => {
-            dispatch(setRouletteGame({
-                ...playerState.rouletteGame,
-                timeToStart: playerState.rouletteGame.timeToStart - 1,
-            }))
+    function getTimer() {
+        const timer = playerState.rouletteGame.game.timeToStart;
 
-            if (playerState.rouletteGame.timeToStart === 0) {
-                axios.get(`/api/roulette?action=timer_done&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(res => {
-                    if (res.data?.success) {
-                        document.getElementById('rouletteWheelImg').classList.add('spin');
-
-                        setTimeout(() => {
-                            document.getElementById('rouletteWheelImg').classList.remove('spin');
-
-                            const extraSpin = ( 5 + numbersOfWheel.indexOf(res.data?.magicNumber) * (360 / 37.0) ) + 'deg';
-                            document.getElementById('rouletteWheelImg').style.transform = `translate(-50%, -50%) rotateZ(${extraSpin})`;
-
-                            setTimeout(() => {
-                                dispatch(setStyle({
-                                    ...styleState.style,
-                                    alert: {
-                                        show: true,
-                                        title: `Winning number: ${res.data?.magicNumber}`,
-                                        subtitle: `Winning bets: [${res.data?.winningBets.join(', ')}]`,
-                                        button: {
-                                            text: 'Continue',
-                                            action: '',
-                                        }
-                                    }
-                                }))
-                                
-                                dispatch(setPlayer({
-                                    ...playerState.player,
-                                    credits: res.data?.credits,
-                                }))
-
-                                dispatch(setRouletteGame(res.data?.game));
-                            }, 600);
-                        }, 4000);
-                    }
-                });
-            }
-            else if (playerState.rouletteGame.timeToStart === 10) {
-                dispatch(setRoulette({
-                    ...styleState.roulette,
-                    displays: {
-                        ...styleState.roulette.displays,
-                        betModal: false,
-                    }
-                }))
-            }
-            else if (playerState.rouletteGame.timeToStart === styleState.roulette.COUNTDOWN_FROM) {
-                axios.get(`/api/roulette?action=reset_game&session_id=${localStorage.CAESSINO_SESSION_ID}`).then(res => {
-                    if (res.data?.success) {
-                        dispatch(setRouletteGame(res.data?.game));
-
-                        dispatch(setRoulette({
-                            ...styleState.roulette,
-                            showCoin: false,
-                        }))
-                    }
-                });
-            }
-        }, 1000);
-
-        return () => clearInterval(interval);
-    }, [dispatch, playerState.rouletteGame.timeToStart, playerState.rouletteGame]);
-
-    function getTimer() {
-        const timer = playerState.rouletteGame.timeToStart;
-
-        const timeString = (timer < 0 || timer > styleState.roulette.COUNTDOWN_FROM - 2) ? '00:00' : '0' + parseInt(timer/60) + ':' + (timer%60 < 10 ? '0' : '') + (timer%60);
+        const timeString = (timer < 0 || timer > playerState.rouletteGame.game.COUNTDOWN_FROM - 2) ? '00:00' : '0' + parseInt(timer/60) + ':' + (timer%60 < 10 ? '0' : '') + (timer%60);
 
         return timeString;
@@ -93,20 +24,17 @@
     return (
         <div className="rouletteTimer">
-            {playerState.rouletteGame.timeToStart > 0 && playerState.rouletteGame.timeToStart <= styleState.roulette.COUNTDOWN_FROM - 2 && <span style={{fontSize: '1rem'}}>Wheel will spin in:</span>}
+            {playerState.rouletteGame.game.timeToStart > 0 && playerState.rouletteGame.game.timeToStart <= playerState.rouletteGame.game.COUNTDOWN_FROM - 2 && <span style={{fontSize: '1rem'}}>Wheel will spin in:</span>}
             
             <span>{getTimer()}</span>
 
-            {playerState.rouletteGame.timeToStart > 10 && playerState.rouletteGame.timeToStart <= styleState.roulette.COUNTDOWN_FROM - 2 && <span style={{fontSize: '1rem'}}>Make your bets.</span>}
+            {playerState.rouletteGame.game.timeToStart > 10 && playerState.rouletteGame.game.timeToStart <= playerState.rouletteGame.game.COUNTDOWN_FROM - 2 && <span style={{fontSize: '1rem'}}>Make your bets.</span>}
 
-            {playerState.rouletteGame.timeToStart <= 10 && <span style={{fontSize: '1rem'}}>Betting time is over.</span>}
+            {playerState.rouletteGame.game.timeToStart <= 10 && <span style={{fontSize: '1rem'}}>Betting time is over.</span>}
 
-            {playerState.rouletteGame.timeToStart > styleState.roulette.COUNTDOWN_FROM && <span style={{fontSize: '1rem'}}>Time to see who won :)</span>}
-            {playerState.rouletteGame.timeToStart > styleState.roulette.COUNTDOWN_FROM && <span style={{fontSize: '.7rem'}}>(And prepare, you can bet again soon.)</span>}
+            {playerState.rouletteGame.game.timeToStart > playerState.rouletteGame.game.COUNTDOWN_FROM && <span style={{fontSize: '1rem'}}>Time to see who won :)</span>}
+            {playerState.rouletteGame.game.timeToStart > playerState.rouletteGame.game.COUNTDOWN_FROM && <span style={{fontSize: '.7rem'}}>(And prepare, you can bet again soon.)</span>}
         </div>
     )
 }
 
-// 10 starts from 5deg
-const numbersOfWheel = [10, 23, 8, 30, 11, 36, 13, 27, 6, 34, 17, 25, 2, 21, 4, 19, 15, 32, 0, 26, 3, 35, 12, 28, 7, 29, 18, 22, 9, 31, 14, 20, 1, 33, 16, 24, 5];
-
 export default Timer
Index: pages/api/poker/index.js
===================================================================
--- pages/api/poker/index.js	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ pages/api/poker/index.js	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -256,5 +256,5 @@
         /**
          * /---------------------- GET ----------------------/
-         * Creates the table and enters the user inside
+         * Updates the state periodically
          * @action update_state
          * @param session_id
@@ -265,5 +265,5 @@
             const { success, table, player } = getTableAndPlayer(session_id);
 
-            if (table.started && !table.ended) {
+            if (success && table.started && !table.ended) {
                 const d = Date.now();
 
@@ -272,4 +272,5 @@
                         table.players[table.turnIdx].isFolded = true;
 
+                        table.lastActivity = Date.now();
                         setNextPlayerIdx(table.id);
                     }
Index: pages/api/roulette/index.js
===================================================================
--- pages/api/roulette/index.js	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ pages/api/roulette/index.js	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -2,4 +2,20 @@
 
 require('dotenv').config();
+
+let samplePlayer = {
+    session_id: '',
+    name: '',
+    whichBets: [],
+    coinPlaced: {
+        x: -1,
+        y: -1,                
+    },
+    credits: -1,
+    betAmount: 0,
+    wonAmount: 0,
+    status: '_1_',
+    outcome: 'none',
+    gotResults: false,
+}
 
 function getWinningBets(magicNumber) {
@@ -36,6 +52,4 @@
 
 function updateGameWithWinners() {
-    const winningBets = getWinningBets(magicNumber);
-
     for (let i = 0; i < game.players.length; i++) {
         const player = game.players[i];
@@ -43,5 +57,5 @@
         let playerWon = false;
         player.whichBets.forEach(bet => {
-            if (winningBets.indexOf(bet) !== -1) {
+            if (game.winningBets.indexOf(bet) !== -1) {
                 playerWon = true;
             }
@@ -49,18 +63,36 @@
 
         if (playerWon) {
-            game.players[i].outcome = 'won';
+            player.outcome = 'won';
         }
         else {
-            game.players[i].outcome = 'lost';
-        }
-    }
-}
-
-function resetPlayers() {
+            player.outcome = 'lost';
+        }
+
+        player.wonAmount = calculateWinnings(player);
+
+        axios.get(`${process.env.HOME_URL}/api/postgre/?action=add_credits&session_id=${player.session_id}&credits=${player.wonAmount}&game=roulette&outcome=${player.outcome}`).then(postgreRes => {
+            if (postgreRes.data?.success) {
+                player.credits = postgreRes.data?.credits;
+            }
+        });
+    }
+}
+
+function resetGame() {
+    game.magicNumber = -1;
+    game.winningBets = [];
+    game.status = '_1_ongoing_timer';
+
     game.players.forEach(player => {
         player.whichBets = [];
         player.betAmount = 0;
+        player.wonAmount = 0;
+        player.coinPlaced = {
+            x: -1,
+            y: -1,                
+        },
         player.outcome = 'none';
         player.status = '_1_no_placed_bet';
+        player.gotResults = false;
     })
 }
@@ -74,5 +106,5 @@
     if (bets[0] === 'Even' || bets[0] === 'Odd') return 2 * bet;
     else if (bets[0] === 'Red' || bets[0] === 'Black') return 2 * bet;
-    else if (bets[0].contains('Remainder')) return 3 * bet;
+    else if (bets[0].includes('Remainder')) return 3 * bet;
     else if (bets[0] === '1-12' || bets[0] === '13-24' || bets[0] === '25-36') return 3 * bet;
     else if (bets[0] === '1-18' || bets[0] === '19-36') return 2 * bet;
@@ -84,9 +116,4 @@
 }
 
-const COUNTDOWN_FROM = 30;
-const WAIT_BEFORE = 20;
-
-let magicNumber = -1;
-
 (function() {
     setInterval(() => {
@@ -95,15 +122,18 @@
         // WAIT_BEFORE seconds is the time allocated for spinning the wheel and seeing the results.
         if (game.timeToStart == 0) {
-            game.timeToStart = COUNTDOWN_FROM + WAIT_BEFORE;
+            game.timeToStart = game.COUNTDOWN_FROM + game.WAIT_BEFORE;
+
+            game.magicNumber = Math.floor(Math.random() * 37);
+            game.winningBets = getWinningBets(game.magicNumber);
+            
+            setTimeout(() => {
+                updateGameWithWinners();
+            }, 6000)
         }
         else if (game.timeToStart == 10) {
-            magicNumber = Math.floor(Math.random() * 37);
             game.status = '_2_spinning';
         }
-        else if (game.timeToStart == COUNTDOWN_FROM) {
-            game.status = '_1_ongoing_timer';
-        }
-        else if (game.timeToStart == COUNTDOWN_FROM + 5) {
-            resetPlayers();
+        else if (game.timeToStart == game.COUNTDOWN_FROM) {
+            resetGame();
         }
 
@@ -113,6 +143,10 @@
 let game = {
     status: '_1_ongoing_timer',     // statuses: _1_ongoing_timer, _2_spinning,
-    timeToStart: COUNTDOWN_FROM,    // in seconds
-    players: [] ,                   // example player -> { session_id, name, whichBet, betAmount, status, outcome }  // statuses: _1_no_placed_bet, _2_placed_bet
+    timeToStart: 30,                // in seconds
+    COUNTDOWN_FROM: 30,
+    WAIT_BEFORE: 20,
+    magicNumber: -1,
+    winningBets: [],
+    players: [],
 }
 
@@ -123,8 +157,40 @@
             name: name,
             whichBets: [],
+            coinPlaced: {
+                x: -1,
+                y: -1,                
+            },
+            credits: -1,
             betAmount: 0,
+            wonAmount: 0,
             status: '_1_no_placed_bet',
             outcome: 'none',
+            gotResults: false,
         })
+    }
+}
+
+export function getPlayer(session_id) {
+    const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
+
+    if (playerIdx !== -1) {
+        return {
+            success: true,
+            player: game.players[playerIdx],
+        }
+    }
+
+    return {
+        success: false,
+        player: {...samplePlayer},
+    };
+}
+
+export function restrictGameInfo() {
+    const restrictedPlayers = game.players.map(player=>({...player, session_id: ""}))
+
+    return {
+        ...game,
+        players: restrictedPlayers,
     }
 }
@@ -140,66 +206,4 @@
         /**
          * /---------------------- GET ----------------------/
-         * Return to the user info for starting a new game.
-         * @action reset_game
-         * @param session_id
-         */
-        if (req.query.action === 'reset_game' && req.query?.session_id) {
-            const session_id = req.query.session_id;
-            const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
-
-            if (playerIdx !== -1) {
-                res.json({
-                    success: true,
-                    game: game,
-                })
-            }
-            else {
-                res.json({
-                    success: false,
-                })
-            }
-        }
-
-        /**
-         * /---------------------- GET ----------------------/
-         * Timer done on client side.
-         * @action timer_done
-         * @param session_id
-         */
-         if (req.query.action === 'timer_done' && req.query?.session_id) {
-            const session_id = req.query.session_id;
-            const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
-
-            if (playerIdx !== -1 && game.status.substr(1, 1) === '2') {
-                updateGameWithWinners();
-
-                const playerWinnings = calculateWinnings(game.players[playerIdx]);
-
-                axios.get(`${process.env.HOME_URL}/api/postgre/?action=add_credits&session_id=${session_id}&credits=${playerWinnings}&game=roulette&outcome=${game.players[playerIdx].outcome}`).then(postgreRes => {
-                    if (postgreRes.data?.success) {
-                        res.json({
-                            success: true,
-                            game: game,
-                            magicNumber: magicNumber,
-                            winningBets: getWinningBets(magicNumber),
-                            credits: postgreRes.data?.credits,
-                        })
-                    }
-                    else {
-                        res.json({
-                            success: false,
-                        })
-                    }
-                });
-            }
-            else {
-                res.json({
-                    success: false,
-                })
-            }
-        }
-
-        /**
-         * /---------------------- GET ----------------------/
          * Place a bet.
          * @action place_bet
@@ -207,29 +211,65 @@
          * @param betAmount
          * @param whichBets
+         * @param coinPlacedX
+         * @param coinPlacedY
          */
-        if (req.query.action === 'place_bet' && req.query?.session_id && req.query?.betAmount && req.query?.whichBets) {
+        if (req.query.action === 'place_bet' && req.query?.session_id && req.query?.betAmount && req.query?.whichBets && req.query?.coinPlacedX && req.query?.coinPlacedY) {
             const session_id = req.query.session_id;
-            const playerIdx = game.players.map(e=>e.session_id).indexOf(session_id);
-
-            if (playerIdx !== -1 && game.status.substr(1, 1) === '1' && game.players[playerIdx].status.substr(1, 1) === '1') {
-                game.players[playerIdx].betAmount = parseInt(req.query.betAmount);
-                game.players[playerIdx].whichBets = req.query.whichBets.split(',');
-                game.players[playerIdx].status = '_2_placed_bet';
-    
+
+            const { success, player } = getPlayer(session_id);
+
+            if (success && game.status.includes('_1_') && player.status.includes('_1_')) {
                 axios.get(`${process.env.HOME_URL}/api/postgre?action=take_credits&session_id=${session_id}&credits=${req.query.betAmount}`).then(postgreRes => {
                     if (postgreRes.data?.success) {
-                        res.json({
-                            success: true,
-                            game: game,
-                            credits: postgreRes.data?.credits,
-                        })
-                    }
-                    else {
-                        res.json({
-                            success: false,
-                        })
+                        player.betAmount = parseInt(req.query.betAmount);
+                        player.whichBets = req.query.whichBets.split(',');
+                        player.status = '_2_placed_bet';
+                        player.coinPlaced = {
+                            x: req.query.coinPlacedX,
+                            y: req.query.coinPlacedY,
+                        },
+                        player.credits = postgreRes.data?.credits;
                     }
                 });
             }
+
+            res.end();
+        }
+
+        /**
+         * /---------------------- GET ----------------------/
+         * Updates the state periodically
+         * @action update_state
+         * @param session_id
+         */
+         if (req.query.action === 'update_state' && req.query?.session_id) {
+            const session_id = req.query.session_id;
+
+            const { success, player } = getPlayer(session_id);
+
+            let extraAction = "";
+            let magicNumber = -1;
+            let winningBets = [];
+
+            if (success) {
+                if (game.timeToStart > game.COUNTDOWN_FROM && !player.gotResults) {
+                    extraAction = "spin_wheel";
+                    magicNumber = game.magicNumber;
+                    winningBets = game.winningBets;
+
+                    player.gotResults = true;
+                }
+            }
+
+            res.json({
+                success: true,
+                rouletteGame: {
+                    game: restrictGameInfo(),
+                    player: player,
+                },
+                extraAction: extraAction,
+                magicNumber: magicNumber,
+                winningBets: winningBets,
+            })
         }
 
Index: redux/reducers/playerSlice.js
===================================================================
--- redux/reducers/playerSlice.js	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ redux/reducers/playerSlice.js	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -16,7 +16,28 @@
     },
     rouletteGame: {
-        status: '',
-        timeToStart: 0,
-        players: [],
+        game: {
+            status: '_1_ongoing_timer',
+            timeToStart: 30,
+            COUNTDOWN_FROM: 30,
+            WAIT_BEFORE: 20,
+            magicNumber: -1,
+            winningBets: [],
+            players: [],
+        },
+        player: {
+            session_id: '',
+            name: '',
+            whichBets: [],
+            coinPlaced: {
+                x: -1,
+                y: -1,
+            },
+            credits: -1,
+            betAmount: 0,
+            wonAmount: 0,
+            status: '_1_',
+            outcome: 'none',
+            gotResults: false,
+        },
     },
     pokerGame: {
Index: redux/reducers/styleSlice.js
===================================================================
--- redux/reducers/styleSlice.js	(revision 95ce58bf1e6a160d56dbf39a83e4ed466a89d982)
+++ redux/reducers/styleSlice.js	(revision d0ef2592564bcd6d3691722843df4fc6a7397109)
@@ -83,5 +83,4 @@
     // roulette
     roulette: {
-        COUNTDOWN_FROM: 30,
         displays: {
             betModal: false,
@@ -94,8 +93,7 @@
         whichBets: [],
         coinPlaced: {
-            x: 0,
-            y: 0,
-        },
-        showCoin: false,
+            x: -1,
+            y: -1,
+        }
     },
     // poker
