                 return GameState(activePlayer: nextPlayer, board: updatedPositions, complete: completed)
             })
             .startWith(defaultGameState)
+            .share()
         
         // MARK: Winner
         let winner$ = gameState$
             .flatMap { Observable.of(findWinner(board: $0.board)) }
             .filter { $0.type != PlayerType.none }
             .debug("found a winner!")
+            .share()
         
         // MARK: Tied board
         // this could also be the onComplete of the render? because at that point, all tap observables have completed
         let tie$ = gameState$
             .flatMap { Observable.of(checkTiedBoard(board: $0.board)) }
+            .share()
 
         
         // MARK: Player Activity Indicators

            .addDisposableTo(self.disposeBag)
        
        // MARK:
        let gameEnd$ = Observable.combineLatest(winner$, tie$)
            .subscribe(
                onNext: { x in
                    print("game over!")

            .takeUntil(Observable.combineLatest(winner$, tie$))
            .subscribe()
        
        // MARK: Scoreboard
        let scoreBoard$ = Observable.merge(winner$, tie$)
            .filter { $0.type != PlayerType.none }
            .scan(defaultScoreboard, accumulator: { (prevScoreboard: Scoreboard, player: Player) -> Scoreboard in
                var updatedScoreboard = Scoreboard()
                updatedScoreboard.update(with: player)
                return updatedScoreboard
            })
            .startWith(defaultScoreboard)
        
        _ = scoreBoard$
            .map { String($0.xWinCount) }
