diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
index fc6d030e7c7ca0032590d9df3395200e4f7c1371..696d5b1430b785007cf369f918ba2b6455a6064c 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
@@ -26,6 +26,7 @@ import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectNotFoundException;
 import de.tobias.playpad.project.ProjectReader.ProjectReaderDelegate.ProfileAbortException;
 import de.tobias.playpad.project.ProjectSettings;
+import de.tobias.playpad.project.ProjectSettingsValidator;
 import de.tobias.playpad.project.page.Page;
 import de.tobias.playpad.project.ref.ProjectReference;
 import de.tobias.playpad.project.ref.ProjectReferenceManager;
@@ -303,8 +304,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 
 		int index = 1; // Für Tastenkombination
 		for (MainLayoutFactory connect : mainLayouts.getComponents()) {
-			if(connect.getType().equals(profileSettings.getMainLayoutType()))
-			{
+			if (connect.getType().equals(profileSettings.getMainLayoutType())) {
 				continue;
 			}
 
@@ -324,7 +324,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 
 			layoutMenu.getItems().add(item);
 			index++;
-	}
+		}
 	}
 
 	@Override
@@ -699,6 +699,34 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 		}
 	}
 
+	@FXML
+	void addColumnToProject() {
+		ProjectSettingsValidator projectSettingsValidator = new ProjectSettingsValidator(mainViewController.getScreen());
+		final int maxValue = projectSettingsValidator.maxValue(ProjectSettingsValidator.Dimension.COLUMNS);
+		if (maxValue < openProject.getSettings().getColumns() + 1) {
+			showErrorMessage(Localization.getString("Error.Screen.TooMuch", maxValue));
+			return;
+		}
+
+		openProject.addColumn();
+		mainViewController.createPadViews();
+		mainViewController.showPage(mainViewController.getPage());
+	}
+
+	@FXML
+	void addRowToProject() {
+		ProjectSettingsValidator projectSettingsValidator = new ProjectSettingsValidator(mainViewController.getScreen());
+		final int maxValue = projectSettingsValidator.maxValue(ProjectSettingsValidator.Dimension.ROWS);
+		if (maxValue < openProject.getSettings().getRows() + 1) {
+			showErrorMessage(Localization.getString("Error.Screen.TooMuch", maxValue));
+			return;
+		}
+
+		openProject.addRow();
+		mainViewController.createPadViews();
+		mainViewController.showPage(mainViewController.getPage());
+	}
+
 	@FXML
 	void alwaysOnTopItemHandler(ActionEvent event) {
 		boolean selected = alwaysOnTopItem.isSelected();
diff --git a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java
index dac32ea109085e1fbd079363f87a73ea1a70f18d..33ed71c972ff750b188f775ae9347caea26d2563 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java
@@ -6,6 +6,8 @@ import de.tobias.playpad.Strings;
 import de.tobias.playpad.design.ModernDesignSizeHelper;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectSettings;
+import de.tobias.playpad.project.ProjectSettingsValidator;
+import de.tobias.playpad.project.ProjectSettingsValidator.ValidationState;
 import de.tobias.playpad.view.PseudoClasses;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.option.IProjectReloadTask;
@@ -16,25 +18,16 @@ import javafx.scene.control.Label;
 import javafx.scene.control.TextField;
 import javafx.stage.Screen;
 
-public class GeneralTabViewController extends ProjectSettingsTabViewController implements IProjectReloadTask {
-
-	public static final int DISPLAY_OFFSET = 100;
+import static de.tobias.playpad.project.ProjectSettingsValidator.Dimension;
 
-	private enum ValidationState {
-		NORMAL,
-		TOO_MUCH,
-		TOO_LESS
-	}
-
-	private enum Dimension {
-		COLUMNS,
-		ROWS
-	}
+public class GeneralTabViewController extends ProjectSettingsTabViewController implements IProjectReloadTask {
 
 	private static final String DIGIT_POSITIVE = "^[1-9]\\d*$";
 
-	private Screen mainWindowScreen;
-	private Alertable parentController; // Für Benachrichtungen
+	private final Screen mainWindowScreen;
+	private final Alertable parentController; // Für Benachrichtungen
+
+	private final ProjectSettingsValidator projectSettingsValidator;
 
 	@FXML
 	private TextField columnTextField;
@@ -52,6 +45,8 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i
 		this.mainWindowScreen = currentScreen;
 		this.parentController = parentController;
 
+		this.projectSettingsValidator = new ProjectSettingsValidator(this.mainWindowScreen);
+
 		if (activePlayer) {
 			rowTextField.setDisable(true);
 			columnTextField.setDisable(true);
@@ -63,7 +58,7 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i
 		columnTextField.textProperty().addListener((a, b, c) ->
 		{
 			if (c.matches(DIGIT_POSITIVE) && !c.isEmpty()) {
-				ValidationState validationState = validate(Integer.parseInt(c), Dimension.COLUMNS);
+				ValidationState validationState = projectSettingsValidator.validate(Integer.parseInt(c), Dimension.COLUMNS);
 				if (validationState == ValidationState.NORMAL) {
 					columnTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, false);
 					columnErrorLabel.setText("");
@@ -73,22 +68,22 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i
 					String errorText = "";
 					// Error Message
 					if (validationState == ValidationState.TOO_MUCH) {
-						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, maxValue(Dimension.COLUMNS));
+						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, projectSettingsValidator.maxValue(Dimension.COLUMNS));
 					} else if (validationState == ValidationState.TOO_LESS) {
-						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.COLUMNS));
+						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.COLUMNS));
 					}
 					columnErrorLabel.setText(errorText);
 				}
 			} else {
 				columnTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, true);
