private void initNewGame(int carreeSize, Difficulty diff,
			String gameInfoText) {
		/*
		 * Start the SwingWorker
		 */
		JudokuSwingWorker sWork = new JudokuSwingWorker(diff, carreeSize);
		sWork.execute();

		solvingMode = false;

		/*
		 * Switch to btnValidate, if continue was active
		 */
		Container pnlParent = btnContinue.getParent();
		if(pnlParent != null) {
			pnlParent.add(btnValidate);
			pnlParent.remove(btnContinue);
		}
		
		/*
		 * Switch to the game field view
		 */
		switchCenterView("gameField");
		btnHint.setEnabled(true);
		btnReset.setEnabled(true);

		/*
		 * Reset the timers JudokuTimeListener.
		 */
		judokuTimeListener.reset();
		swingTimer.restart();
		txtGameInfo.setText(gameInfoText);
		initializeGameField(pnlGameField, carreeSize);

		/*
		 * Get the Sudoku from the worker thread. If it the thread fails to
		 * complete in appropriate time (2.5s), restart it. This is needed due
		 * to a potential generation time of up to 30 seconds for 16x16 Sudokus.
		 */
		boolean threadSuccess = false;
		int i = 0;
		while (!threadSuccess && i < 3) {
			try {
				sudoku = sWork.get(2500, TimeUnit.MILLISECONDS);
				threadSuccess = true;
			} catch (TimeoutException | InterruptedException
					| ExecutionException ex) {
				/*
				 * Create a new worker thread and start it.
				 */
				sWork = new JudokuSwingWorker(diff, carreeSize);
				sWork.execute();
			}
			i++;
		}
		/*
		 * Fallback: If the thread failed to complete 3 times in a row try to
		 * get it without timing it out.
		 */
		if (!threadSuccess) {
			try {
				sudoku = sWork.get();
			} catch (InterruptedException | ExecutionException ex) {
				txtGameInfo.setText("ERROR");
			}
		}
	}