diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index 573656f6b552ab704fd9f1ad893286475dda5049..eccafc183acbddc53097dae4f91cf41f05d2b421 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -32,6 +32,7 @@
     <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginWebAPI" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginWebAPI/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/PlayWallPlugins/PlayWallPluginWebAPI/src/main/resources" charset="UTF-8" />
     <file url="PROJECT" charset="UTF-8" />
   </component>
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 6d0b659e2464756bf60529e5533697aa164c9611..c0b51ccd73d4745c67319e4b96adfef30e5cd181 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,12 @@ 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.PadButton;
+import de.tobias.playpad.view.pad.PadIndexable;
+import de.tobias.playpad.view.pad.PadLabel;
 import javafx.beans.property.Property;
 import javafx.css.PseudoClass;
 import javafx.geometry.Pos;
@@ -33,15 +37,18 @@ import javafx.scene.control.ProgressBar;
 import javafx.scene.layout.*;
 import javafx.scene.paint.Color;
 
+import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_INFO;
+import static de.tobias.playpad.view.pad.PadStyleClasses.STYLE_CLASS_PAD_INFO_INDEX;
+
 public class DesktopPadView implements IPadView {
 
-	private Label indexLabel;
-	private Label loopLabel;
-	private Label triggerLabel;
-	private Label errorLabel;
+	private PadLabel indexLabel;
+	private PadLabel loopLabel;
+	private PadLabel triggerLabel;
+	private PadLabel errorLabel;
 
 	private HBox infoBox;
-	private Label timeLabel;
+	private PadLabel timeLabel;
 
 	private HBox preview;
 	private IPadContentView previewContent;
@@ -49,11 +56,11 @@ public class DesktopPadView implements IPadView {
 	private FontIcon notFoundLabel;
 
 	private ProgressBar playBar;
-	private Button playButton;
-	private Button pauseButton;
-	private Button stopButton;
-	private Button newButton;
-	private Button settingsButton;
+	private PadButton playButton;
+	private PadButton pauseButton;
+	private PadButton stopButton;
+	private PadButton newButton;
+	private PadButton settingsButton;
 	private HBox buttonBox;
 
 	private StackPane superRoot;
@@ -79,18 +86,12 @@ public class DesktopPadView implements IPadView {
 		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));
-
-		errorLabel = new Label();
-		errorLabel.setGraphic(new FontIcon(FontAwesomeType.WARNING));
+		indexLabel = new PadLabel("", STYLE_CLASS_PAD_INFO, STYLE_CLASS_PAD_INFO_INDEX);
+		timeLabel = new PadLabel("", 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);
@@ -107,21 +108,11 @@ public class DesktopPadView implements IPadView {
 		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);
@@ -215,25 +206,8 @@ public class DesktopPadView 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);
-
-		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
@@ -303,6 +277,7 @@ public class DesktopPadView implements IPadView {
 			} else {
 				buttonBox.getChildren().setAll(newButton, settingsButton);
 			}
+			applyStyleClasses(pad.getPadIndex());
 		}
 		infoBox.getChildren().setAll(indexLabel, loopLabel, triggerLabel, errorLabel, timeLabel);
 
@@ -328,30 +303,17 @@ public class DesktopPadView implements IPadView {
 		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
@@ -359,30 +321,17 @@ public class DesktopPadView implements IPadView {
 		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/util/NodeWalker.java b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java
new file mode 100644
index 0000000000000000000000000000000000000000..420edf917dc277773e56a49841ef2b4be0f17b3b
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/util/NodeWalker.java
@@ -0,0 +1,28 @@
+package de.tobias.playpad.util;
+
+import javafx.scene.Node;
+import javafx.scene.Parent;
+
+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 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..fcfdf84bccddb734e29b49c45e3a239d72d17ee9
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadButton.java
@@ -0,0 +1,44 @@
+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((observable, oldValue, newValue) -> {
+			if (oldValue != null) {
+				getStyleClass().removeAll(STYLE_CLASS_PAD_BUTTON, replaceIndex(STYLE_CLASS_PAD_BUTTON_INDEX, oldValue));
+				getGraphic().getStyleClass().removeAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, oldValue));
+			}
+
+			if (newValue != null) {
+				getStyleClass().addAll(STYLE_CLASS_PAD_BUTTON, replaceIndex(STYLE_CLASS_PAD_BUTTON_INDEX, newValue));
+				getGraphic().getStyleClass().addAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, newValue));
+			}
+		});
+	}
+
+	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..abbee135b2d7ca76b0d7a5425b9dd3ed29b0f1f2
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadLabel.java
@@ -0,0 +1,52 @@
+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.*;
+
+public class PadLabel extends Label implements PadIndexable {
+
+	private final ObjectProperty<PadIndex> indexProperty;
+
+	public PadLabel(FontIcon icon, String... styleClasses) {
+		this("", styleClasses);
+		setGraphic(icon);
+	}
+
+	public PadLabel(String text, String... styleClasses) {
+		super(text);
+
+		indexProperty = new SimpleObjectProperty<>();
+		indexProperty.addListener((observable, oldValue, newValue) -> {
+			if (oldValue != null) {
+				for (String styleClass : styleClasses) {
+					getStyleClass().remove(PadStyleClasses.replaceIndex(styleClass, oldValue));
+				}
+				if (getGraphic() != null) {
+					getGraphic().getStyleClass().removeAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, oldValue));
+				}
+			}
+
+			if (newValue != null) {
+				for (String styleClass : styleClasses) {
+					getStyleClass().add(PadStyleClasses.replaceIndex(styleClass, newValue));
+				}
+				if (getGraphic() != null) {
+					getGraphic().getStyleClass().addAll(STYLE_CLASS_PAD_ICON, replaceIndex(STYLE_CLASS_PAD_ICON_INDEX, newValue));
+				}
+			}
+		});
+	}
+
+	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..65a22399e48a33ead9035eb7de6c7fd64febb56e
--- /dev/null
+++ b/PlayWall/src/main/java/de/tobias/playpad/view/pad/PadStyleClasses.java
@@ -0,0 +1,25 @@
+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_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 String replaceIndex(String styleClass, PadIndex index) {
+		return styleClass.replace("${index}", String.valueOf(index));
+	}
+}