-				columnErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.COLUMNS)));
+				columnErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.COLUMNS)));
 			}
 		});
 
 		rowTextField.textProperty().addListener((a, b, c) ->
 		{
 			if (c.matches(DIGIT_POSITIVE) && !c.isEmpty()) {
-				ValidationState validationState = validate(Integer.parseInt(c), Dimension.ROWS);
+				ValidationState validationState = projectSettingsValidator.validate(Integer.parseInt(c), Dimension.ROWS);
 				if (validationState == ValidationState.NORMAL) {
 					rowTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, false);
 					rowErrorLabel.setText("");
@@ -98,49 +93,19 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i
 					String errorText = "";
 					// Error Message
 					if (validationState == ValidationState.TOO_MUCH) {
-						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, maxValue(Dimension.ROWS));
+						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_MUCH, projectSettingsValidator.maxValue(Dimension.ROWS));
 					} else if (validationState == ValidationState.TOO_LESS) {
-						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.ROWS));
+						errorText = Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.ROWS));
 					}
 					rowErrorLabel.setText(errorText);
 				}
 			} else {
 				rowTextField.pseudoClassStateChanged(PseudoClasses.ERROR_CLASS, true);
-				rowErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, minValue(Dimension.ROWS)));
+				rowErrorLabel.setText(Localization.getString(Strings.ERROR_SCREEN_TOO_LESS, projectSettingsValidator.minValue(Dimension.ROWS)));
 			}
 		});
 	}
 
