diff --git a/src/client/GameController.cpp b/src/client/GameController.cpp
index 47de076fb7c732377754dd05d48487b0514732ee..24381f3aca68307ad8ce337dfc337553ea05fdd2 100644
--- a/src/client/GameController.cpp
+++ b/src/client/GameController.cpp
@@ -12,7 +12,6 @@
 // initialize static members
 GameWindow* GameController::_gameWindow = nullptr;
 ConnectionPanel* GameController::_connectionPanel = nullptr;
-MainGamePanel* GameController::_mainGamePanel = nullptr;
 MainGamePanelWizard* GameController::_mainGamePanelWizard = nullptr;
 TrickEstimationPanel* GameController::_trickEstimationPanel = nullptr;
 
@@ -28,13 +27,13 @@ void GameController::init(GameWindow* gameWindow) {
 
     // Set up main panels
     GameController::_connectionPanel = new ConnectionPanel(gameWindow);
-    GameController::_mainGamePanel = new MainGamePanel(gameWindow);
+    //GameController::_mainGamePanel = new MainGamePanel(gameWindow);
     GameController::_mainGamePanelWizard = new MainGamePanelWizard(gameWindow);
     GameController::_trickEstimationPanel = new TrickEstimationPanel(gameWindow);
 
     // Hide all panels
     GameController::_connectionPanel->Show(false);
-    GameController::_mainGamePanel->Show(false);
+    //GameController::_mainGamePanel->Show(false);
     GameController::_mainGamePanelWizard->Show(false);
     GameController::_trickEstimationPanel->Show(false);
 
@@ -76,7 +75,7 @@ void GameController::connectToServer() {
         GameController::showError("Connection error", "Invalid port");
         return;
     }
-    uint16_t port = (uint16_t) portAsLong;
+    auto port = static_cast<uint16_t>(portAsLong);
 
     // convert player name from wxString to std::string
     std::string playerName = inputPlayerName.ToStdString();
@@ -102,40 +101,44 @@ void GameController::updateGameState(game_state* newGameState) {
 
     if(oldGameState != nullptr) {
 
-        // check if a new round started, and display message accordingly
-        if(oldGameState->get_round_number() >= 0 && oldGameState->get_round_number() < newGameState->get_round_number()) {
-            /*
-            GameController::showStatus("Round " + std::to_string(newGameState->get_round_number()));
-            if(oldGameState->get_round_number() > 0)
+        if(GameController::_currentGameState->is_finished()) {
+            GameController::showGameOverMessage();
+        }
+        else if(GameController::_currentGameState->is_started())
+        {
+            int round_number = _currentGameState->get_round_number();
+
+            if(round_number != oldGameState->get_round_number())
+            {
+                // new round has started
+                showNewRoundMessage(oldGameState, newGameState);
+                showStatus("Round " + std::to_string(newGameState->get_round_number()));
+            }
+
+            // estimation phase
+            if(GameController::_currentGameState->is_estimation_phase()) {
+                GameController::_gameWindow->showPanel(GameController::_trickEstimationPanel);
+                GameController::_trickEstimationPanel->buildGameState(GameController::_currentGameState, GameController::_me);
+                GameController::estimateTrick();
+            }
+
+            // end of trick
+            if(_currentGameState->get_trick_number() != oldGameState->get_trick_number())
             {
-                GameController::showNewRoundMessage(oldGameState, newGameState);
+                showTrickOverMessage();
             }
-            GameController::_gameWindow->showPanel(GameController::_trickEstimationPanel);
-            GameController::_trickEstimationPanel->buildGameState(GameController::_currentGameState, GameController::_me);
-            GameController::estimateTrick();
-            */
         }
 
         // delete the old game state, we don't need it anymore
         delete oldGameState;
     }
 
-    if(GameController::_currentGameState->is_finished()) {
-        GameController::showGameOverMessage();
-    }
 
-    /*
-    GameController::_gameWindow->showPanel(GameController::_mainGamePanelWizard);
-    GameController::_mainGamePanelWizard->buildGameState(GameController::_currentGameState, GameController::_me);
-    */
 
-    /*
     // make sure we are showing the main game panel in the window (if we are already showing it, nothing will happen)
-    GameController::_gameWindow->showPanel(GameController::_mainGamePanel);
+    GameController::_gameWindow->showPanel(GameController::_mainGamePanelWizard);
+    GameController::_mainGamePanelWizard->buildGameState(GameController::_currentGameState, GameController::_me);
 
-    // command the main game panel to rebuild itself, based on the new game state
-    GameController::_mainGamePanel->buildGameState(GameController::_currentGameState, GameController::_me);
-    */
 }
 
 
@@ -176,11 +179,12 @@ void GameController::estimateTrick()
     int trickEstimateInt;
     if (trickEstimate.ToLong(&trickEstimateValue)) {
         trickEstimateInt = static_cast<int>(trickEstimateValue);
+        GameController::estimateTricks(trickEstimateInt);
     } else {
         // Handle the error: the string was not a valid integer
         GameController::showError("Invalid input!"," Please enter a valid number for the trick estimate.");
     }
-    GameController::estimateTricks(trickEstimateInt);
+
     /*
     std::string title = "How many tricks?";
     std::string message = "Enter estimated number of tricks";
@@ -218,17 +222,17 @@ void GameController::showNewRoundMessage(game_state* oldGameState, game_state* n
     std::string title = "Round Completed";
     std::string message = "The players gained the following minus points:\n";
     std::string buttonLabel = "Start next round";
-    /*
+
     // add the point differences of all players to the messages
     for(int i = 0; i < oldGameState->get_players().size(); i++) {
 
         player* oldPlayerState = oldGameState->get_players().at(i);
         player* newPlayerState = newGameState->get_players().at(i);
 
-        int scoreDelta = newPlayerState->get_score() - oldPlayerState->get_score();
+        int scoreDelta = newPlayerState->get_scores().back()->get_value() - oldPlayerState->get_scores().back()->get_value();
         std::string scoreText = std::to_string(scoreDelta);
         if(scoreDelta > 0) {
-            scoreText = "+" + scoreText;
+            scoreText.append(scoreText);
         }
 
         std::string playerName = newPlayerState->get_player_name();
@@ -238,11 +242,24 @@ void GameController::showNewRoundMessage(game_state* oldGameState, game_state* n
         message += "\n" + playerName + ":     " + scoreText;
     }
 
+    //TODO: what to do with these? Is message just going away or do you have to press okay
     //wxMessageDialog dialogBox = wxMessageDialog(nullptr, message, title, wxICON_NONE);
     //dialogBox.SetOKLabel(wxMessageDialog::ButtonLabel(buttonLabel));
     //dialogBox.ShowModal();
-    */
-    ScoreDialog* dialog = new ScoreDialog(GameController::_gameWindow, title, message);
+
+    auto* dialog = new ScoreDialog(GameController::_gameWindow, title, message);
+    dialog->ShowModal();
+}
+
+void GameController::showTrickOverMessage()
+{
+    std::string title = "Trick Completed";
+    std::string message = " won the trick\n";
+
+    player* winner =  _currentGameState->get_trick_starting_player();
+    message = winner->get_player_name() + message;
+
+    auto dialog = new ScoreDialog(GameController::_gameWindow, title, message);
     dialog->ShowModal();
 }
 
