diff --git a/core/src/cz/nic/tablexia/TablexiaSettings.java b/core/src/cz/nic/tablexia/TablexiaSettings.java
index 1a0a5ed5ddb549c79f03a0179b286ce5420e414a..b48ae93c41f77e4e5787d6693275b4e1b01fd25f 100644
--- a/core/src/cz/nic/tablexia/TablexiaSettings.java
+++ b/core/src/cz/nic/tablexia/TablexiaSettings.java
@@ -15,8 +15,6 @@ import java.util.List;
 import java.util.Locale;
 
 import cz.nic.tablexia.bus.ApplicationBus;
-import cz.nic.tablexia.game.GameDefinition;
-import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.model.UserDAO;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
@@ -230,19 +228,6 @@ public class TablexiaSettings {
         return BUILD_TYPE;
     }
 
-    public void setGameDifficulty(GameDefinition gameDefinition, GameDifficulty gameDifficulty) {
-        preferences.putString(getGameDifficultyPreferencesKey(gameDefinition), gameDifficulty.name());
-        preferences.flush();
-    }
-
-    public GameDifficulty getGameDifficulty(GameDefinition gameDefinition) {
-        return GameDifficulty.valueOf(GameDifficulty.class, preferences.getString(getGameDifficultyPreferencesKey(gameDefinition), GameDifficulty.DEFAULT_DIFFICULTY.name()));
-    }
-
-    private String getGameDifficultyPreferencesKey(GameDefinition gameDefinition) {
-        return "GAME_DIFFICULTY_" + gameDefinition.name() + "_" + getSelectedUser().getId();
-    }
-
     public static Color getDefaultBackgroundColor() {
         return DEFAULT_BACKGROUND_COLOR;
     }
diff --git a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
index 7eded19ddb9625781babfd1b88f79564f81f320e..f4820bb5c8e2a9a6a0600e753264dc3100d799ec 100644
--- a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
+++ b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
@@ -51,6 +51,7 @@ import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.menu.AbstractMenu;
 import cz.nic.tablexia.menu.main.MainMenu;
 import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.model.UserDifficultySettingsDAO;
 import cz.nic.tablexia.model.game.GameDAO;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuScreen;
@@ -428,7 +429,7 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
             // create new
             random = TablexiaSettings.GAMES_RANDOM_SEED == null ? new TablexiaRandom() : new TablexiaRandom(TablexiaSettings.GAMES_RANDOM_SEED);
             GameDefinition gameDefinition = GameDefinition.getGameDefinitionForClass(AbstractTablexiaGame.this.getClass());
-            GameDifficulty gameDifficulty = gameDefinition.hasTutorial() && UserDAO.isTutorialForGameDefinition(gameDefinition, getSelectedUser()) ? GameDifficulty.TUTORIAL : TablexiaSettings.getInstance().getGameDifficulty(gameDefinition);
+            GameDifficulty gameDifficulty = gameDefinition.hasTutorial() && UserDAO.isTutorialForGameDefinition(gameDefinition, getSelectedUser()) ? GameDifficulty.TUTORIAL : getGameDifficulty();
             game = GameDAO.createGame(getSelectedUser(), gameDifficulty, gameDefinition, random);
             Log.info(getClass(), "[DB] Created new GAME object: " + game);
         } else {
@@ -482,11 +483,13 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
         debugEndGameButton.setInputListener(new ClickListener() {
             @Override
             public void clicked(InputEvent event, float x, float y) {
-                forceGameEnd(GameResult.THREE_STAR);
+                if(getGamePhase() == GamePhase.STARTED) {
+                    forceGameEnd(GameResult.THREE_STAR);
+                    debugEndGameButton.setDisabled();
+                }
             }
         });
         debugEndGameButton.setEnabled();
-        debugEndGameButton.useOnce(true);
         debugEndGameButton.setVisible(true);
     }
 
