diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java
index 12d07d1a6c3b7de89961c461a977d0a813599ace..1f22e8a009f5d727ee47fbb9a57377ebe1631963 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadView.java
@@ -21,8 +21,10 @@ import de.tobias.playpad.pad.viewcontroller.IPadViewController;
 import de.tobias.playpad.profile.Profile;
 import de.tobias.playpad.project.page.PadIndex;
 import de.tobias.playpad.registry.NoSuchComponentException;
+import de.tobias.playpad.util.NodeWalker;
 import de.tobias.playpad.view.EmptyPadView;
 import de.tobias.playpad.view.PseudoClasses;
+import de.tobias.playpad.view.pad.*;
 import javafx.beans.property.Property;
 import javafx.css.PseudoClass;
 import javafx.geometry.Pos;
@@ -33,6 +35,8 @@ import javafx.scene.control.ProgressBar;
 import javafx.scene.layout.*;
 import javafx.scene.paint.Color;
 
+import static de.tobias.playpad.view.pad.PadStyleClasses.*;
+
 public class DesktopPadView implements IPadView {
 
 	private Label indexLabel;
@@ -60,10 +64,10 @@ public class DesktopPadView implements IPadView {
 	private VBox root;
 	private BusyView busyView;
 
-	private VBox cueInContainer;
 	private Label cueInLayer;
 
-	private transient DesktopPadViewController controller; // Reference to its controller
+	// Reference to its controller
+	private final transient DesktopPadViewController controller;
 
 	public DesktopPadView(DesktopMainLayoutFactory connect) {
 		controller = new DesktopPadViewController(this, connect);
@@ -71,31 +75,24 @@ public class DesktopPadView implements IPadView {
 	}
 
 	private void setupView() {
-		superRoot = new StackPane();
-		root = new VBox();
+		superRoot = new PadStackPane(STYLE_CLASS_PAD, STYLE_CLASS_PAD_INDEX);
+		root = new PadVBox(STYLE_CLASS_PAD_BUTTON_ROOT);
 		busyView = new BusyView(superRoot);
 
-		cueInLayer = new Label();
+		cueInLayer = PadLabel.empty(STYLE_CLASS_PAD_CUE_IN, STYLE_CLASS_PAD_CUE_IN_INDEX);
 		cueInLayer.prefHeightProperty().bind(root.heightProperty());
-		cueInContainer = new VBox(cueInLayer);
-
-		indexLabel = new Label();
-
-		loopLabel = new Label(); // Active über Visible
-		loopLabel.setGraphic(new FontIcon(FontAwesomeType.REPEAT));
-
-		triggerLabel = new Label();
-		triggerLabel.setGraphic(new FontIcon(FontAwesomeType.EXTERNAL_LINK));
+		VBox cueInContainer = new VBox(cueInLayer);
 
-		errorLabel = new Label();
-		errorLabel.setGraphic(new FontIcon(FontAwesomeType.WARNING));
+		indexLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX);
+		timeLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX);
 
-		timeLabel = new Label();
+		loopLabel = new PadLabel(new FontIcon(FontAwesomeType.REPEAT));
+		triggerLabel = new PadLabel(new FontIcon(FontAwesomeType.EXTERNAL_LINK));
+		errorLabel = new PadLabel(new FontIcon(FontAwesomeType.WARNING));
 
-		infoBox = new HBox(); // childern in addDefaultButton()
-		infoBox.setSpacing(5);
+		infoBox = new PadHBox(5);
 
-		preview = new HBox();
+		preview = PadHBox.deepStyled(STYLE_CLASS_PAD_TITLE, STYLE_CLASS_PAD_TITLE_INDEX);
 		HBox.setHgrow(preview, Priority.ALWAYS);
 		VBox.setVgrow(preview, Priority.ALWAYS);
 
@@ -103,25 +100,15 @@ public class DesktopPadView implements IPadView {
 		timeLabel.setMaxWidth(Double.MAX_VALUE);
 		timeLabel.setAlignment(Pos.CENTER_RIGHT);
 
-		playBar = new ProgressBar(0);
+		playBar = new PadProgressBar(0, STYLE_CLASS_PAD_PLAYBAR, STYLE_CLASS_PAD_PLAYBAR_INDEX);
 		playBar.prefWidthProperty().bind(root.widthProperty());
 
 		// Buttons
-		playButton = new Button("", new FontIcon(FontAwesomeType.PLAY));
-		playButton.setFocusTraversable(false);
-		playButton.setOnAction(controller);
-		pauseButton = new Button("", new FontIcon(FontAwesomeType.PAUSE));
-		pauseButton.setFocusTraversable(false);
-		pauseButton.setOnAction(controller);
-		stopButton = new Button("", new FontIcon(FontAwesomeType.STOP));
-		stopButton.setFocusTraversable(false);
-		stopButton.setOnAction(controller);
-		newButton = new Button("", new FontIcon(FontAwesomeType.FOLDER_OPEN));
-		newButton.setFocusTraversable(false);
-		newButton.setOnAction(controller);
-		settingsButton = new Button("", new FontIcon(FontAwesomeType.GEAR));
-		settingsButton.setFocusTraversable(false);
-		settingsButton.setOnAction(controller);
+		playButton = new PadButton(new FontIcon(FontAwesomeType.PLAY), controller);
+		pauseButton = new PadButton(new FontIcon(FontAwesomeType.PAUSE), controller);
+		stopButton = new PadButton(new FontIcon(FontAwesomeType.STOP), controller);
+		newButton = new PadButton(new FontIcon(FontAwesomeType.FOLDER_OPEN), controller);
+		settingsButton = new PadButton(new FontIcon(FontAwesomeType.GEAR), controller);
 
 		// Not Found Label
 		notFoundLabel = new FontIcon(FontAwesomeType.EXCLAMATION_TRIANGLE);
@@ -129,11 +116,10 @@ public class DesktopPadView implements IPadView {
 		notFoundLabel.setOpacity(0.75);
 		notFoundLabel.setSize(80);
 		notFoundLabel.setMouseTransparent(true);
-
 		notFoundLabel.setVisible(false);
 
 		// Button HBOX
-		buttonBox = new HBox(); // childern in addDefaultButton()
+		buttonBox = new PadHBox(STYLE_CLASS_PAD_BUTTON_BOX);
 
 		root.getChildren().addAll(infoBox, preview, playBar, buttonBox);
 		superRoot.getChildren().addAll(cueInContainer, root, notFoundLabel);
@@ -162,8 +148,6 @@ public class DesktopPadView implements IPadView {
 					previewContent = connect.getPadContentPreview(pad, preview);
 					Node node = previewContent.getNode();
 
-					node.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title");
-
 					// Copy Pseudoclasses
 					for (PseudoClass pseudoClass : superRoot.getPseudoClassStates()) {
 						node.pseudoClassStateChanged(pseudoClass, true);
@@ -177,11 +161,6 @@ public class DesktopPadView implements IPadView {
 			}
 		}
 		EmptyPadView view = new EmptyPadView(preview);
-		if (pad != null) {
-			view.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title");
-		} else {
-			view.getStyleClass().addAll("pad-title");
-		}
 		preview.getChildren().setAll(view);
 	}
 
@@ -209,31 +188,10 @@ public class DesktopPadView implements IPadView {
 		this.indexLabel.setText(text);
 	}
 
-	ProgressBar getPlayBar() {
-		return playBar;
-	}
-
 	@Override
 	public void pseudoClassState(PseudoClass pseudoClass, boolean active) {
-		superRoot.pseudoClassStateChanged(pseudoClass, active);
-		cueInLayer.pseudoClassStateChanged(pseudoClass, active);
-		indexLabel.pseudoClassStateChanged(pseudoClass, active);
-		timeLabel.pseudoClassStateChanged(pseudoClass, active);
-		loopLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		triggerLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		errorLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-
-		if (preview != null) {
-			preview.getChildren().forEach(i -> i.pseudoClassStateChanged(pseudoClass, active));
-		}
-
-		playBar.pseudoClassStateChanged(pseudoClass, active);
-
-		playButton.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		pauseButton.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		stopButton.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		newButton.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		settingsButton.getGraphic().pseudoClassStateChanged(pseudoClass, active);
+		NodeWalker.getAllNodes(getRootNode())
+				.forEach(node -> node.pseudoClassStateChanged(pseudoClass, active));
 	}
 
 	@Override
@@ -278,8 +236,7 @@ public class DesktopPadView implements IPadView {
 		triggerLabel.setVisible(hasTriggerItems);
 	}
 
-	void
-	setTime(String time) {
+	void setTime(String time) {
 		if (time == null) {
 			timeLabel.setText("");
 		} else {
@@ -303,6 +260,7 @@ public class DesktopPadView implements IPadView {
 			} else {
 				buttonBox.getChildren().setAll(newButton, settingsButton);
 			}
+			applyStyleClasses(pad.getPadIndex());
 		}
 		infoBox.getChildren().setAll(indexLabel, loopLabel, triggerLabel, errorLabel, timeLabel);
 
@@ -325,64 +283,18 @@ public class DesktopPadView implements IPadView {
 
 	@Override
 	public void applyStyleClasses(PadIndex index) {
-		superRoot.getStyleClass().addAll("pad", "pad" + index);
-		cueInLayer.getStyleClass().addAll("pad-cue-in", "pad" + index + "-cue-in");
-
-		indexLabel.getStyleClass().addAll("pad-index", "pad" + index + "-index", "pad-info", "pad" + index + "-info");
-		timeLabel.getStyleClass().addAll("pad-time", "pad" + index + "-time", "pad-info", "pad" + index + "-info");
-		loopLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		triggerLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		errorLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-
-		preview.getChildren().forEach(i -> i.getStyleClass().addAll("pad-title", "pad" + index + "-title"));
-
-		playBar.getStyleClass().addAll("pad-playbar", "pad" + index + "-playbar");
-
-		playButton.getStyleClass().addAll("pad-button", "pad" + index + "-button");
-		pauseButton.getStyleClass().addAll("pad-button", "pad" + index + "-button");
-		stopButton.getStyleClass().addAll("pad-button", "pad" + index + "-button");
-		newButton.getStyleClass().addAll("pad-button", "pad" + index + "-button");
-		settingsButton.getStyleClass().addAll("pad-button", "pad" + index + "-button");
-
-		playButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		pauseButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		stopButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		newButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		settingsButton.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-
-		buttonBox.getStyleClass().add("pad-button-box");
-		root.getStyleClass().add("pad-root");
+		NodeWalker.getAllNodes(getRootNode())
+				.stream()
+				.filter(node -> node instanceof PadIndexable)
+				.forEach(node -> ((PadIndexable) node).setIndex(index));
 	}
 
 	@Override
 	public void removeStyleClasses() {
-		superRoot.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		cueInLayer.getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		indexLabel.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		timeLabel.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		loopLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		triggerLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		errorLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		preview.getChildren().forEach(i -> i.getStyleClass().removeIf(c -> c.startsWith("pad")));
-
-		playBar.getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		playButton.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		pauseButton.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		stopButton.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		newButton.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		settingsButton.getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		playButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		pauseButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		stopButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		newButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		settingsButton.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		buttonBox.getStyleClass().remove("pad-button-box");
-		root.getStyleClass().remove("pad-root");
+		NodeWalker.getAllNodes(getRootNode())
+				.stream()
+				.filter(node -> node instanceof PadIndexable)
+				.forEach(node -> ((PadIndexable) node).setIndex(null));
 	}
 
 	@Override
diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java
index 2c1973d80cd16a167511c4e3f0f371e6fa16e899..75cabd29dc71b2b324f49c3d25d6d0da935b0390 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/pad/DesktopPadViewController.java
@@ -326,7 +326,7 @@ public class DesktopPadViewController implements IPadViewController, EventHandle
 			padView.getSettingsButton().setDisable(true);
 		}
 
-		// Alles Desktivieren, wenn nicht Play Mode
+		// Alles Deaktivieren, wenn nicht Play Mode
 		if (connect.getEditMode() != DesktopEditMode.PLAY) {
 			padView.getPlayButton().setDisable(true);
 			padView.getPauseButton().setDisable(true);
diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java b/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java
index c094f0df8c0058df0096424b0d132f1bfdd4f122..0ae8de45f92ab9a27cbeb1c642ad083763efbc9d 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/layout/touch/pad/TouchPadView.java
@@ -18,8 +18,10 @@ import de.tobias.playpad.pad.viewcontroller.IPadViewController;
 import de.tobias.playpad.profile.Profile;
 import de.tobias.playpad.project.page.PadIndex;
 import de.tobias.playpad.registry.NoSuchComponentException;
+import de.tobias.playpad.util.NodeWalker;
 import de.tobias.playpad.view.EmptyPadView;
 import de.tobias.playpad.view.PseudoClasses;
+import de.tobias.playpad.view.pad.*;
 import javafx.beans.property.Property;
 import javafx.css.PseudoClass;
 import javafx.geometry.Pos;
@@ -29,6 +31,8 @@ import javafx.scene.control.ProgressBar;
 import javafx.scene.layout.*;
 import javafx.scene.paint.Color;
 
+import static de.tobias.playpad.view.pad.PadStyleClasses.*;
+
 public class TouchPadView implements IPadView {
 
 	private Label indexLabel;
@@ -50,10 +54,9 @@ public class TouchPadView implements IPadView {
 	private VBox root;
 	private BusyView busyView;
 
-	private VBox cueInContainer;
 	private Label cueInLayer;
 
-	private transient TouchPadViewController controller; // Reference to its controller
+	private final transient TouchPadViewController controller; // Reference to its controller
 
 	public TouchPadView() {
 		controller = new TouchPadViewController(this);
@@ -61,31 +64,24 @@ public class TouchPadView implements IPadView {
 	}
 
 	private void setupView() {
-		superRoot = new StackPane();
-		root = new VBox();
+		superRoot = new PadStackPane(STYLE_CLASS_PAD, STYLE_CLASS_PAD_INDEX);
+		root = new PadVBox(STYLE_CLASS_PAD_BUTTON_ROOT);
 		busyView = new BusyView(superRoot);
 
-		cueInLayer = new Label();
+		cueInLayer = PadLabel.empty(STYLE_CLASS_PAD_CUE_IN, STYLE_CLASS_PAD_CUE_IN_INDEX);
 		cueInLayer.prefHeightProperty().bind(root.heightProperty());
-		cueInContainer = new VBox(cueInLayer);
-
-		indexLabel = new Label();
-
-		loopLabel = new Label(); // Active über Visible
-		loopLabel.setGraphic(new FontIcon(FontAwesomeType.REPEAT));
+		VBox cueInContainer = new VBox(cueInLayer);
 
-		triggerLabel = new Label();
-		triggerLabel.setGraphic(new FontIcon(FontAwesomeType.EXTERNAL_LINK));
+		indexLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX);
+		timeLabel = PadLabel.empty(STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX);
 
-		errorLabel = new Label();
-		errorLabel.setGraphic(new FontIcon(FontAwesomeType.WARNING));
+		loopLabel = new PadLabel(new FontIcon(FontAwesomeType.REPEAT));
+		triggerLabel = new PadLabel(new FontIcon(FontAwesomeType.EXTERNAL_LINK));
+		errorLabel = new PadLabel(new FontIcon(FontAwesomeType.WARNING));
 
-		timeLabel = new Label();
+		infoBox = new PadHBox(5);
 
-		infoBox = new HBox(); // childern in addDefaultButton()
-		infoBox.setSpacing(5);
-
-		preview = new HBox();
+		preview = PadHBox.deepStyled(STYLE_CLASS_PAD_TITLE, STYLE_CLASS_PAD_TITLE_INDEX);
 		HBox.setHgrow(preview, Priority.ALWAYS);
 		VBox.setVgrow(preview, Priority.ALWAYS);
 
@@ -93,16 +89,15 @@ public class TouchPadView implements IPadView {
 		timeLabel.setMaxWidth(Double.MAX_VALUE);
 		timeLabel.setAlignment(Pos.CENTER_RIGHT);
 
-		playBar = new ProgressBar(0);
+		playBar = new PadProgressBar(0, STYLE_CLASS_PAD_PLAYBAR, STYLE_CLASS_PAD_PLAYBAR_INDEX);
 		playBar.prefWidthProperty().bind(root.widthProperty());
 
 		// Not Found Label
 		notFoundLabel = new FontIcon(FontAwesomeType.EXCLAMATION_TRIANGLE);
-		notFoundLabel.getStyleClass().add("pad-notfound");
+		notFoundLabel.getStyleClass().clear();
 		notFoundLabel.setOpacity(0.5);
 		notFoundLabel.setSize(50);
 		notFoundLabel.setMouseTransparent(true);
-
 		notFoundLabel.setVisible(false);
 
 		root.getChildren().addAll(infoBox, preview, playBar);
@@ -135,8 +130,6 @@ public class TouchPadView implements IPadView {
 					previewContent = connect.getPadContentPreview(pad, preview);
 					Node node = previewContent.getNode();
 
-					node.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title");
-
 					// Copy Pseudoclasses
 					for (PseudoClass pseudoClass : superRoot.getPseudoClassStates()) {
 						node.pseudoClassStateChanged(pseudoClass, true);
@@ -150,11 +143,6 @@ public class TouchPadView implements IPadView {
 			}
 		}
 		EmptyPadView view = new EmptyPadView(preview);
-		if (pad != null) {
-			view.getStyleClass().addAll("pad-title", "pad" + pad.getPadIndex() + "-title");
-		} else {
-			view.getStyleClass().addAll("pad-title");
-		}
 		preview.getChildren().setAll(view);
 	}
 
@@ -188,19 +176,8 @@ public class TouchPadView implements IPadView {
 
 	@Override
 	public void pseudoClassState(PseudoClass pseudoClass, boolean active) {
-		superRoot.pseudoClassStateChanged(pseudoClass, active);
-		cueInLayer.pseudoClassStateChanged(pseudoClass, active);
-		indexLabel.pseudoClassStateChanged(pseudoClass, active);
-		timeLabel.pseudoClassStateChanged(pseudoClass, active);
-		loopLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		triggerLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-		errorLabel.getGraphic().pseudoClassStateChanged(pseudoClass, active);
-
-		if (preview != null) {
-			preview.getChildren().forEach(i -> i.pseudoClassStateChanged(pseudoClass, active));
-		}
-
-		playBar.pseudoClassStateChanged(pseudoClass, active);
+		NodeWalker.getAllNodes(getRootNode())
+				.forEach(node -> node.pseudoClassStateChanged(pseudoClass, active));
 	}
 
 	@Override
@@ -247,38 +224,18 @@ public class TouchPadView implements IPadView {
 
 	@Override
 	public void applyStyleClasses(PadIndex index) {
-		superRoot.getStyleClass().addAll("pad", "pad" + index);
-		cueInLayer.getStyleClass().addAll("pad-cue-in", "pad" + index + "-cue-in");
-
-		indexLabel.getStyleClass().addAll("pad-index", "pad" + index + "-index", "pad-info", "pad" + index + "-info");
-		timeLabel.getStyleClass().addAll("pad-time", "pad" + index + "-time", "pad-info", "pad" + index + "-info");
-		loopLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		triggerLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-		errorLabel.getGraphic().getStyleClass().addAll("pad-icon", "pad" + index + "-icon");
-
-		preview.getChildren().forEach(i -> i.getStyleClass().addAll("pad-title", "pad" + index + "-title"));
-
-		playBar.getStyleClass().addAll("pad-playbar", "pad" + index + "-playbar");
-
-		root.getStyleClass().add("pad-root");
+		NodeWalker.getAllNodes(getRootNode())
+				.stream()
+				.filter(node -> node instanceof PadIndexable)
+				.forEach(node -> ((PadIndexable) node).setIndex(index));
 	}
 
 	@Override
 	public void removeStyleClasses() {
-		superRoot.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		cueInLayer.getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		indexLabel.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		timeLabel.getStyleClass().removeIf(c -> c.startsWith("pad"));
-		loopLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		triggerLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-		errorLabel.getGraphic().getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		preview.getChildren().forEach(i -> i.getStyleClass().removeIf(c -> c.startsWith("pad")));
-
-		playBar.getStyleClass().removeIf(c -> c.startsWith("pad"));
-
-		root.getStyleClass().remove("pad-root");
+		NodeWalker.getAllNodes(getRootNode())
+				.stream()
+				.filter(node -> node instanceof PadIndexable)
+				.forEach(node -> ((PadIndexable) node).setIndex(null));
 	}
 
 	@Override
diff --git a/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a2a2b6a86c8a360606310494a7e11737a612020
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java
@@ -0,0 +1,37 @@
+package de.tobias.playpad.util;
+
+import javafx.scene.Node;
+import javafx.scene.Parent;
+import javafx.scene.control.Labeled;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NodeWalker {
+
+	private NodeWalker() {
+	}
+
+	public static List<Node> getAllNodes(Parent root) {
+		List<Node> nodes = new ArrayList<>();
+		nodes.add(root);
+		addAllDescendents(root, nodes);
+		return nodes;
+	}
+
+	private static void addAllDescendents(Parent parent, List<Node> nodes) {
+		for (Node node : parent.getChildrenUnmodifiable()) {
+			nodes.add(node);
+
+			if (node instanceof Labeled) {
+				final Node graphic = ((Labeled) node).getGraphic();
+				if (graphic != null) {
+					nodes.add(graphic);
+				}
+			}
+
+			if (node instanceof Parent)
+				addAllDescendents((Parent) node, nodes);
+		}
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java
new file mode 100644
index 0000000000000000000000000000000000000000..9cfcd183917cda844a14d0875b669c8aed059e66
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java
@@ -0,0 +1,35 @@
+package de.tobias.playpad.view.pad;
+
+import de.thecodelabs.utils.ui.icon.FontIcon;
+import de.tobias.playpad.project.page.PadIndex;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.control.Button;
+
+import static de.tobias.playpad.view.pad.PadStyleClasses.*;
+
+public class PadButton extends Button implements PadIndexable {
+
+	private final ObjectProperty<PadIndex> indexProperty;
+
+	public PadButton(FontIcon icon, EventHandler<ActionEvent> value) {
+		super("", icon);
+
+		setFocusTraversable(false);
+		setOnAction(value);
+
+		indexProperty = new SimpleObjectProperty<>();
+		indexProperty.addListener(new StyleIndexListener(this, STYLE_CLASS_PAD_BUTTON, STYLE_CLASS_PAD_BUTTON_INDEX));
+		indexProperty.addListener(new StyleIndexListener(getGraphic(), STYLE_CLASS_PAD_ICON, STYLE_CLASS_PAD_ICON_INDEX));
+	}
+
+	public PadIndex getIndex() {
+		return indexProperty.get();
+	}
+
+	public void setIndex(PadIndex index) {
+		indexProperty.set(index);
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadHBox.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadHBox.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e0c2cdf37be559da5436023d84f375f701aa7e1
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadHBox.java
@@ -0,0 +1,57 @@
+package de.tobias.playpad.view.pad;
+
+import de.tobias.playpad.project.page.PadIndex;
+import javafx.beans.InvalidationListener;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.Node;
+import javafx.scene.layout.HBox;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class PadHBox extends HBox implements PadIndexable {
+
+	private final ObjectProperty<PadIndex> indexProperty;
+	private final List<StyleIndexListener> styleListeners = new LinkedList<>();
+
+	public static PadHBox deepStyled(String... styleClasses) {
+		PadHBox padHBox = new PadHBox(styleClasses);
+
+		padHBox.getChildren().addListener((InvalidationListener) observable -> {
+			for (StyleIndexListener listener : padHBox.styleListeners) {
+				padHBox.indexProperty.removeListener(listener);
+			}
+
+			padHBox.styleListeners.clear();
+
+			for (Node child : padHBox.getChildren()) {
+				StyleIndexListener listener = new StyleIndexListener(child, styleClasses);
+				padHBox.indexProperty.addListener(listener);
+				padHBox.styleListeners.add(listener);
+
+				listener.changed(padHBox.indexProperty, null, padHBox.indexProperty.get());
+			}
+		});
+
+		return padHBox;
+	}
+
+	public PadHBox(String... styleClasses) {
+		this(0, styleClasses);
+	}
+
+	public PadHBox(double spacing, String... styleClasses) {
+		super(spacing);
+		indexProperty = new SimpleObjectProperty<>();
+		indexProperty.addListener(new StyleIndexListener(this, styleClasses));
+	}
+
+	public PadIndex getIndex() {
+		return indexProperty.get();
+	}
+
+	public void setIndex(PadIndex index) {
+		indexProperty.set(index);
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadIndexable.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadIndexable.java
new file mode 100644
index 0000000000000000000000000000000000000000..c50a5cc70ee1604eeeb280636e8b3ae561480790
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadIndexable.java
@@ -0,0 +1,9 @@
+package de.tobias.playpad.view.pad;
+
+import de.tobias.playpad.project.page.PadIndex;
+
+public interface PadIndexable {
+	PadIndex getIndex();
+
+	void setIndex(PadIndex index);
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f8c900767cf4eabf9f011d91533a1712f3afc3c
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java
@@ -0,0 +1,57 @@
+package de.tobias.playpad.view.pad;
+
+import de.thecodelabs.utils.ui.icon.FontIcon;
+import de.tobias.playpad.project.page.PadIndex;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.control.Label;
+
+import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_ICON;
+import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_ICON_INDEX;
+
+public class PadLabel extends Label implements PadIndexable {
+
+	private final ObjectProperty<PadIndex> indexProperty;
+	private StyleIndexListener graphicsListener;
+
+	public static PadLabel empty(String... styleClasses) {
+		return new PadLabel("", styleClasses);
+	}
+
+	public PadLabel(FontIcon icon, String... styleClasses) {
+		this("", styleClasses);
+		setGraphic(icon);
+	}
+
+	public PadLabel(String text, String... styleClasses) {
+		super(text);
+
+		indexProperty = new SimpleObjectProperty<>();
+		indexProperty.addListener(new StyleIndexListener(this, styleClasses));
+		initStyleGraphicsListener();
+
+		graphicProperty().addListener(observable -> {
+			if (graphicsListener != null) {
+				indexProperty.removeListener(graphicsListener);
+				graphicsListener = null;
+
+				initStyleGraphicsListener();
+			}
+		});
+	}
+
+	private void initStyleGraphicsListener() {
+		if (getGraphic() != null) {
+			graphicsListener = new StyleIndexListener(getGraphic(), STYLE_CLASS_PAD_ICON, STYLE_CLASS_PAD_ICON_INDEX);
+			indexProperty.addListener(graphicsListener);
+		}
+	}
+
+	public PadIndex getIndex() {
+		return indexProperty.get();
+	}
+
+	public void setIndex(PadIndex index) {
+		indexProperty.set(index);
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadProgressBar.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadProgressBar.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d366b8cfcf4ab58d695c76e24bbe2ada13b6a54
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadProgressBar.java
@@ -0,0 +1,25 @@
+package de.tobias.playpad.view.pad;
+
+import de.tobias.playpad.project.page.PadIndex;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.control.ProgressBar;
+
+public class PadProgressBar extends ProgressBar implements PadIndexable {
+
+	private final ObjectProperty<PadIndex> indexProperty;
+
+	public PadProgressBar(double progress, String... styleClasses) {
+		super(progress);
+		indexProperty = new SimpleObjectProperty<>();
+		indexProperty.addListener(new StyleIndexListener(this, styleClasses));
+	}
+
+	public PadIndex getIndex() {
+		return indexProperty.get();
+	}
+
+	public void setIndex(PadIndex index) {
+		indexProperty.set(index);
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStackPane.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStackPane.java
new file mode 100644
index 0000000000000000000000000000000000000000..94d5670789563c8e01f906399bef0187cfc9a5f8
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStackPane.java
@@ -0,0 +1,24 @@
+package de.tobias.playpad.view.pad;
+
+import de.tobias.playpad.project.page.PadIndex;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.layout.StackPane;
+
+public class PadStackPane extends StackPane implements PadIndexable {
+
+	private final ObjectProperty<PadIndex> indexProperty;
+
+	public PadStackPane(String... styleClasses) {
+		indexProperty = new SimpleObjectProperty<>();
+		indexProperty.addListener(new StyleIndexListener(this, styleClasses));
+	}
+
+	public PadIndex getIndex() {
+		return indexProperty.get();
+	}
+
+	public void setIndex(PadIndex index) {
+		indexProperty.set(index);
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java
new file mode 100644
index 0000000000000000000000000000000000000000..b610e4391e05d21ea51949856af096c0bd021648
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java
@@ -0,0 +1,37 @@
+package de.tobias.playpad.view.pad;
+
+import de.tobias.playpad.project.page.PadIndex;
+
+public class PadStyleClasses {
+
+	private PadStyleClasses() {
+	}
+
+	public static final String STYLE_CLASS_PAD = "pad";
+	public static final String STYLE_CLASS_PAD_INDEX = "pad${index}";
+
+	public static final String STYLE_CLASS_PAD_BUTTON = "pad-button";
+	public static final String STYLE_CLASS_PAD_BUTTON_INDEX = "pad${index}-button";
+
+	public static final String STYLE_CLASS_PAD_ICON = "pad-icon";
+	public static final String STYLE_CLASS_PAD_ICON_INDEX = "pad${index}-icon";
+
+	public static final String STYLE_CLASS_PAD_INFO = "pad-info";
+	public static final String STYLE_CLASS_PAD_INFO_INDEX = "pad${index}-info";
+
+	public static final String STYLE_CLASS_PAD_TITLE = "pad-title";
+	public static final String STYLE_CLASS_PAD_TITLE_INDEX = "pad${index}-title";
+
+	public static final String STYLE_CLASS_PAD_BUTTON_BOX = "pad-button-box";
+	public static final String STYLE_CLASS_PAD_BUTTON_ROOT = "pad-root";
+
+	public static final String STYLE_CLASS_PAD_PLAYBAR = "pad-playbar";
+	public static final String STYLE_CLASS_PAD_PLAYBAR_INDEX = "pad${index}-playbar";
+
+	public static final String STYLE_CLASS_PAD_CUE_IN = "pad-cue-in";
+	public static final String STYLE_CLASS_PAD_CUE_IN_INDEX = "pad${index}-cue-in";
+
+	public static String replaceIndex(String styleClass, PadIndex index) {
+		return styleClass.replace("${index}", String.valueOf(index));
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadVBox.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadVBox.java
new file mode 100644
index 0000000000000000000000000000000000000000..33d999dc7349e03010453853977619ba086e468d
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadVBox.java
@@ -0,0 +1,29 @@
+package de.tobias.playpad.view.pad;
+
+import de.tobias.playpad.project.page.PadIndex;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.scene.layout.VBox;
+
+public class PadVBox extends VBox implements PadIndexable {
+
+	private final ObjectProperty<PadIndex> indexProperty;
+
+	public PadVBox(String... styleClasses) {
+		this(0, styleClasses);
+	}
+
+	public PadVBox(double spacing, String... styleClasses) {
+		super(spacing);
+		indexProperty = new SimpleObjectProperty<>();
+		indexProperty.addListener(new StyleIndexListener(this, styleClasses));
+	}
+
+	public PadIndex getIndex() {
+		return indexProperty.get();
+	}
+
+	public void setIndex(PadIndex index) {
+		indexProperty.set(index);
+	}
+}
diff --git a/PlayWall/src/main/java/de/tobias/playpad/view/pad/StyleIndexListener.java b/PlayWall/src/main/java/de/tobias/playpad/view/pad/StyleIndexListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..de3acf0ce609fbed673a2aba820c1aef0cf0ffc7
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/StyleIndexListener.java
@@ -0,0 +1,32 @@
+package de.tobias.playpad.view.pad;
+
+import de.tobias.playpad.project.page.PadIndex;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.scene.Node;
+
+public class StyleIndexListener implements ChangeListener<PadIndex> {
+
+	private final Node node;
+	private final String[] styleClasses;
+
+	public StyleIndexListener(Node node, String... styleClasses) {
+		this.node = node;
+		this.styleClasses = styleClasses;
+	}
+
+	@Override
+	public void changed(ObservableValue<? extends PadIndex> observable, PadIndex oldValue, PadIndex newValue) {
+		if (oldValue != null) {
+			for (String styleClass : styleClasses) {
+				node.getStyleClass().remove(PadStyleClasses.replaceIndex(styleClass, oldValue));
+			}
+		}
+
+		if (newValue != null) {
+			for (String styleClass : styleClasses) {
+				node.getStyleClass().add(PadStyleClasses.replaceIndex(styleClass, newValue));
+			}
+		}
+	}
+}