protected Set<AbstractStartingHand> simulateHand() {
        Set<AbstractStartingHand> winningHands = new HashSet<AbstractStartingHand>();
        ICardDeck deck = new CardDeckStandard(removedCards);

        FiveCardBoard simulatedBoard;
        List<AbstractStartingHand> filledStartingHands = fillStartingHands(deck);

        if (!gameType.isCommunityCardGame()) {
            simulatedBoard = null;
        } else {
            simulatedBoard = simulateBoard(deck);
        }

        Map<FiveCardPokerHand, List<AbstractStartingHand>> bestFiveCardHandForThisStartingHand = new HashMap<FiveCardPokerHand, List<AbstractStartingHand>>();
        List<FiveCardPokerHand> allBestHands = new ArrayList<FiveCardPokerHand>();

        createBestHands(allBestHands, bestFiveCardHandForThisStartingHand, simulatedBoard, filledStartingHands);

        // Determining the winning hand by sorting the list of best hands.
        Collections.sort(allBestHands, fiveCardPokerHandComparator);

        // Adding the index or indices of the best hand to the set.
        winningHands.addAll(bestFiveCardHandForThisStartingHand.get(allBestHands.get(0)));

        // Checking if other hands tie with this hand, and if so, we add them to the set also
        int nextIndex = 1;
        while (nextIndex < allBestHands.size()
                && fiveCardPokerHandComparator.compare(allBestHands.get(0), allBestHands.get(nextIndex)) == 0) {
            winningHands.addAll(bestFiveCardHandForThisStartingHand.get(allBestHands.get(nextIndex)));
            nextIndex++;
        }

        return winningHands;
    }