@@ -251,19 +268,19 @@ void GameController::showGameOverMessage() {
     std::string title = "Game Over!";
     std::string message = "Final score:\n";
     std::string buttonLabel = "Close Game";
-    /*
+
     // TODO: change logic to determine winner because now we have vector of scores
     // sort players by score
     std::vector<player*> players = GameController::_currentGameState->get_players();
     std::sort(players.begin(), players.end(), [](const player* a, const player* b) -> bool {
-        return a->get_score() < b->get_score();
+        return a->get_scores().back()->get_value() < b->get_scores().back()->get_value();
     });
 
     // list all players
     for(int i = 0; i < players.size(); i++) {
 
         player* playerState = players.at(i);
-        std::string scoreText = std::to_string(playerState->get_score());
+        std::string scoreText = std::to_string(playerState->get_scores().back()->get_value());
 
         // first entry is the winner
         std::string winnerText = "";
@@ -281,7 +298,7 @@ void GameController::showGameOverMessage() {
         }
         message += "\n" + playerName + ":     " + scoreText + winnerText;
     }
-    */
+
     wxMessageDialog dialogBox = wxMessageDialog(nullptr, message, title, wxICON_NONE);
     dialogBox.SetOKLabel(wxMessageDialog::ButtonLabel(buttonLabel));
     int buttonClicked = dialogBox.ShowModal();
diff --git a/src/client/GameController.h b/src/client/GameController.h
index 8290722f3f6b43e1bed37577d2d43bc139c1d589..a484782e60264481e672975455b9b5deaba34478 100644
--- a/src/client/GameController.h
+++ b/src/client/GameController.h
@@ -28,13 +28,13 @@ public:
     static void showError(const std::string& title, const std::string& message);
     static void showStatus(const std::string& message);
     static void showNewRoundMessage(game_state* oldGameState, game_state* newGameState);
+    static void showTrickOverMessage();
     static void showGameOverMessage();
-    static void showTrickEstimationPanel(int roundNumber);
 
 private:
     static GameWindow* _gameWindow;
     static ConnectionPanel* _connectionPanel;
-    static MainGamePanel* _mainGamePanel;
+    //static MainGamePanel* _mainGamePanel;
     static MainGamePanelWizard* _mainGamePanelWizard;
     static TrickEstimationPanel* _trickEstimationPanel;
 
diff --git a/src/client/panels/MainGamePanelWizard.cpp b/src/client/panels/MainGamePanelWizard.cpp
index 0c792dee748c367aa3fac858fcfa7206f2b7a8b8..ad19b432ed8a67933e935d7ed94a24592505e61f 100644
--- a/src/client/panels/MainGamePanelWizard.cpp
+++ b/src/client/panels/MainGamePanelWizard.cpp
@@ -332,7 +332,7 @@ void MainGamePanelWizard::buildThisPlayer(wxGridBagSizer* sizer, game_state* gam
 
                 ImagePanel *cardButton = new ImagePanel(cardPanel, cardFile, wxBITMAP_TYPE_ANY, wxDefaultPosition, scaledCardSize);
 
-                if (gameState->get_current_player() == me) {
+                if (gameState->get_current_player() == me && gameState->is_estimation_phase() == false) {
                     cardButton->SetToolTip("Play card");
                     cardButton->SetCursor(wxCursor(wxCURSOR_HAND));
                     cardButton->Bind(wxEVT_LEFT_UP, [handCard](wxMouseEvent& event) {
diff --git a/src/client/panels/MainGamePanelWizard.h b/src/client/panels/MainGamePanelWizard.h
index 3974255f9405bbd20cf22727113076b9d812f55d..89ba7489c65a172f6b64853d28b5793abba522ab 100644
--- a/src/client/panels/MainGamePanelWizard.h
+++ b/src/client/panels/MainGamePanelWizard.h
@@ -13,7 +13,7 @@ public:
     void buildGameState(game_state* gameState, player* me);
 
 private:
-    void  buildThisPlayer(wxGridBagSizer* sizer, game_state* gameState, player* me);
+    void buildThisPlayer(wxGridBagSizer* sizer, game_state* gameState, player* me);
     void buildTurnIndicator(wxGridBagSizer* sizer, game_state* gameState, player* me);
     void buildOtherPlayers(wxGridBagSizer* sizer, game_state* gameState, player *me, int myPosition);
 
diff --git a/src/common/game_state/game_state.cpp b/src/common/game_state/game_state.cpp
index 9533afae9306af81fb7841e23e8864ec51664e90..c064e19eb47c49a8db01d159d0e1957346ac758b 100644
--- a/src/common/game_state/game_state.cpp
+++ b/src/common/game_state/game_state.cpp
@@ -98,6 +98,22 @@ player* game_state::get_current_player() const {
     return _players[_current_player_idx->get_value()];
 }
 
+player* game_state::get_trick_starting_player() const
+{
+    if(_trick_starting_player_idx == nullptr || _players.empty()) {
+        return nullptr;
+    }
+    return _players[_trick_starting_player_idx->get_value()];
+}
+
+player* game_state::get_starting_player() const
+{
+    if(_starting_player_idx == nullptr || _players.empty()) {
+        return nullptr;
+    }
+    return _players[_starting_player_idx->get_value()];
+}
+
 trick* game_state::get_trick() const
 {
     return _trick;
@@ -116,6 +132,11 @@ bool game_state::is_finished() const {
     return _is_finished->get_value();
 }
 
+bool game_state::is_estimation_phase() const
+{
+    return _is_estimation_phase->get_value();
+}
+
 int game_state::get_round_number() const {
     return _round_number->get_value();
 }
diff --git a/src/common/game_state/game_state.h b/src/common/game_state/game_state.h
index e6026cd0eb3530b9a104b03d10d727f9ed728e8a..d70ff53da816fad00ea74078c62a553a8c2e1fe1 100644
--- a/src/common/game_state/game_state.h
+++ b/src/common/game_state/game_state.h
@@ -75,6 +75,7 @@ public:
     bool is_full() const;
     bool is_started() const;
     bool is_finished() const;
+    bool is_estimation_phase() const;
     bool is_player_in_game(player* player) const;
     std::vector<player*>& get_players();
     int get_round_number() const;
@@ -83,6 +84,8 @@ public:
     int get_max_round_number() const;
     int get_trump_color() const;
     player* get_current_player() const;
+    player* get_trick_starting_player() const;
+    player* get_starting_player() const;
     trick* get_trick() const;