-	private ValidationState validate(int input, Dimension dimension) {
-		if (input < minValue(dimension)) {
-			return ValidationState.TOO_LESS;
-		} else if (input > maxValue(dimension)) {
-			return ValidationState.TOO_MUCH;
-		}
-		return ValidationState.NORMAL;
-	}
-
-	private int minValue(Dimension dimension) {
-		if (dimension == Dimension.COLUMNS) {
-			return ProjectSettings.MIN_COLUMNS;
-		} else if (dimension == Dimension.ROWS) {
-			return ProjectSettings.MIN_ROWS;
-		}
-		return -1;
-	}
-
-	private int maxValue(Dimension dimension) {
-		double width = mainWindowScreen.getVisualBounds().getMaxX() - mainWindowScreen.getVisualBounds().getMinX();
-		double height = mainWindowScreen.getVisualBounds().getMaxY() - mainWindowScreen.getVisualBounds().getMinY();
-
-		if (dimension == Dimension.COLUMNS) {
-			return Math.min((int) (width / ModernDesignSizeHelper.getPadWidth()), ProjectSettings.MAX_COLUMNS);
-		} else if (dimension == Dimension.ROWS) {
-			return Math.min((int) ((height - DISPLAY_OFFSET) / ModernDesignSizeHelper.getPadHeight()), ProjectSettings.MAX_ROWS);
-		}
-		return -1;
-	}
-
 	private boolean screenValid() {
 		double width = mainWindowScreen.getVisualBounds().getMaxX() - mainWindowScreen.getVisualBounds().getMinX();
 		double height = mainWindowScreen.getVisualBounds().getMaxY() - mainWindowScreen.getVisualBounds().getMinY();
@@ -200,8 +165,8 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController i
 	@Override
 	public boolean validSettings() {
 		try {
-			return validate(Integer.parseInt(columnTextField.getText()), Dimension.COLUMNS) == ValidationState.NORMAL &&
-					validate(Integer.parseInt(rowTextField.getText()), Dimension.ROWS) == ValidationState.NORMAL;
+			return projectSettingsValidator.validate(Integer.parseInt(columnTextField.getText()), Dimension.COLUMNS) == ValidationState.NORMAL &&
+					projectSettingsValidator.validate(Integer.parseInt(rowTextField.getText()), Dimension.ROWS) == ValidationState.NORMAL;
 		} catch (NumberFormatException e) {
 			return false;
 		}
diff --git a/PlayWall/src/main/resources/lang/_de.properties b/PlayWall/src/main/resources/lang/_de.properties
index cfbdf22ed322a5aa4e6fe39868cd2e6956349c89..3761ad40f81ac16680cb603ae2896b17f730b701 100755
--- a/PlayWall/src/main/resources/lang/_de.properties
+++ b/PlayWall/src/main/resources/lang/_de.properties
@@ -144,8 +144,8 @@ Error.Plugins.Missing=Es wurden im Projekt Erweiterungen verwendet, welche momen
 Error.Plugins.Loading=Die Plugins konnten nicht vom geladen werden. Versuchen Sie es sp\u00E4ter erneut.
 Error.Plugins.Install=Es ist ein Fehler beim installieren des Plugins aufgetreten. Versuche Sie es sp\u00E4ter erneut ({})
 # Error - Screen
-Error.Screen.TooMuch=Maxiamle Anzahl der Kacheln {}
-Error.Screen.TooLess=Minmale Anzahl der Kacheln {}
+Error.Screen.TooMuch=Maximale Anzahl der Kacheln {}
+Error.Screen.TooLess=Minimale Anzahl der Kacheln {}
 #Mapper
 Mapper.Keyboard.Name=Tastatur
 Mapper.Midi.Name=Midi
diff --git a/PlayWall/src/main/resources/lang/ui_de.properties b/PlayWall/src/main/resources/lang/ui_de.properties
index 1876ec12242853a055acb1e74acccedae6ee242f..4879253468109289fd391d849ab6a4bbcb48cf4e 100755
--- a/PlayWall/src/main/resources/lang/ui_de.properties
+++ b/PlayWall/src/main/resources/lang/ui_de.properties
@@ -29,6 +29,8 @@ main.menuitem.changelog=Changelog anzeigen...
 main.menuitem.website=Webseite anzeigen...
 main.menuitem.fullScreen=Vollbild
 main.menuitem.searchPad=Kachel suchen...
+main.menuitem.addColumn=Spalte rechts hinzuf\u00FCgen
+main.menuitem.addRow=Reihe unten hinzuf\u00FCgen
 main.label.live=Live
 settings.gen.label.behaviour=Programmstart:
 settings.gen.checkbox.openLastDocument=Automatisch zuletzt geladenes Projekt \u00F6ffnen.
diff --git a/PlayWall/src/main/resources/view/main/desktop/Header.fxml b/PlayWall/src/main/resources/view/main/desktop/Header.fxml
index e18a7a14f0c5dc5fcc12236a2b8e9bd522902747..8383f694f9a847157ff36e78fd1a0264919ff3f3 100644
--- a/PlayWall/src/main/resources/view/main/desktop/Header.fxml
+++ b/PlayWall/src/main/resources/view/main/desktop/Header.fxml
@@ -126,6 +126,10 @@
                             </accelerator>
                         </CheckMenuItem>
                         <SeparatorMenuItem mnemonicParsing="false"/>
+                        <MenuItem mnemonicParsing="false" onAction="#addColumnToProject"
+                                  text="%main.menuitem.addColumn"/>
+                        <MenuItem mnemonicParsing="false" onAction="#addRowToProject" text="%main.menuitem.addRow"/>
+                        <SeparatorMenuItem mnemonicParsing="false"/>
                         <MenuItem fx:id="searchPadMenuItem" mnemonicParsing="false" onAction="#searchPadHandler"
                                   text="%main.menuitem.searchPad"/>
                         <SeparatorMenuItem mnemonicParsing="false"/>
diff --git a/PlayWall/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java b/PlayWallCore/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java
similarity index 100%
rename from PlayWall/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java
rename to PlayWallCore/src/main/java/de/tobias/playpad/design/ModernDesignSizeHelper.java
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java b/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java
index bd70c1dfa78b1a6c1b50f3216ef46d1fdc0fb8b2..eedc4bcac8b6176a772fb4b133d1ac2a7d3682f6 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/project/Project.java
@@ -199,7 +199,6 @@ public class Project {
 		notFoundMediaProperty.set(getPads(p -> p.getStatus() == PadStatus.NOT_FOUND).size());
 	}
 
-
 	@Override
 	public String toString() {
 		return projectReference.getName() + " (" + projectReference.getUuid() + ")";
@@ -281,4 +280,14 @@ public class Project {
 		}
 		return null;
 	}
+
+	public void addColumn() {
+		settings.setColumns(settings.getColumns() + 1);
+		pages.forEach(Page::addColumn);
+	}
+
+	public void addRow() {
+		settings.setRows(settings.getRows() + 1);
+		pages.forEach(Page::addRow);
+	}
 }
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/project/ProjectSettingsValidator.java b/PlayWallCore/src/main/java/de/tobias/playpad/project/ProjectSettingsValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..c750722448fe4573b004fead310a1634075d4b83
--- /dev/null
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/project/ProjectSettingsValidator.java
@@ -0,0 +1,55 @@
+package de.tobias.playpad.project;
+
+import de.tobias.playpad.design.ModernDesignSizeHelper;
+import javafx.stage.Screen;
+
+public class ProjectSettingsValidator {
+	public static final int DISPLAY_OFFSET = 100;
+
+	public enum ValidationState {
+		NORMAL,
+		TOO_MUCH,
+		TOO_LESS
+	}
+
+	public enum Dimension {
+		COLUMNS,
+		ROWS
+	}
+
+	public ProjectSettingsValidator(Screen mainWindowScreen) {
+		this.mainWindowScreen = mainWindowScreen;
+	}
+
+	private final Screen mainWindowScreen;
+
+	public ValidationState validate(int input, Dimension dimension) {
+		if (input < minValue(dimension)) {
+			return ValidationState.TOO_LESS;
+		} else if (input > maxValue(dimension)) {
+			return ValidationState.TOO_MUCH;
+		}
+		return ValidationState.NORMAL;
+	}
+
+	public int minValue(Dimension dimension) {
+		if (dimension == Dimension.COLUMNS) {
+			return ProjectSettings.MIN_COLUMNS;
+		} else if (dimension == Dimension.ROWS) {
+			return ProjectSettings.MIN_ROWS;
+		}
+		return -1;
+	}
+
+	public int maxValue(Dimension dimension) {
+		double width = mainWindowScreen.getVisualBounds().getMaxX() - mainWindowScreen.getVisualBounds().getMinX();
+		double height = mainWindowScreen.getVisualBounds().getMaxY() - mainWindowScreen.getVisualBounds().getMinY();
+
+		if (dimension == Dimension.COLUMNS) {
+			return Math.min((int) (width / ModernDesignSizeHelper.getPadWidth()), ProjectSettings.MAX_COLUMNS);
+		} else if (dimension == Dimension.ROWS) {
+			return Math.min((int) ((height - DISPLAY_OFFSET) / ModernDesignSizeHelper.getPadHeight()), ProjectSettings.MAX_ROWS);
+		}
+		return -1;
+	}
+}
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java b/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java
index 36d9b1d04b488322ad2d1449ca2025ea244e268b..597081370e7a6c04e01bd5020953e0e9b7d0f89e 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/project/page/Page.java
@@ -192,12 +192,17 @@ public class Page {
 	public Pad getPad(int x, int y) {
 		ProjectSettings settings = projectReference.getSettings();
 		if (x < settings.getColumns() && y < settings.getRows()) {
-			int id = y * settings.getColumns() + x;
-			return getPad(id);
+			int position = getPadPosition(x, y);
+			return getPad(position);
 		}
 		return null;
 	}
 
+	private int getPadPosition(int x, int y) {
+		ProjectSettings settings = projectReference.getSettings();
+		return y * settings.getColumns() + x;
+	}
+
 	/**
 	 * Set a pad to a new id. It overwrites the old pad. If the pad argument is null, it only removes the old pad.
 	 *
@@ -244,6 +249,32 @@ public class Page {
 		pads.removeIf(p -> p.getUuid().equals(uuid));
 	}
 
+	public void addColumn() {
+		final int columns = getProject().getSettings().getColumns() - 1;
+		final int rows = getProject().getSettings().getRows();
+
+		for (int i = 0; i < rows; i++) {
+			insertPadInto(columns, i, rows * columns);
+		}
+	}
+
+	public void addRow() {
+		final int columns = getProject().getSettings().getColumns();
+		final int rows = getProject().getSettings().getRows() - 1;
+
+		for (int i = 0; i < columns; i++) {
+			insertPadInto(i, columns, rows * columns);
+		}
+	}
+
+	private void insertPadInto(int x, int y, int maxPad) {
+		int position = getPadPosition(x, y);
+		for (int i = maxPad - 1; i >= position; i--) {
+			getPad(i).setPosition(i + 1);
+		}
+		getPad(position);
+	}
+
 	@Override
 	public String toString() {
 		return "Page [positionProperty=" + positionProperty + "]";