@@ -651,7 +654,7 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
     }
 
     public GameDifficulty getGameDifficulty() {
-        return game == null ? TablexiaSettings.getInstance().getGameDifficulty(GameDefinition.getGameDefinitionForClass(AbstractTablexiaGame.this.getClass())) : GameDifficulty.getGameDifficultyForDifficultyNumber(game.getGameDifficulty());
+        return game == null ? UserDifficultySettingsDAO.getUserSettingsByGame(getSelectedUser().getId(), GameDefinition.getGameDefinitionForClass(AbstractTablexiaGame.this.getClass()).getGameNumber()) : GameDifficulty.getGameDifficultyForDifficultyNumber(game.getGameDifficulty());
     }
 
     protected Game getGame() {
@@ -1393,14 +1396,20 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
      * Thread blocking method which waits for all GameScores to be set and ready.
      */
     public void waitForActualGameScore() {
+        int waitTime    = 50; //50ms
+        int waitCounter = 0;
+
         while(!GameDAO.isGameScoreActual()) {
             try {
-                Log.info(getClass(), "Waiting for 50ms for GameDAO to set all GameScores...");
-                Thread.sleep(50);
+                Thread.sleep(waitTime);
+                waitCounter++;
             } catch (InterruptedException e) {
                 Thread.yield();
             }
         }
+
+        if(waitCounter > 0)
+            Log.info(getClass(), "Game has been waiting for " + (waitCounter * waitTime) + " ms for GameDAO to set all game scores.");
     }
 
     public String getGameScoreString(String key, String nullValue) {
diff --git a/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java b/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java
index ea45a8bf39a9a548cdeee2521a338986a213f35b..48c30159beb4faf821508d13d9ad53c6a2c4db25 100644
--- a/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java
+++ b/core/src/cz/nic/tablexia/game/games/in_the_darkness/InTheDarknessGame.java
@@ -920,6 +920,8 @@ public class InTheDarknessGame extends AbstractTablexiaGame<List<MapWidget>> imp
             default: errors = GameResultResolver.ERROR_COUNT_THREE_STARS - 1; break;
         }
         GameDAO.setGameScore(getGame(), SCORE_KEY_ERRORS_COUNT, Integer.toString(errors));
+        waitForActualGameScore();
+
         endGame();
         showGameResultDialog();
     }
diff --git a/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java b/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java
index aa5d20238d42deaaa0183ee590cdfe4d0a957111..a3ce6d2cfb093776e8ff1bf1128376d96307b300 100644
--- a/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java
+++ b/core/src/cz/nic/tablexia/game/games/pursuit/PursuitGame.java
@@ -572,6 +572,7 @@ public class PursuitGame extends AbstractTablexiaGame<int[][]> {
         long duration = GameRulesHelper.getDurationForStars(GameDifficulty.getByGame(getGame()), result.getStarCount());
         GameDAO.startGame(getGame(), TimeUtils.millis() - duration);
         GameDAO.setGameScore(getGame(), SCORE_KEY_MOVE_COUNT, Integer.toString(30));
+        waitForActualGameScore();
 
         endGame();
         gameFinished.set(true);
diff --git a/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java b/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java
index e3417fba8f155b71f59d2ae2790f0751ceb72f0b..a2fd46ef4407e5587cd87f3f95cb40af3230bada 100644
--- a/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java
+++ b/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java
@@ -415,6 +415,8 @@ public class RobberyGame extends AbstractTablexiaGame<GameRule> {
 		GameDAO.setGameScore(getGame(), SCORE_KEY_ESCAPED_THIEVES , Integer.toString(1));
 		GameDAO.setGameScore(getGame(), SCORE_KEY_INNOCENCE_PERSON, Integer.toString(1));
 
+		waitForActualGameScore();
+
 		this.actualCreatureNumber = CREATURES_COUNT;
 	}
 }
diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java b/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java
index f16ccf6637bc8f1651defa626918cadf5d6b21c0..d6ca8fba8aa4a61aab42a19f5a13977f9d410b9a 100644
--- a/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java
+++ b/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java
@@ -493,6 +493,8 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> {
         }
 
         GameDAO.setGameScore(getGame(), Properties.SCORE_TOTAL, Integer.toString(totalScore));
+        waitForActualGameScore();
+
         finishGame();
     }
 }
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
index 0e84efd9fe24e1338cad5721e33c82e8efb97fcd..a7716c2d75123c2ea616a0254a2214cd0b458296 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
@@ -34,8 +34,8 @@ import cz.nic.tablexia.screen.profile.ProfileScreen;
 import cz.nic.tablexia.util.MusicUtil;
 import cz.nic.tablexia.util.ui.ClickListenerWithSound;
 import cz.nic.tablexia.util.ui.Switch;
-import cz.nic.tablexia.util.ui.TablexiaProgressBar;
 import cz.nic.tablexia.util.ui.TablexiaLabel;
+import cz.nic.tablexia.util.ui.TablexiaProgressBar;
 import cz.nic.tablexia.util.ui.button.TablexiaButton;
 
 /**
@@ -105,7 +105,6 @@ public class GameMenuPage extends MenuPage {
     private Actor buttonDifficultyEasy, buttonDifficultyMedium, buttonDifficultyHard;
 
     private Stack diffStack;
-    private GameDifficulty gameDifficulty = GameDifficulty.EASY;
     private Switch.DragSwitchListener dragSwitchListener;
 
     //hack to keep paralax layers out of picture before scrolled for first time
@@ -141,6 +140,8 @@ public class GameMenuPage extends MenuPage {
     private TextureRegion midLayer;
     private TextureRegion foregroundLayer;
 
+    boolean updateGameDifficultyInDB = true;
+
     public GameMenuPage(GameMenuScreen screen, GameDefinition game) {
         super(screen);
         this.game = game;
@@ -359,7 +360,7 @@ public class GameMenuPage extends MenuPage {
             @Override
             public void clicked(InputEvent event, float x, float y) {
                 super.clicked(event, x, y);
-                dragSwitchListener.switchToStep(GameDifficulty.EASY.getDifficultyNumber() - 1);
+                updateDifficultySeekBar(GameDifficulty.EASY);
             }
         });
 
@@ -367,7 +368,7 @@ public class GameMenuPage extends MenuPage {
             @Override
             public void clicked(InputEvent event, float x, float y) {
                 super.clicked(event, x, y);
-                dragSwitchListener.switchToStep(GameDifficulty.MEDIUM.getDifficultyNumber() - 1);
+                updateDifficultySeekBar(GameDifficulty.MEDIUM);
             }
         });
 
@@ -375,7 +376,7 @@ public class GameMenuPage extends MenuPage {
             @Override
             public void clicked(InputEvent event, float x, float y) {
                 super.clicked(event, x, y);
-                dragSwitchListener.switchToStep(GameDifficulty.HARD.getDifficultyNumber() - 1);
+                updateDifficultySeekBar(GameDifficulty.HARD);
             }
         });
 
@@ -420,15 +421,30 @@ public class GameMenuPage extends MenuPage {
         dragSwitchListener.setSwitchSelectedListener(new Switch.DragSwitchListener.SwitchSelectedListener() {
             @Override
             public void stepSelected(int step) {
-                difficultyChanged(GameDifficulty.getVisibleGameDifficultyList().get(step));
+                if (updateGameDifficultyInDB) {
+                    UserDifficultySettingsDAO.saveSettingsForUser(TablexiaSettings.getInstance().getSelectedUser().getId(), game.getGameNumber(), GameDifficulty.getVisibleGameDifficultyList().get(step).getDifficultyNumber());
+                }
             }
         });
-		gameDifficulty = UserDifficultySettingsDAO.getUserSettingsByGame(TablexiaSettings.getInstance().getSelectedUser().getId(), game.getGameNumber());
-        dragSwitchListener.switchToStep(gameDifficulty.getDifficultyNumber() - 1);
+		updateGameDifficultyFromDB();
 
         stepSoundsEnabled = true;
     }
 
+    private void updateGameDifficultyFromDB() {
+        updateDifficultySeekBar(UserDifficultySettingsDAO.getUserSettingsByGame(TablexiaSettings.getInstance().getSelectedUser().getId(), game.getGameNumber()), false);
+    }
+
+    private void updateDifficultySeekBar(GameDifficulty gameDifficulty) {
+        updateDifficultySeekBar(gameDifficulty, true);
+    }
+
+    private void updateDifficultySeekBar(GameDifficulty gameDifficulty, boolean updateGameDifficultyInDB) {
+        this.updateGameDifficultyInDB = updateGameDifficultyInDB;
+        dragSwitchListener.switchToStep(gameDifficulty.getDifficultyNumber() - 1);
+        this.updateGameDifficultyInDB = true;
+    }
+
     public void prepareGameProgress() {
         this.gameMenuPageProgress = new TablexiaProgressBar(
                 getScreen().getScreenTextureRegion(GameMenuScreen.GameMenuPageDefinition.getResourcePath(game, GameMenuAssets.AssetType.PROGRESSBAR)),
@@ -477,22 +493,6 @@ public class GameMenuPage extends MenuPage {
         return (rankProgress.getCurrXP() - rankProgress.getMinXP()) + Character.toString(PROGRESS_STATUS_SEPARATOR) + (rankProgress.getNextXP() - rankProgress.getMinXP());
     }
 
-    /**
-     * Called when difficulty is changed
-     *
-     * @param difficulty
-     */
-    public void difficultyChanged(final GameDifficulty difficulty) {
-        gameDifficulty = difficulty;
-        TablexiaSettings.getInstance().setGameDifficulty(game, difficulty);
-		new Runnable() {
-			@Override
-			public void run() {
-				UserDifficultySettingsDAO.saveSettingsForUser(TablexiaSettings.getInstance().getSelectedUser().getId(), game.getGameNumber(), difficulty.getDifficultyNumber());
-			}
-		}.run();
-	}
-
     private void playStepSound(GameDifficulty previous, GameDifficulty current) {
         switch (previous) {
             case EASY:
@@ -640,8 +640,7 @@ public class GameMenuPage extends MenuPage {
 			public void run() {
 				if (selectedUserEvent.isUserSelected()) {
                     stepSoundsEnabled = false;
-					gameDifficulty = UserDifficultySettingsDAO.getUserSettingsByGame(TablexiaSettings.getInstance().getSelectedUser().getId(), game.getGameNumber());
-					dragSwitchListener.switchToStep(gameDifficulty.getDifficultyNumber() - 1);
+                    updateGameDifficultyFromDB();
                     stepSoundsEnabled = true;
 
                     updateGameProgress();
diff --git a/core/src/cz/nic/tablexia/util/ui/Switch.java b/core/src/cz/nic/tablexia/util/ui/Switch.java
index 45f035f764fe82a14da2e63107458461ca10526a..3d8522a7b0da7d37c83706313d6846b65d00bf46 100644
--- a/core/src/cz/nic/tablexia/util/ui/Switch.java
+++ b/core/src/cz/nic/tablexia/util/ui/Switch.java
@@ -202,12 +202,12 @@ public class Switch extends Group {
             this.switchSelectedListener = switchSelectedListener;
         }
 
-        public static interface SwitchMovedListener {
-            public void movedToStep(int step);
+        public interface SwitchMovedListener {
+            void movedToStep(int step);
         }
 
-        public static interface SwitchSelectedListener {
-            public void stepSelected(int step);
+        public interface SwitchSelectedListener {
+            void stepSelected(int step);
         }
     }
 }
\ No newline at end of file