public JMenuBar getGameMenuBar() {

		// spiel
		JMenu menuFile = new JMenu("Spiel");
		JMenuItem itmNew = new JMenuItem("Neues Spiel starten");
		JMenuItem itmReload = new JMenuItem("Level neu starten");
		JMenuItem itmSave = new JMenuItem("Spiel speichern");
		JMenuItem itmLoad = new JMenuItem("Spiel laden");
		JMenuItem itmLoadLevel = new JMenuItem("Level laden");
		JMenuItem itmViewSolution = new JMenuItem("Lösung ansehen");
		JMenuItem itmClose = new JMenuItem("Spiel beenden");

		// optionen
		JMenu menuEdit = new JMenu("Optionen");
		JMenuItem itmStatistics = new JMenuItem("Levelstatistik anzeigen");
		JMenuItem itmBest = new JMenuItem("Bestergebnisse anzeigen");

		// Leveleditor
		JMenu menuLevelEditor = new JMenu("Level Editor");
		JMenuItem itmLevelEditorStart = new JMenuItem("Level Editor Starten");

		// Spiel
		menuFile.add(itmNew);
		menuFile.addSeparator();

		menuFile.add(itmReload);
		menuFile.addSeparator();

		menuFile.add(itmSave);
		menuFile.addSeparator();

		menuFile.add(itmLoad);
		menuFile.addSeparator();

		menuFile.add(itmLoadLevel);
		menuFile.addSeparator();

		menuFile.add(itmViewSolution);
		menuFile.addSeparator();

		menuFile.add(itmClose);

		// optionen
		menuEdit.add(itmStatistics);
		menuEdit.addSeparator();

		menuEdit.add(itmBest);

		// leveleditor
		menuLevelEditor.add(itmLevelEditorStart);
		gameMenuBar = new JMenuBar();
		gameMenuBar.add(menuFile);
		gameMenuBar.add(menuEdit);
		gameMenuBar.add(menuLevelEditor);

		// what happens when the user clicks on start new game
		itmNew.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				startNewGame();
			}
		});

		// what happens when the user clicks on restart level
		itmReload.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {

				Object[] options = { "Ja", "Nein" };
				int response = JOptionPane
						.showOptionDialog(
								frame,
								"Bist du sicher, dass du das Level neu laden willst? Ungespeicherter Fortschritt geht dabei verloren. ",
								"Level neu laden", JOptionPane.YES_NO_OPTION,
								JOptionPane.QUESTION_MESSAGE, null, options,
								options[1]);
				if (response == JOptionPane.YES_OPTION) {
					loadANewLevel(new File(currentLevel));
				}
			}
		});
		// what happens when the user clicks on save progress
		itmSave.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				saveGameProgress();
				try {
					levelService.saveLevelProgress(model, player);
				} catch (LevelMisconfigurationException e1) {
					JOptionPane.showConfirmDialog(frame, e1.getMessage());
					LOG.error(e1.getMessage());
				}
			}
		});

		// Start the level editor
		itmLevelEditorStart.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				SokobanEditor editor = new SokobanEditor();
			}
		});

		// what happens when the user clicks on load a level
		itmLoad.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				loadAGame();
			}

		});

		// what happens when the user clicks on load a level
		itmLoadLevel.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {

				Object[] options = { "Ja", "Nein" };
				int response = JOptionPane
						.showOptionDialog(
								frame,
								"Bist du sicher, dass du ein anderes Level spielen willst? Ungespeicherter Fortschritt geht dabei verloren. ",
								"Level laden", JOptionPane.YES_NO_OPTION,
								JOptionPane.QUESTION_MESSAGE, null, options,
								options[1]);

				if (response == JOptionPane.YES_OPTION) {
					storyMode = false;
					JFileChooser jFileChooser = new JFileChooser(editorBasePath);

					jFileChooser.showOpenDialog(null);
					levelName = jFileChooser
							.getSelectedFile()
							.getName()
							.substring(
									0,
									jFileChooser.getSelectedFile().getName()
											.length() - 4);
					currentLevel = jFileChooser.getSelectedFile().toString();

					loadANewLevel(jFileChooser.getSelectedFile());
				}

				// load the game Menu
				loadGameMenu();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				frame.getContentPane().revalidate();
			}

		});

		// View the solution from a file
		itmViewSolution.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				loadSolutionFile();
			}
		});

		// exits the current game and return to operating system
		itmClose.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				frame.setVisible(false);
				frame.dispose();
				System.exit(0);
			}
		});

		itmStatistics.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				int steps = model.getMoves().size();
				int diamondMoves = model.getDiamondMoveCounter();
				JOptionPane.showMessageDialog(null, "Schritte:" + steps
						+ "\nDiamantverschiebungen:" + diamondMoves);
			}
		});

		itmBest.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JDialog dialog = new JDialog(frame);
				Map<String, Integer> levelScoreMap = Highscore.getInstance()
						.getHighscoreForPlayer(player);
				Map<String, String> levelNameMap = levelService
						.getLevelNameUUIDMap();
				dialog.setTitle("Highscore f�r Spieler " + player);
				dialog.setContentPane(new HighscorePanel(levelNameMap,
						levelScoreMap));
				dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
				int width = new Integer(CoreConstants
						.getProperty("game.highscore.width"));
				int height = new Integer(CoreConstants
						.getProperty("game.highscore.height"));
				dialog.setSize(new Dimension(width, height));

				dialog.setVisible(true);
			}
		});

		return gameMenuBar;
	}