diff --git a/src/main/java/projekt/enigma/App.java b/src/main/java/projekt/enigma/App.java
index fa705b2ed6d0f30ca2ffef815a19d5d05de37cdb..4194a41137ef4e4d9adf1022a80f968f1d8acd7c 100644
--- a/src/main/java/projekt/enigma/App.java
+++ b/src/main/java/projekt/enigma/App.java
@@ -37,7 +37,7 @@ public class App extends Application {
      * @param args : String[] : Standard-Kommandozeilen-Argument.
      */
     public static void main(String[] args) {
-        debug = 1;
+        debug = 0;
         launch(args);
     }
 
@@ -64,6 +64,7 @@ public class App extends Application {
 
         Label lblEingbae = new Label("Bitte Kenngruppe eingeben!");
         TextField tfEingabe = new TextField();
+        tfEingabe.setText("Enigma");
         Button btnKenngruppe = new Button("Kenngruppe setzen!");
         VBox layout = new VBox();
         layout.setSpacing(30);
diff --git a/src/main/java/projekt/enigma/GuiController.java b/src/main/java/projekt/enigma/GuiController.java
index 64e863a087474ce8e95247a0f0aa5bfa87f9a025..95d9bea768ac7c2aaca006d631122e9c2ea9de82 100644
--- a/src/main/java/projekt/enigma/GuiController.java
+++ b/src/main/java/projekt/enigma/GuiController.java
@@ -23,98 +23,98 @@ import java.util.Arrays;
 
 public class GuiController {
 
-	//region Klassenvariablen
-	private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
-	private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
-	private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
-	@FXML
-	private static ToggleButton[] tBtnPort;
-	private String[] empfangeneNachricht;
-	private String textEingabe;
-	private String textCodiert;
-	private char chiffrierterBuchstabe;
-	private boolean resetDisplay;
-	private Codierer codierer;
-	//region GUI-Elemente
-	//deklariert die benötigten Buttons
-	@FXML
-	private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
-			btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
-	//endregion
-	//deklariert die benötigten Kreise
-	@FXML
-	private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
-			circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
-	//deklariert die benötigten Label
-	@FXML
-	private Label lblSpruchschluessel, lblKenngruppe;
-	//deklariert die MenueButtons
-	@FXML
-	private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
-			mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
-	//deklariert die benötigten Textfelder
-	@FXML
-	private TextField tfCodiert, tfKlartext;
-	//deklariert benötigtes GridPane
-	@FXML
-	private ChkBoxGridPane[] chkBoxGridPane;
-	@FXML
-	private GridPane mainGrid;
-	@FXML
-	private AnchorPane anchorPane;
-
-	/**
-	 * Initialisiert die Elemente GUI und setzt deren Startwerte
-	 */
-	@FXML
-	void initialize() {
-		// Variablen setzen
-		textEingabe = "";
-		textCodiert = "";
-		resetDisplay = true;
-
-		//Einträge für Walzen
-		menu(mBtnWalzPos1, walzenNr);
-		menu(mBtnWalzPos2, walzenNr);
-		menu(mBtnWalzPos3, walzenNr);
-
-		//Einträge für die Ringe
-		menu(mBtnNotchPos1, ringNr);
-		menu(mBtnNotchPos2, ringNr);
-		menu(mBtnNotchPos3, ringNr);
-
-		//Einträge für die Startpositionen
-		menu(mBtnStartPos1, position);
-		menu(mBtnStartPos3, position);
-		menu(mBtnStartPos2, position);
-	}
-	//endregion
-
-	//region Init
-
-	/**
-	 * Die Funktion createSteckbrettPort erstellt zehn CheckComboBoxen, holt sich die verfügbaren Buchstaben,
-	 * die bereits gesteckten Kabel und weißt sie zu.
-	 * Im Anschluss werden die CheckComboBoxen auf dem GridPane positioniert.
-	 *
-	 * @param port : int : Kabel Nummer (0-9)
-	 */
-	private void createSteckbrettPort(int port) {
-		// Holt die verfügbaren Buchstaben für diesen Port ab und erstellt ein char Array daraus
-		char[] verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(port).toCharArray();
-
-		// Sortiert das Array nach dem Alphabet
-		Arrays.sort(verfuegbareBuchstaben);
-
-		StringBuilder sb = new StringBuilder();
-
-		/*
-		 * Die Buchstaben in die CheckComboBox laden und zusätzlich in einen String um später den
-		 * Index des Buchstaben auslesen zu können
-		 */
-		for (char c : verfuegbareBuchstaben) {
-			sb.append(c);
-		}
+    //region Klassenvariablen
+    private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
+    private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
+    private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
+    @FXML
+    private static ToggleButton[] tBtnPort;
+    private String[] empfangeneNachricht;
+    private String textEingabe;
+    private String textCodiert;
+    private char chiffrierterBuchstabe;
+    private boolean resetDisplay;
+    private Codierer codierer;
+    //region GUI-Elemente
+    //deklariert die benötigten Buttons
+    @FXML
+    private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
+            btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
+    //endregion
+    //deklariert die benötigten Kreise
+    @FXML
+    private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
+            circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
+    //deklariert die benötigten Label
+    @FXML
+    private Label lblSpruchschluessel, lblKenngruppe;
+    //deklariert die MenueButtons
+    @FXML
+    private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
+            mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
+    //deklariert die benötigten Textfelder
+    @FXML
+    private TextField tfCodiert, tfKlartext;
+    //deklariert benötigtes GridPane
+    @FXML
+    private ChkBoxGridPane[] chkBoxGridPane;
+    @FXML
+    private GridPane mainGrid;
+    @FXML
+    private AnchorPane anchorPane;
+
+    /**
+     * Initialisiert die Elemente GUI und setzt deren Startwerte
+     */
+    @FXML
+    void initialize() {
+        // Variablen setzen
+        textEingabe = "";
+        textCodiert = "";
+        resetDisplay = true;
+
+        //Einträge für Walzen
+        menu(mBtnWalzPos1, walzenNr);
+        menu(mBtnWalzPos2, walzenNr);
+        menu(mBtnWalzPos3, walzenNr);
+
+        //Einträge für die Ringe
+        menu(mBtnNotchPos1, ringNr);
+        menu(mBtnNotchPos2, ringNr);
+        menu(mBtnNotchPos3, ringNr);
+
+        //Einträge für die Startpositionen
+        menu(mBtnStartPos1, position);
+        menu(mBtnStartPos3, position);
+        menu(mBtnStartPos2, position);
+    }
+    //endregion
+
+    //region Init
+
+    /**
+     * Die Funktion createSteckbrettPort erstellt zehn CheckComboBoxen, holt sich die verfügbaren Buchstaben,
+     * die bereits gesteckten Kabel und weißt sie zu.
+     * Im Anschluss werden die CheckComboBoxen auf dem GridPane positioniert.
+     *
+     * @param port : int : Kabel Nummer (0-9)
+     */
+    private void createSteckbrettPort(int port) {
+        // Holt die verfügbaren Buchstaben für diesen Port ab und erstellt ein char Array daraus
+        char[] verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(port).toCharArray();
+
+        // Sortiert das Array nach dem Alphabet
+        Arrays.sort(verfuegbareBuchstaben);
+
+        StringBuilder sb = new StringBuilder();
+
+        /*
+         * Die Buchstaben in die CheckComboBox laden und zusätzlich in einen String um später den
+         * Index des Buchstaben auslesen zu können
+         */
+        for (char c : verfuegbareBuchstaben) {
+            sb.append(c);
+        }
 
 /*        // ToggleButton erstellen
         tBtnPort[port] = new ToggleButton();
@@ -122,794 +122,798 @@ public class GuiController {
         mainGrid.add(tBtnPort[port], port + 1, 8);
         mainGrid.setMargin(tBtnPort[port], new Insets(0, 15, 0, 15));*/
 
-		// Die Gesteckten Buchstaben in der CheckComboBox selektieren
-		//ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][0]));
-		//ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][1]));
-	}
-
-	/**
-	 * init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
-	 *
-	 * @param button : Button für die die Einträge erstellt werden sollen
-	 */
-	private void menu(MenuButton button, String[] str) {
-		ArrayList<MenuItem> mItem = new ArrayList<>();
-
-		for (int i = 0; i < str.length; i++) {
-			// Eintrag aus str der Arraylist mi hinzufügen
-			mItem.add(new MenuItem(str[i]));
-			// MenuItem mi dem Button button hinzufügen
-			button.getItems().add(mItem.get(i));
-			int finalI = i;
-			// Listener für die einzelnen Einträge
-			mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
-		}
-	}
-
-	/**
-	 * TODO: Doku
-	 */
-	private void myToggleButtons() {
-		// this.codierer.setzeSteckbrett()
-		if (chkBoxGridPane != null) {
-			for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
-				anchorPane.getChildren().remove(boxGridPane);
-			}
-		}
-		chkBoxGridPane = new ChkBoxGridPane[10];
-
-		final ToggleGroup cabelConnect = new ToggleGroup();
-		tBtnPort = new ToggleButton[10];
-
-		for (int i = 0; i < chkBoxGridPane.length; i++) {
-			char[] verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(i).toCharArray();
-			char[] checkedBuchstaben = {
-					this.codierer.fetchSteckverbindungen()[i][0],
-					this.codierer.fetchSteckverbindungen()[i][1]
-			};
-			Arrays.sort(verfuegbareBuchstaben);
-
-			chkBoxGridPane[i] = new ChkBoxGridPane(verfuegbareBuchstaben);
-			chkBoxGridPane[i].setVisible(false);
-			chkBoxGridPane[i].setStyle("-fx-background-color: white; -fx-border-color: black;");
-			chkBoxGridPane[i].setPrefHeight(chkBoxGridPane[i].getCharSize() * 20);
-			chkBoxGridPane[i].setPrefWidth(85.0);
-			chkBoxGridPane[i].setPadding(new Insets(10, 10, 10, 10));
-			chkBoxGridPane[i].setAlignment(Pos.CENTER);
-
-			tBtnPort[i] = new ToggleButton(checkedBuchstaben[0] + "" + checkedBuchstaben[1]);
-			tBtnPort[i].setToggleGroup(cabelConnect);
-			GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
-
-			mainGrid.add(tBtnPort[i], i + 1, 8);
-			chkBoxGridPane[i].setLayoutX(
-					(anchorPane.getWidth() / 12) * (i + 1) -
-							((chkBoxGridPane[i].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
-			chkBoxGridPane[i].setLayoutY(
-					mainGrid.getLayoutY() + ((anchorPane.getHeight() -
-							mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[i].getPrefHeight() - 15);
-			new Fehler().debug(
-					"mg LayoutY " + mainGrid.getLayoutY() +
-							" mg Height " + mainGrid.getHeight() +
-							" chkbox Height " + chkBoxGridPane[i].getHeight() +
-							" AP Height " + anchorPane.getHeight(),
-					false);
-			anchorPane.getChildren().add(chkBoxGridPane[i]);
-
-			cabelConnect.selectedToggleProperty().
-					addListener((observable, oldValue, newValue) -> {
-						//TODO
-						for (int j = 0; j < 10; j++) {
-							if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
-								chkBoxGridPane[j].setVisible(true);
-							} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
-								chkBoxGridPane[j].setVisible(false);
-							}
-						}
-					});
-		}
-	}
-
-	/**
-	 * Wird ausgelöst wenn der gedrückte Button losgelassen wird.
-	 * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
-	 * durch Aufruf der Methode leuchten.
-	 *
-	 * @param e => übergibt den zuletzt losgelassenen Button
-	 */
-	@FXML
-	void tasteRauf(MouseEvent e) {
-		if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnC) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnD) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnE) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnF) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnG) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnH) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnI) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnJ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnK) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnL) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnM) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnN) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnO) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnP) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnQ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnR) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnS) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnT) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnU) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnV) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnW) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnX) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnY) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-		if (e.getSource() == btnZ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-	}
-	//endregion
-
-	//region EventHandler/Listener
-
-	/**
-	 * Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
-	 * Auswertung welche Buchstaben-Taste gedrückt ist.
-	 * Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
-	 * in der Klassen-Variablen chiffrierterBuchstabe ablegt.
-	 * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
-	 *
-	 * @param e => übergibt den momentan gedrückten Buttons
-	 */
-	@FXML
-	void tasteRunter(MouseEvent e) {
-		if (e.getSource() == btnA) {
-			setText(btnA);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnB) {
-			setText(btnB);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnC) {
-			setText(btnC);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnD) {
-			setText(btnD);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnE) {
-			setText(btnE);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnF) {
-			setText(btnF);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnG) {
-			setText(btnG);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnH) {
-			setText(btnH);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnI) {
-			setText(btnI);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnJ) {
-			setText(btnJ);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnK) {
-			setText(btnK);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnL) {
-			setText(btnL);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnM) {
-			setText(btnM);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnN) {
-			setText(btnN);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnO) {
-			setText(btnO);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnP) {
-			setText(btnP);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnQ) {
-			setText(btnQ);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnR) {
-			setText(btnR);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnS) {
-			setText(btnS);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnT) {
-			setText(btnT);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnU) {
-			setText(btnU);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnV) {
-			setText(btnV);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnW) {
-			setText(btnW);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnX) {
-			setText(btnX);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnY) {
-			setText(btnY);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-		if (e.getSource() == btnZ) {
-			setText(btnZ);
-			leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-		}
-	}
-
-	/**
-	 * Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
-	 * Funktionsaufruf entsprechend des gedrückten Button
-	 *
-	 * @param e => ActionEvent des auslösenden Button
-	 */
-	@FXML
-	private void gedrueckteTaste(ActionEvent e) {
-		if (e.getSource() == btnSenden) {
-			if (tfCodiert.getText().equals("")) {
-				new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
-						"Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
-			} else {
-				sendeFunkspruch();
-			}
-		}
-		if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
-		if (e.getSource() == btnDelete) loeschen();
-		if (e.getSource() == btnReset) {
-			codierer.resetHardware();
-			this.resetDisplay = true;
-			this.lblSpruchschluessel.setText("");
-			this.setzeTagesSchluessel();
-		}
-	}
-
-	/**
-	 * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
-	 *
-	 * @param leuchte       => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
-	 * @param shiningLetter => "AN"  -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
-	 *                      "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
-	 */
-	private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
-		if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
-		else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
-			leuchte.setStyle("-fx-background-color: grey");
-			leuchte.setStyle("-fx-border-color:  #000000");
-		}
-	}
-	//endregion
-
-	//region Methoden
-
-	/**
-	 * Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
-	 *
-	 * @param chiffLetter => chiffrierter Buchstabe
-	 * @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
-	 */
-	private Circle chiffCircle(char chiffLetter) {
-		switch (chiffLetter) {
-			case 'A':
-				return circA;
-			case 'B':
-				return circB;
-			case 'C':
-				return circC;
-			case 'D':
-				return circD;
-			case 'E':
-				return circE;
-			case 'F':
-				return circF;
-			case 'G':
-				return circG;
-			case 'H':
-				return circH;
-			case 'I':
-				return circI;
-			case 'J':
-				return circJ;
-			case 'K':
-				return circK;
-			case 'L':
-				return circL;
-			case 'M':
-				return circM;
-			case 'N':
-				return circN;
-			case 'O':
-				return circO;
-			case 'P':
-				return circP;
-			case 'Q':
-				return circQ;
-			case 'R':
-				return circR;
-			case 'S':
-				return circS;
-			case 'T':
-				return circT;
-			case 'U':
-				return circU;
-			case 'V':
-				return circV;
-			case 'W':
-				return circW;
-			case 'X':
-				return circX;
-			case 'Y':
-				return circY;
-			case 'Z':
-				return circZ;
-		}
-		return null;
-	}
-
-	/**
-	 * Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
-	 *
-	 * @param mBtn : MenuButton der Walze
-	 * @param mItm : MenuItem
-	 */
-	private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
-		if (mBtn.getId().equals(mBtnStartPos1.getId())) {
-			setzePosition(1, mItm.getText().charAt(0));
-			this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
-		}
-		if (mBtn.getId().equals(mBtnStartPos2.getId())) {
-			setzePosition(2, mItm.getText().charAt(0));
-			this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
-		}
-		if (mBtn.getId().equals(mBtnStartPos3.getId())) {
-			setzePosition(3, mItm.getText().charAt(0));
-			this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
-		}
-		if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
-			setzeWalze(1, mItm.getText());
-			if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
-					!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
-				this.codierer.setzeWalzeNr(0,
-						convertRoemischToZahl(mItm.getText()) + 1,
-						mBtnNotchPos1.getText().charAt(0));
-			} else {
-				setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
-				new Fehler().showErrorDialog("error",
-						"Walze nicht gefunden",
-						"Es scheint so das wir von jeder Walze nur eine da haben");
-			}
-		}
-		if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
-			setzeWalze(2, mItm.getText());
-			if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
-					!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
-				this.codierer.setzeWalzeNr(1,
-						convertRoemischToZahl(mItm.getText()) + 1,
-						mBtnNotchPos2.getText().charAt(0));
-			} else {
-				setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
-				new Fehler().showErrorDialog("error",
-						"Walze nicht gefunden",
-						"Es scheint so das wir von jeder Walze nur eine da haben");
-			}
-		}
-		if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
-			setzeWalze(3, mItm.getText());
-			if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
-					!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
-				this.codierer.setzeWalzeNr(2,
-						convertRoemischToZahl(mItm.getText()) + 1,
-						mBtnNotchPos3.getText().charAt(0));
-			} else {
-				setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
-				new Fehler().showErrorDialog("error",
-						"Walze nicht gefunden",
-						"Es scheint so das wir von jeder Walze nur eine da haben");
-			}
-		}
-		if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
-			setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
-			this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
-		}
-		if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
-			setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
-			this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
-		}
-		if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
-			setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
-			this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
-		}
-		tfCodiert.setText("");
-		tfKlartext.setText("");
-	}
-
-	/**
-	 * Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
-	 * der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
-	 */
-	private void loeschen() {
-		if (textEingabe.length() == 0) {
-			tfKlartext.setText("");
-			tfCodiert.setText("");
-		} else {
-			textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
-			textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
-			tfKlartext.setText(textEingabe);
-			tfCodiert.setText(textCodiert);
-			codierer.letztesZeichenLoeschen();
-			mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
-			mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
-			mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
-		}
-	}
-
-	/**
-	 * Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
-	 * sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
-	 */
-	private void empfangeFunkspruch() {
-		progressDialogue("rx");
-
-		try {
-			if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
-				setzeTagesSchluessel();
-				tfKlartext.setText(this.empfangeneNachricht[2]);
-				tfCodiert.setText(this.empfangeneNachricht[1]);
-				resetDisplay = true;
-
-				// Spruchschluessel in das Feld lblSpruchschluessel schreiben
-				lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
-			}
-		} catch (NullPointerException ignored) {
-			new Fehler().showErrorDialog(
-					"warning",
-					"Keiner schreibt dir...",
-					"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
-		}
-	}
-
-	/**
-	 * Senden der Nachricht mit Hilfe der Klasse Codierer
-	 * Löscht die Textfelder tfKlartext und tfCodiert
-	 */
-	private void sendeFunkspruch() {
-		this.tfKlartext.setText("");
-		this.tfCodiert.setText("");
-
-		progressDialogue("tx");
-	}
-
-	/**
-	 * TODO
-	 *
-	 * @param strRxTx : String : RX oder TX
-	 */
-	private void progressDialogue(String strRxTx) {
-		Task copyWorker = createWorker(strRxTx);
-
-		ProgressIndicator pi = new ProgressIndicator();
-		pi.setProgress(-1);
-
-		ProgressDialog dialog = new ProgressDialog(copyWorker);
-		dialog.initStyle(StageStyle.TRANSPARENT);
-		dialog.setTitle("Kommunikation zum Funkraum");
-		if (strRxTx.equals("rx")) {
-			dialog.setContentText("Empfange Nachricht");
-		} else if (strRxTx.equals("tx")) {
-			dialog.setContentText("Sende Nachricht");
-		}
-		dialog.setHeaderText(null);
-		dialog.setGraphic(pi);
-		dialog.initStyle(StageStyle.UTILITY);
-		new Thread(copyWorker).start();
-		dialog.showAndWait();
-	}
-
-	/**
-	 * TODO
-	 *
-	 * @param strRxTx : String : RX oder TX
-	 * @return boolean
-	 */
-	private Task createWorker(String strRxTx) {
-		return new Task() {
-			@Override
-			protected Object call() {
-				if (strRxTx.equals("rx")) {
-					empfangeneNachricht = codierer.empfangeNachricht();
-				} else if (strRxTx.equals("tx")) {
-					try {
-						codierer.sendeNachricht();
-					} catch (IOException e) {
-						e.printStackTrace();
-					}
-				}
-
-				return true;
-			}
-		};
-	}
-
-	/**
-	 * Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
-	 * Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
-	 * Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
-	 * Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
-	 * Aktualisierung der Walzenstellung
-	 *
-	 * @param pressedButton : gedrückter Knopf
-	 */
-	private void setText(Button pressedButton) {
-		if (textEingabe.length() < 250) {
-			if (this.resetDisplay) {
-				this.tfCodiert.setText("");
-				this.tfKlartext.setText("");
-				this.lblSpruchschluessel.setText("");
-				this.resetDisplay = false;
-				this.codierer.resetHardware();
-				textCodiert = "";
-				textEingabe = "";
-				// Spruchschlüssel generieren und codieren
-				this.codierer.generateSpruchschluessel();
-				// Spruchschluessel in das Feld lblSpruchschluessel schreiben
-				lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
-			}
-			textEingabe += pressedButton.getText();
-			chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
-			textCodiert += chiffrierterBuchstabe;
-
-			tfKlartext.setText(textEingabe);
-			tfCodiert.setText(textCodiert);
-
-			// Position der Walzen aktuallisieren
-			mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
-			mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
-			mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
-		}
-	}
-
-	/**
-	 * Konvertiert eine rämische Zahl in eine arabische Zahl
-	 *
-	 * @param nummer : String : Römische Zahl
-	 * @return int : arabische Zahl
-	 */
-	private int convertRoemischToZahl(String nummer) {
-		int result = 0;
-
-		switch (nummer) {
-			case "I":
-				result = 0;
-				break;
-			case "II":
-				result = 1;
-				break;
-			case "III":
-				result = 2;
-				break;
-			case "IV":
-				result = 3;
-				break;
-			case "V":
-				result = 4;
-				break;
-			default:
-				break;
-		}
-		return result;
-	}
-
-	/**
-	 * Konvertiert eine arabische Zahl in eine rämische Zahl
-	 *
-	 * @param nummer : int : arabische Zahl
-	 * @return String : römische Zahl
-	 */
-	private String convertZahlToRoemisch(int nummer) {
-		String result = "";
-
-		switch (nummer) {
-			case 0:
-				result = "I";
-				break;
-			case 1:
-				result = "II";
-				break;
-			case 2:
-				result = "III";
-				break;
-			case 3:
-				result = "IV";
-				break;
-			case 4:
-				result = "V";
-				break;
-			default:
-				break;
-		}
-		return result;
-	}
-
-	/**
-	 * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
-	 * ->d.h. welche Walze sitzt auf welcher Position
-	 *
-	 * @param walzeRoemischNr => gibt die Walzennummer an
-	 * @param walzenPosition  => gibt die Position der Walze
-	 */
-	private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
-		switch (walzenPosition) {
-			case 1:
-				mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
-				break;
-			case 2:
-				mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
-				break;
-			case 3:
-				mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
-				break;
-			default:
-				break;
-		}
-	}
-
-	/**
-	 * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
-	 * -> d.h. welche Walze sitzt auf welcher Position
-	 *
-	 * @param walzenPosition => gibt die Position der Walze
-	 * @param walzeNr        => gibt die Walzennummer an
-	 */
-	private void setzeWalze(int walzenPosition, int walzeNr) {
-		switch (walzenPosition) {
-			case 1:
-				mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
-				//codierer.setWalze(walzeNr, walzenPosition)
-				break;
-			case 2:
-				mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
-				break;
-			case 3:
-				mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
-				break;
-			default:
-				break;
-		}
-	}
-
-	/**
-	 * Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
-	 * Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
-	 * um eine Stelle versetzt
-	 *
-	 * @param ringStellung   => gibt die walze an
-	 * @param walzenPosition => gibt den notch der Walze (walze) an
-	 */
-	private void setzeRing(int walzenPosition, int ringStellung) {
-		switch (walzenPosition) {
-			case 1:
-				mBtnNotchPos1.setText(ringNr[ringStellung]);
-				break;
-			case 2:
-				mBtnNotchPos2.setText(ringNr[ringStellung]);
-				break;
-			case 3:
-				mBtnNotchPos3.setText(ringNr[ringStellung]);
-				break;
-			default:
-				break;
-		}
-	}
-
-	/**
-	 * Setzt die Startposition/ aktuelle Position der Walze
-	 *
-	 * @param walze     => gibt die walze an
-	 * @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
-	 */
-	private void setzePosition(int walze, char buchstabe) {
-		switch (walze) {
-			case 1:
-				mBtnStartPos1.setText(String.valueOf(buchstabe));
-				break;
-			case 2:
-				mBtnStartPos2.setText(buchstabe + "");
-				break;
-			case 3:
-				mBtnStartPos3.setText(buchstabe + "");
-				break;
-			default:
-				break;
-		}
-	}
-
-	/**
-	 * Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
-	 */
-	private void setzeTagesSchluessel() {
-
-		// Umsprungpunkte anzeigen
-		mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
-		mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
-		mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
-
-		// Walzennummern anzeigen
-		setzeWalze(1, codierer.fetchWalzenNr()[0]);
-		setzeWalze(2, codierer.fetchWalzenNr()[1]);
-		setzeWalze(3, codierer.fetchWalzenNr()[2]);
-
-		// Position der Walzen anzeigen
-		mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
-		mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
-		mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
-
-		// Steckbrett Felder setzen
-		//setzeSteckverbindungen();
-
-		myToggleButtons();
-
-		// Setzt das Steckbrett
-		//generateSteckbrett();
-
-		// Felder zurück setzen
-		this.textCodiert = "";
-		this.textEingabe = "";
-		this.tfKlartext.setText("");
-		this.tfCodiert.setText("");
-	}
-
-	/**
-	 * TODO: Doku
-	 *
-	 * @param kenngruppe : String : Die Kenngruppe die gesetzt werden soll
-	 */
-	void setKenngruppe(String kenngruppe) {
-
-		// Initialisieren des Codierers und setzen der Kenngruppe
-		codierer = new Codierer(kenngruppe.toUpperCase());
-
-		this.codierer.resetHardware();
-
-		//Setzt die Kenngruppe in der GUI
-		lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
-
-		// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
-		resetDisplay = true;
-
-		// Einstellungen aus dem Logbuch auslesen und setzen
-		setzeTagesSchluessel();
-		//setzeSteckverbindungen();
-	}
-
-	private enum BUCHSTABE_LEUCHTET {AN, AUS}
-	//endregion
+        // Die Gesteckten Buchstaben in der CheckComboBox selektieren
+        //ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][0]));
+        //ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][1]));
+    }
+
+    /**
+     * init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
+     *
+     * @param button : Button für die die Einträge erstellt werden sollen
+     */
+    private void menu(MenuButton button, String[] str) {
+        ArrayList<MenuItem> mItem = new ArrayList<>();
+
+        for (int i = 0; i < str.length; i++) {
+            // Eintrag aus str der Arraylist mi hinzufügen
+            mItem.add(new MenuItem(str[i]));
+            // MenuItem mi dem Button button hinzufügen
+            button.getItems().add(mItem.get(i));
+            int finalI = i;
+            // Listener für die einzelnen Einträge
+            mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
+        }
+    }
+
+    /**
+     * TODO: Doku
+     */
+    private void myToggleButtons() {
+        if (chkBoxGridPane != null) {
+            for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
+                anchorPane.getChildren().remove(boxGridPane);
+            }
+        }
+        chkBoxGridPane = new ChkBoxGridPane[10];
+
+        final ToggleGroup cabelConnect = new ToggleGroup();
+        tBtnPort = new ToggleButton[chkBoxGridPane.length];
+
+        for (int i = 0; i < chkBoxGridPane.length; i++) {
+            tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" + this.codierer.fetchSteckverbindungen()[i][1]);
+            tBtnPort[i].setToggleGroup(cabelConnect);
+            tBtnPort[i].setMinWidth(50.0);
+            GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
+            mainGrid.add(tBtnPort[i], i + 1, 8);
+            this.createPortPane(i);
+            chkBoxGridPane[i].setVisible(false);
+        }
+
+        cabelConnect.selectedToggleProperty().
+                addListener((observable, oldValue, newValue) -> {
+                    //TODO
+                    for (int j = 0; j < chkBoxGridPane.length; j++) {
+
+                        //tBtnPort[j].setText(this.codierer.fetchSteckverbindungen()[j][0] + "" + this.codierer.fetchSteckverbindungen()[j][1]);
+
+                        if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
+                            this.createPortPane(j);
+                        } else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
+                            if (chkBoxGridPane[j] != null) {
+                                chkBoxGridPane[j].setVisible(false);
+                            }
+                        }
+                    }
+                });
+    }
+
+    private void createPortPane(int port) {
+
+        if (chkBoxGridPane[port] != null) {
+            anchorPane.getChildren().remove(chkBoxGridPane[port]);
+        }
+        chkBoxGridPane[port] = new ChkBoxGridPane(
+                this.codierer,
+                port,
+                tBtnPort[port]);
+        chkBoxGridPane[port].setVisible(false);
+        chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
+        chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
+        chkBoxGridPane[port].setPrefWidth(85.0);
+        chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
+        chkBoxGridPane[port].setAlignment(Pos.CENTER);
+        chkBoxGridPane[port].setLayoutX(
+                (anchorPane.getWidth() / 12) * (port + 1) -
+                        ((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
+        chkBoxGridPane[port].setLayoutY(
+                mainGrid.getLayoutY() + ((anchorPane.getHeight() -
+                        mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
+
+        anchorPane.getChildren().add(chkBoxGridPane[port]);
+        chkBoxGridPane[port].setVisible(true);
+    }
+
+    /**
+     * Wird ausgelöst wenn der gedrückte Button losgelassen wird.
+     * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
+     * durch Aufruf der Methode leuchten.
+     *
+     * @param e => übergibt den zuletzt losgelassenen Button
+     */
+    @FXML
+    void tasteRauf(MouseEvent e) {
+        if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnC) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnD) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnE) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnF) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnG) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnH) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnI) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnJ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnK) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnL) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnM) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnN) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnO) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnP) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnQ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnR) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnS) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnT) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnU) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnV) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnW) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnX) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnY) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        if (e.getSource() == btnZ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+    }
+    //endregion
+
+    //region EventHandler/Listener
+
+    /**
+     * Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
+     * Auswertung welche Buchstaben-Taste gedrückt ist.
+     * Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
+     * in der Klassen-Variablen chiffrierterBuchstabe ablegt.
+     * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
+     *
+     * @param e => übergibt den momentan gedrückten Buttons
+     */
+    @FXML
+    void tasteRunter(MouseEvent e) {
+        if (e.getSource() == btnA) {
+            setText(btnA);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnB) {
+            setText(btnB);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnC) {
+            setText(btnC);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnD) {
+            setText(btnD);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnE) {
+            setText(btnE);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnF) {
+            setText(btnF);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnG) {
+            setText(btnG);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnH) {
+            setText(btnH);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnI) {
+            setText(btnI);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnJ) {
+            setText(btnJ);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnK) {
+            setText(btnK);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnL) {
+            setText(btnL);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnM) {
+            setText(btnM);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnN) {
+            setText(btnN);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnO) {
+            setText(btnO);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnP) {
+            setText(btnP);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnQ) {
+            setText(btnQ);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnR) {
+            setText(btnR);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnS) {
+            setText(btnS);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnT) {
+            setText(btnT);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnU) {
+            setText(btnU);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnV) {
+            setText(btnV);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnW) {
+            setText(btnW);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnX) {
+            setText(btnX);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnY) {
+            setText(btnY);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+        if (e.getSource() == btnZ) {
+            setText(btnZ);
+            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
+        }
+    }
+
+    /**
+     * Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
+     * Funktionsaufruf entsprechend des gedrückten Button
+     *
+     * @param e => ActionEvent des auslösenden Button
+     */
+    @FXML
+    private void gedrueckteTaste(ActionEvent e) {
+        if (e.getSource() == btnSenden) {
+            if (tfCodiert.getText().equals("")) {
+                new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
+                        "Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
+            } else {
+                sendeFunkspruch();
+            }
+        }
+        if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
+        if (e.getSource() == btnDelete) loeschen();
+        if (e.getSource() == btnReset) {
+            codierer.resetHardware();
+            this.resetDisplay = true;
+            this.lblSpruchschluessel.setText("");
+            this.setzeTagesSchluessel();
+        }
+    }
+
+    /**
+     * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
+     *
+     * @param leuchte       => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
+     * @param shiningLetter => "AN"  -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
+     *                      "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
+     */
+    private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
+        if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
+        else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
+            leuchte.setStyle("-fx-background-color: grey");
+            leuchte.setStyle("-fx-border-color:  #000000");
+        }
+    }
+    //endregion
+
+    //region Methoden
+
+    /**
+     * Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
+     *
+     * @param chiffLetter => chiffrierter Buchstabe
+     * @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
+     */
+    private Circle chiffCircle(char chiffLetter) {
+        switch (chiffLetter) {
+            case 'A':
+                return circA;
+            case 'B':
+                return circB;
+            case 'C':
+                return circC;
+            case 'D':
+                return circD;
+            case 'E':
+                return circE;
+            case 'F':
+                return circF;
+            case 'G':
+                return circG;
+            case 'H':
+                return circH;
+            case 'I':
+                return circI;
+            case 'J':
+                return circJ;
+            case 'K':
+                return circK;
+            case 'L':
+                return circL;
+            case 'M':
+                return circM;
+            case 'N':
+                return circN;
+            case 'O':
+                return circO;
+            case 'P':
+                return circP;
+            case 'Q':
+                return circQ;
+            case 'R':
+                return circR;
+            case 'S':
+                return circS;
+            case 'T':
+                return circT;
+            case 'U':
+                return circU;
+            case 'V':
+                return circV;
+            case 'W':
+                return circW;
+            case 'X':
+                return circX;
+            case 'Y':
+                return circY;
+            case 'Z':
+                return circZ;
+        }
+        return null;
+    }
+
+    /**
+     * Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
+     *
+     * @param mBtn : MenuButton der Walze
+     * @param mItm : MenuItem
+     */
+    private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
+        if (mBtn.getId().equals(mBtnStartPos1.getId())) {
+            setzePosition(1, mItm.getText().charAt(0));
+            this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
+        }
+        if (mBtn.getId().equals(mBtnStartPos2.getId())) {
+            setzePosition(2, mItm.getText().charAt(0));
+            this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
+        }
+        if (mBtn.getId().equals(mBtnStartPos3.getId())) {
+            setzePosition(3, mItm.getText().charAt(0));
+            this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
+        }
+        if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
+            setzeWalze(1, mItm.getText());
+            if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
+                    !mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
+                this.codierer.setzeWalzeNr(0,
+                        convertRoemischToZahl(mItm.getText()) + 1,
+                        mBtnNotchPos1.getText().charAt(0));
+            } else {
+                setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
+                new Fehler().showErrorDialog("error",
+                        "Walze nicht gefunden",
+                        "Es scheint so das wir von jeder Walze nur eine da haben");
+            }
+        }
+        if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
+            setzeWalze(2, mItm.getText());
+            if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
+                    !mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
+                this.codierer.setzeWalzeNr(1,
+                        convertRoemischToZahl(mItm.getText()) + 1,
+                        mBtnNotchPos2.getText().charAt(0));
+            } else {
+                setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
+                new Fehler().showErrorDialog("error",
+                        "Walze nicht gefunden",
+                        "Es scheint so das wir von jeder Walze nur eine da haben");
+            }
+        }
+        if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
+            setzeWalze(3, mItm.getText());
+            if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
+                    !mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
+                this.codierer.setzeWalzeNr(2,
+                        convertRoemischToZahl(mItm.getText()) + 1,
+                        mBtnNotchPos3.getText().charAt(0));
+            } else {
+                setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
+                new Fehler().showErrorDialog("error",
+                        "Walze nicht gefunden",
+                        "Es scheint so das wir von jeder Walze nur eine da haben");
+            }
+        }
+        if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
+            setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
+            this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
+        }
+        if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
+            setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
+            this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
+        }
+        if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
+            setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
+            this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
+        }
+        tfCodiert.setText("");
+        tfKlartext.setText("");
+    }
+
+    /**
+     * Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
+     * der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
+     */
+    private void loeschen() {
+        if (textEingabe.length() == 0) {
+            tfKlartext.setText("");
+            tfCodiert.setText("");
+        } else {
+            textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
+            textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
+            tfKlartext.setText(textEingabe);
+            tfCodiert.setText(textCodiert);
+            codierer.letztesZeichenLoeschen();
+            mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
+            mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
+            mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
+        }
+    }
+
+    /**
+     * Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
+     * sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
+     */
+    private void empfangeFunkspruch() {
+        progressDialogue("rx");
+
+        try {
+            if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
+                setzeTagesSchluessel();
+                tfKlartext.setText(this.empfangeneNachricht[2]);
+                tfCodiert.setText(this.empfangeneNachricht[1]);
+                resetDisplay = true;
+
+                // Spruchschluessel in das Feld lblSpruchschluessel schreiben
+                lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
+            }
+        } catch (NullPointerException ignored) {
+            new Fehler().showErrorDialog(
+                    "warning",
+                    "Keiner schreibt dir...",
+                    "Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
+        }
+    }
+
+    /**
+     * Senden der Nachricht mit Hilfe der Klasse Codierer
+     * Löscht die Textfelder tfKlartext und tfCodiert
+     */
+    private void sendeFunkspruch() {
+        this.tfKlartext.setText("");
+        this.tfCodiert.setText("");
+
+        progressDialogue("tx");
+    }
+
+    /**
+     * TODO
+     *
+     * @param strRxTx : String : RX oder TX
+     */
+    private void progressDialogue(String strRxTx) {
+        Task copyWorker = createWorker(strRxTx);
+
+        ProgressIndicator pi = new ProgressIndicator();
+        pi.setProgress(-1);
+
+        ProgressDialog dialog = new ProgressDialog(copyWorker);
+        dialog.initStyle(StageStyle.TRANSPARENT);
+        dialog.setTitle("Kommunikation zum Funkraum");
+        if (strRxTx.equals("rx")) {
+            dialog.setContentText("Empfange Nachricht");
+        } else if (strRxTx.equals("tx")) {
+            dialog.setContentText("Sende Nachricht");
+        }
+        dialog.setHeaderText(null);
+        dialog.setGraphic(pi);
+        dialog.initStyle(StageStyle.UTILITY);
+        new Thread(copyWorker).start();
+        dialog.showAndWait();
+    }
+
+    /**
+     * TODO
+     *
+     * @param strRxTx : String : RX oder TX
+     * @return boolean
+     */
+    private Task createWorker(String strRxTx) {
+        return new Task() {
+            @Override
+            protected Object call() {
+                if (strRxTx.equals("rx")) {
+                    empfangeneNachricht = codierer.empfangeNachricht();
+                } else if (strRxTx.equals("tx")) {
+                    try {
+                        codierer.sendeNachricht();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+
+                return true;
+            }
+        };
+    }
+
+    /**
+     * Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
+     * Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
+     * Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
+     * Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
+     * Aktualisierung der Walzenstellung
+     *
+     * @param pressedButton : gedrückter Knopf
+     */
+    private void setText(Button pressedButton) {
+        if (textEingabe.length() < 250) {
+            if (this.resetDisplay) {
+                this.tfCodiert.setText("");
+                this.tfKlartext.setText("");
+                this.lblSpruchschluessel.setText("");
+                this.resetDisplay = false;
+                this.codierer.resetHardware();
+                textCodiert = "";
+                textEingabe = "";
+                // Spruchschlüssel generieren und codieren
+                this.codierer.generateSpruchschluessel();
+                // Spruchschluessel in das Feld lblSpruchschluessel schreiben
+                lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
+            }
+            textEingabe += pressedButton.getText();
+            chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
+            textCodiert += chiffrierterBuchstabe;
+
+            tfKlartext.setText(textEingabe);
+            tfCodiert.setText(textCodiert);
+
+            // Position der Walzen aktuallisieren
+            mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
+            mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
+            mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
+        }
+    }
+
+    /**
+     * Konvertiert eine rämische Zahl in eine arabische Zahl
+     *
+     * @param nummer : String : Römische Zahl
+     * @return int : arabische Zahl
+     */
+    private int convertRoemischToZahl(String nummer) {
+        int result = 0;
+
+        switch (nummer) {
+            case "I":
+                result = 0;
+                break;
+            case "II":
+                result = 1;
+                break;
+            case "III":
+                result = 2;
+                break;
+            case "IV":
+                result = 3;
+                break;
+            case "V":
+                result = 4;
+                break;
+            default:
+                break;
+        }
+        return result;
+    }
+
+    /**
+     * Konvertiert eine arabische Zahl in eine rämische Zahl
+     *
+     * @param nummer : int : arabische Zahl
+     * @return String : römische Zahl
+     */
+    private String convertZahlToRoemisch(int nummer) {
+        String result = "";
+
+        switch (nummer) {
+            case 0:
+                result = "I";
+                break;
+            case 1:
+                result = "II";
+                break;
+            case 2:
+                result = "III";
+                break;
+            case 3:
+                result = "IV";
+                break;
+            case 4:
+                result = "V";
+                break;
+            default:
+                break;
+        }
+        return result;
+    }
+
+    /**
+     * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
+     * ->d.h. welche Walze sitzt auf welcher Position
+     *
+     * @param walzeRoemischNr => gibt die Walzennummer an
+     * @param walzenPosition  => gibt die Position der Walze
+     */
+    private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
+        switch (walzenPosition) {
+            case 1:
+                mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
+                break;
+            case 2:
+                mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
+                break;
+            case 3:
+                mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
+     * -> d.h. welche Walze sitzt auf welcher Position
+     *
+     * @param walzenPosition => gibt die Position der Walze
+     * @param walzeNr        => gibt die Walzennummer an
+     */
+    private void setzeWalze(int walzenPosition, int walzeNr) {
+        switch (walzenPosition) {
+            case 1:
+                mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
+                //codierer.setWalze(walzeNr, walzenPosition)
+                break;
+            case 2:
+                mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
+                break;
+            case 3:
+                mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
+     * Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
+     * um eine Stelle versetzt
+     *
+     * @param ringStellung   => gibt die walze an
+     * @param walzenPosition => gibt den notch der Walze (walze) an
+     */
+    private void setzeRing(int walzenPosition, int ringStellung) {
+        switch (walzenPosition) {
+            case 1:
+                mBtnNotchPos1.setText(ringNr[ringStellung]);
+                break;
+            case 2:
+                mBtnNotchPos2.setText(ringNr[ringStellung]);
+                break;
+            case 3:
+                mBtnNotchPos3.setText(ringNr[ringStellung]);
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * Setzt die Startposition/ aktuelle Position der Walze
+     *
+     * @param walze     => gibt die walze an
+     * @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
+     */
+    private void setzePosition(int walze, char buchstabe) {
+        switch (walze) {
+            case 1:
+                mBtnStartPos1.setText(String.valueOf(buchstabe));
+                break;
+            case 2:
+                mBtnStartPos2.setText(buchstabe + "");
+                break;
+            case 3:
+                mBtnStartPos3.setText(buchstabe + "");
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
+     */
+    private void setzeTagesSchluessel() {
+
+        // Umsprungpunkte anzeigen
+        mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
+        mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
+        mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
+
+        // Walzennummern anzeigen
+        setzeWalze(1, codierer.fetchWalzenNr()[0]);
+        setzeWalze(2, codierer.fetchWalzenNr()[1]);
+        setzeWalze(3, codierer.fetchWalzenNr()[2]);
+
+        // Position der Walzen anzeigen
+        mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
+        mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
+        mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
+
+        // Steckbrett Felder setzen
+        //setzeSteckverbindungen();
+
+        myToggleButtons();
+
+        // Setzt das Steckbrett
+        //generateSteckbrett();
+
+        // Felder zurück setzen
+        this.textCodiert = "";
+        this.textEingabe = "";
+        this.tfKlartext.setText("");
+        this.tfCodiert.setText("");
+    }
+
+    /**
+     * TODO: Doku
+     *
+     * @param kenngruppe : String : Die Kenngruppe die gesetzt werden soll
+     */
+    void setKenngruppe(String kenngruppe) {
+
+        // Initialisieren des Codierers und setzen der Kenngruppe
+        codierer = new Codierer(kenngruppe.toUpperCase());
+
+        this.codierer.resetHardware();
+
+        //Setzt die Kenngruppe in der GUI
+        lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
+
+        // Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
+        resetDisplay = true;
+
+        // Einstellungen aus dem Logbuch auslesen und setzen
+        setzeTagesSchluessel();
+        //setzeSteckverbindungen();
+    }
+
+    private enum BUCHSTABE_LEUCHTET {AN, AUS}
+    //endregion
 }
diff --git a/src/main/java/projekt/enigma/model/Codierer.java b/src/main/java/projekt/enigma/model/Codierer.java
index 87f4bff9b5cf866d1f192af0fdc8d94830ab8530..c12c1e827d48c65f9db8aaf25d2563fcdb730454 100644
--- a/src/main/java/projekt/enigma/model/Codierer.java
+++ b/src/main/java/projekt/enigma/model/Codierer.java
@@ -12,493 +12,497 @@ import java.util.Random;
  */
 public class Codierer {
 
-	//region Variablen
-	/**
-	 * Der Spruchschluessel als Klartext zur Codierung der Nachricht.
-	 */
-	private String spruchschluessel;
-
-	/**
-	 * Der Spruchschluessel, mit den Tageswerten aus dem Codebuch, codiert.
-	 */
-	private String spruchschluesselCodiert;
-
-	/**
-	 * Die Kenngruppe fuer die die versendeten Nachrichten gedacht sind.
-	 * Diese ist relevant fuer den Webservice (Funkraum).
-	 */
-	private String kenngruppe;
-
-	/**
-	 * Die Nachricht, welche der Benutzer eingibt, wird als String "nachricht" gespeichert
-	 * und im Laufe der Benutzung ergaenzt.
-	 */
-	private String nachricht;
-
-	/**
-	 * Das Hardware-Objekt. Hier werden alle hardwarerelevanten Baugruppen gespeichert und verarbeitet.
-	 */
-	private Hardware hardware;
-
-	/**
-	 * Im Codebuch sind die Tageswerte zu finden. Ueber dieses Objekt kann darauf zugegriffen werden.
-	 */
-	private Codebuch codebuch;
-	//endregion
-
-	//region Konstruktor
-
-	/**
-	 * Der Konstruktor des Codierers.
-	 * Hier werden die globalen Variablen auf ihre Standardwerte gesetzt sowie die Objekte initialisiert.
-	 */
-	public Codierer(String kenngruppe) {
-		this.nachricht = "";
-		this.spruchschluessel = "";
-		this.spruchschluesselCodiert = "";
-		this.kenngruppe = kenngruppe;
-		this.codebuch = new Codebuch();
-
-		this.codebuch.fetchTagesschluessel();
-	}
-	//endregion
-
-	//region Funktionen & Methoden
-	//region Reset & Initialisieren
-
-	/**
-	 * Hier lesen wir den heutigen Eintrag aus dem Codebuch aus und erstellen ein Codebuch-Objekt.
-	 * Nach dem Codebuch werden dann die Ringe auf die Walzen gesteckt und die Walzen anschließend
-	 * in die Hardware gebaut.
-	 * <br>
-	 * Ein Reflektor wird definiert, jedoch keine Werte zugewiesen, da wir nur einen besitzen und
-	 * deshalb alle Einstellungen hierfuer statisch im Reflektor definiert haben.
-	 * <br>
-	 * Das Steckbrett wird ebenfalls definiert und die notwendigen Kabel eingesteckt nach dem heutigen
-	 * Codebucheintrag.
-	 */
-	private void initialisiereHardware() {
-		this.nachricht = "";
-
-		// Das Steckbrett initialisieren
-		Steckbrett sb = new Steckbrett();
-		char[][] verbinder = this.codebuch.getSteckverbindung();
-
-		// Für jedes Kabel eine Verbindung auf dem Steckbrett setzen
-		for (char[] kabel : verbinder) {
-			sb.setzeVertauschung(kabel[0], kabel[1]);
-		}
-
-		// Die Hardware aus dem Koffer holen (initialisieren)
-		this.hardware = new Hardware();
-
-		// Den Ring an der Walze anbringen und die Walze dann in die Hardware einsetzen
-		this.hardware.setWalzen(0, this.codebuch.getWalzenlage()[0], this.codebuch.getRingstellung()[0]);
-		this.hardware.setWalzen(1, this.codebuch.getWalzenlage()[1], this.codebuch.getRingstellung()[1]);
-		this.hardware.setWalzen(2, this.codebuch.getWalzenlage()[2], this.codebuch.getRingstellung()[2]);
-
-		// Der Hardware das gesetzte Steckbrett zuweisen
-		this.hardware.setSteckbrett(sb);
-
-		// Ein Reflektor-Objekt erstellen und der Hardware bekanntgeben
-		this.hardware.setReflektor(new Reflektor());
-	}
-
-	/**
-	 * Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurueck.
-	 */
-	public void resetHardware() {
-		this.initialisiereHardware();
-	}
-
-	/**
-	 * Leert das Nachrichten-Objekt um eine neue Nachricht aufnehmen zu koennen.
-	 */
-	private void resetNachricht() {
-		this.nachricht = "";
-	}
-	//endregion
-
-	//region Nachrichten handler
-
-	/**
-	 * Befehl, die Nachricht an den Funker zu uebergeben.
-	 *
-	 * @throws IOException : Die Antwort konnte nicht gelesen werden.
-	 */
-	public void sendeNachricht() throws IOException {
-		String kopf = this.generateKopf();
-		new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht),
-				this.kenngruppe);
-		this.nachricht = "";
-		this.resetHardware();
-	}
-
-	/**
-	 * Gibt die letzte empfangene Nachricht zurueck.
-	 * <br>
-	 * nachricht[0]: String[]: Tag, an dem die Nachricht gesendet wurde.
-	 * nachricht[1]: String[]: Die verschluesselte Nachricht von Morsecode in Buchstaben konvertiert.
-	 * nachricht[2]: String[]: Nachricht im Klartext. Die Enigma Nachricht (nachricht[1]) mittels der
-	 * Tageseinstellungen (nachricht[0]) decodiert.
-	 */
-	public String[] empfangeNachricht() {
-		StringBuilder sb = new StringBuilder();
-		Morsecode mc = new Morsecode();
-		String[] nachricht = new String[3];
-
-		// Alte Nachrichten-Variable erstmal leeren
-		this.nachricht = "";
-
-		// Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum
-		String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
-
-		// Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat
-		if ((codierteNachricht[1] != null) && (codierteNachricht[1].split(" ").length > 3)) {
-			nachricht[0] = codierteNachricht[0];
-			nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
-			nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
-
-			sb.append(nachricht[1], 0, 16);
-
-			for (int i = 17; i <= nachricht[1].length(); ) {
-				if ((i + 5) < nachricht[1].length()) {
-					sb.append(nachricht[1], i, i + 5).append(" ");
-					i += 5;
-				} else {
-					sb.append(nachricht[1].substring(i));
-					break;
-				}
-			}
-			nachricht[1] = sb.toString();
-		}
-
-		return nachricht;
-	}
-	//endregion
-
-	//region Generatoren
-
-	/**
-	 * Hier wird ein neuer Spruchschluessel generiert.
-	 * <p>
-	 * Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
-	 * Tagesschluessel codiert, hinzugefuegt.
-	 * <br>
-	 * Hierfuer wird mittels der Funktion "randomBuchstabe" ein zufaelliger Buchstabe generiert,
-	 * und ueberprueft, ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
-	 * Wenn nicht, wird der Buchstabe dem Spruchschluessel hinzugefügt.
-	 * <br>
-	 * Dies wir nun so lange gemacht bis der Spruchschluessel eine Laenge von drei Zeichen hat.
-	 * Die Walzen werden anhand des Spruchschluessels automatisch gestellt.
-	 */
-	public void generateSpruchschluessel() {
-		String klartext = "";
-
-		while (klartext.length() < 3) {
-			String temp = this.randomBuchstabe();
-			if (!klartext.contains(temp)) {
-				klartext += temp;
-			}
-		}
-
-		this.spruchschluessel = klartext;
-		this.spruchschluesselCodiert = this.codiere(klartext + klartext, false);
-
-		// Walzen auf den Spruchschlüssel stellen
-		this.hardware.setzePosition(0, this.spruchschluessel.charAt(0));
-		this.hardware.setzePosition(1, this.spruchschluessel.charAt(1));
-		this.hardware.setzePosition(2, this.spruchschluessel.charAt(2));
-
-		// Die Kenngruppe codieren und in der Nachricht speichern
-		this.codiere(this.kenngruppe, true);
-	}
-
-	/**
-	 * Erstellen des Nachrichten-Kopfes.
-	 * Hierfuer wird die aktuelle Uhrzeit ausgelesen, die Laenge der Nachricht, sowie der, mit dem
-	 * Tagescode codierte, Spruchschluessel.
-	 *
-	 * @return String: Enthaelt die Uhrzeit, die Anzahl der Buchstaben der Nachricht und den Spruchschluessel.
-	 */
-	private String generateKopf() {
-		Calendar cal = Calendar.getInstance();
-
-		return String.format("%02d%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE)) + " "
-				+ this.nachricht.length() + " " + this.spruchschluesselCodiert.substring(0, 3) + " "
-				+ this.spruchschluesselCodiert.substring(3, 6) + " ";
-	}
-
-	/**
-	 * Generiert einen zufaelligen Buchstaben aus dem Alphabet.
-	 * In der Funktion gibt es den String "Alphabet", in welchem alle zulaessigen Zeichen eingetragen sind.
-	 * Aus diesem String wird nun zufaellig ein Zeichen ausgewaehlt und zurueckgegeben.
-	 *
-	 * @return String : ein zufaellig generierter Buchstabe.
-	 */
-	private String randomBuchstabe() {
-		return String.valueOf((char) ('A' + new Random().nextInt(26)));
-	}
-	//endregion
-
-	//region setze Funktionen
-
-	/**
-	 * Setzt den Ring auf der Walze auf einen neuen Umsprungwert.
-	 *
-	 * @param walzenPosition : int : Walze auf die der Ring gesteckt wird.
-	 * @param umsprungPunkt  : int : Umspringpunkt (Signal an linke Walze zum Drehen).
-	 */
-	public void setzeRing(int walzenPosition, int umsprungPunkt) {
-		this.hardware.setzeRing(walzenPosition, umsprungPunkt);
-	}
-
-	/**
-	 * Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein.
-	 * Mit Ringstellung(ringstellung) gibt man die Position des Umsprungpunktes an.
-	 *
-	 * @param walzenPosition : int : Position der Walze in der Enigma (1-2-3).
-	 * @param walzeNr        : int : Nummer der Walze die eingesetzt wird.
-	 * @param ringstellung   : int : Stellung des Ringes.
-	 */
-	public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) {
-		this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung);
-	}
-
-	/**
-	 * Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet das
-	 * Nachrichten Objekt
-	 *
-	 * @param walze     : int : Nummer der Walze
-	 * @param buchstabe : char : Buchstabe der zugewiesen soll
-	 */
-	public void setzeWalzenPosition(int walze, char buchstabe) {
-		this.resetNachricht();
-		this.hardware.setzePosition(walze, buchstabe);
-	}
-
-
-	/**
-	 * Setzt das Kabel in beide Ports ein und fuegt es dem Steckbrett-Array hinzu.
-	 *
-	 * @param port       : int : Kabel Nummer, welches am Steckbrett eingesteckt wird.
-	 * @param verbindung : String : Verbindung, welche die vertauschten Buchstaben angibt.
-	 * @return boolean : Wenn true, darf das Kabel gesteckt werden, wenn false, steckt da bereits schon eines.
-	 */
-	public boolean setzeSteckbrett(int port, String verbindung) {
-		return this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
-	}
-	//endregion
-
-	//region fetch Funktionen
-
-	/**
-	 * Gibt die Ringstellungen aus dem Codebuch zurueck.
-	 *
-	 * @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen.
-	 */
-	public int[] fetchRingstellung() {
-		return this.codebuch.getRingstellung();
-	}
-
-	/**
-	 * Gibt die Walzennummer aus dem Codebuch zurueck.
-	 *
-	 * @return int[] : Array mit den Nummern der drei eingesetzten Walzen.
-	 */
-	public int[] fetchWalzenNr() {
-		return this.codebuch.getWalzenlage();
-	}
-
-	/**
-	 * Gibt die Steckverbindungen aus dem Codebuch zurueck.
-	 *
-	 * @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett.
-	 */
-	public char[][] fetchSteckverbindungen() {
-		return this.codebuch.getSteckverbindung();
-	}
-
-	/**
-	 * Gibt die aktuellen Buchstaben auf den Walzen zurueck.
-	 *
-	 * @return char[] : Walzen Array mit der aktuellen Positionen.
-	 */
-	public char[] fetchWalzen() {
-		char[] walzen = new char[3];
-		walzen[0] = this.hardware.getWalzen()[0].getPosition();
-		walzen[1] = this.hardware.getWalzen()[1].getPosition();
-		walzen[2] = this.hardware.getWalzen()[2].getPosition();
-
-		return walzen;
-	}
-
-	/**
-	 * Ueberprueft welche Buchstaben noch zur Vertauschung verfuegbar sind.
-	 *
-	 * @param port: Zahl zwischen 0-9: entspricht der Kabelnummer.
-	 * @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck.
-	 */
-	public String fetchVerfuegbareBuchstaben(int port) {
-		return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port);
-	}
-
-	/**
-	 * Gibt die Walzennummer einer Walze auf Position (walzePos) zurück
-	 *
-	 * @param walzePos : int : Position der Walze
-	 * @return int : Nummer der eingesetzten Walze
-	 */
-	public int fetchWalzenNr(int walzePos) {
-		return this.hardware.getWalzen()[walzePos].getWalzenNr();
-	}
-	//endregion
-
-	//region codierer
-
-	/**
-	 * Hier wird ein einzelner Buchstabe verschluesselt.
-	 * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
-	 * In der Regel ist dies der Fall.
-	 *
-	 * @param buchstabe : char : Der zu codierende Buchstabe.
-	 * @param save      : boolean : Nachricht speichern oder nicht.
-	 * @return char     : Der codierte Buchstabe.
-	 */
-	public char codiere(char buchstabe, boolean save) {
-		char codiert = this.hardware.codiere(buchstabe);
-
-		if (save) {
-			this.nachricht += codiert;
-		}
-
-		return codiert;
-	}
-
-	/**
-	 * Codiert den uebergebenen String.
-	 * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
-	 * In der Regel ist dies der Fall.
-	 *
-	 * @param klartext : String : Der zu codierende Text.
-	 * @param save     : boolean : Nachricht speichern oder nicht.
-	 * @return String : Der codierte Text zusaetzlich als Rueckgabe.
-	 */
-	public String codiere(String klartext, boolean save) {
-		StringBuilder sb = new StringBuilder();
-
-		for (char buchstabe : klartext.toCharArray()) {
-			sb.append(this.codiere(buchstabe, save));
-		}
-
-		return sb.toString();
-	}
-
-	/**
-	 * Diese Funktion erwartet als (codierteNachricht) eine korrekte Enigma-Nachricht.
-	 * Ihr muss auch der Tag der Codierung mitgegeben werden. Dieser weiss dein Funker im Funkraum.
-	 * In der Regel ist dies der Tag des Nachrichtenempfangs.
-	 *
-	 * @param codierteNachricht : String : Enigma-codierte Nachricht.
-	 * @param tag               : int : Tag der Nachricht.
-	 * @return String : decodierte Nachricht.
-	 */
-	private String decodiere(String codierteNachricht, int tag) {
-
-		// Hardware reseten und Tageseinstellungen aus dem Codebuch laden
-		this.codebuch.fetchTagesschluessel(tag);
-		this.initialisiereHardware();
-
-		// Nachricht splitten mit whitespace als delimiter
-		String[] nachricht = codierteNachricht.split(" ");
-		StringBuilder sb = new StringBuilder();
-
-		// Uhrzeit und Zeichenanzahl der Nachricht
-		sb.append(nachricht[0]).append(" ");
-		sb.append(nachricht[1]).append(" ");
-
-		// Spruchschluessel
-		String spruchschluessel = this.decodiereString(nachricht[2]);
-
-		sb.append(spruchschluessel).append(" ");
-		sb.append(this.decodiereString(nachricht[3])).append(" ");
-
-		// Walzen neu einstellen mit dem Spruchschluessel
-		this.hardware.setzePosition(0, spruchschluessel.charAt(0));
-		this.hardware.setzePosition(1, spruchschluessel.charAt(1));
-		this.hardware.setzePosition(2, spruchschluessel.charAt(2));
-
-		// Nachricht decodieren
-		sb.append(this.decodiereString(nachricht[4]));
-
-		return sb.toString();
-	}
-
-	/**
-	 * Zerlegt den uebergebenen String in einen char-Array und decodiert jedes Zeichen.
-	 * Der String wird dann decodiert zurueckgegeben.
-	 *
-	 * @param nachricht : String : Der zu decodierende Text.
-	 * @return String : Der decodierte Text.
-	 */
-	private String decodiereString(String nachricht) {
-		StringBuilder sb = new StringBuilder();
-
-		for (char buchstabe : nachricht.toCharArray()) {
-			if (buchstabe > 0) {
-				sb.append(this.hardware.codiere(buchstabe));
-			}
-		}
-
-		return sb.toString();
-	}
-	//endregion
-
-	//region Sonstige
-
-	/**
-	 * Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck.
-	 *
-	 * @param empfangeneNachricht : String : Die empfangene Nachricht als String.
-	 * @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde.
-	 */
-	public String empfangenerSpruchschluessel(String empfangeneNachricht) {
-		String[] nachricht = empfangeneNachricht.split(" ");
-
-		return nachricht[2];
-	}
-
-	/**
-	 * Loescht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurueck.
-	 */
-	public void letztesZeichenLoeschen() {
-		this.hardware.dreheWalzen(-1);
-		this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
-	}
-	//endregion
-
-	//endregion
-
-	//region Getter
-
-	/**
-	 * Liest die Kenngruppe aus, welche die Maschine gerade besitzt. Frueher war dies eine eindeutige Nummer,
-	 * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
-	 *
-	 * @return String : Kenngruppe
-	 */
-	public String getKenngruppe() {
-		return kenngruppe;
-	}
-
-	/**
-	 * Der Spruchschluessel wird, zur internen Verwendung, auch im Klartext gespeichert.
-	 * Wir brauchen diesen dann zum Codieren der eigentlichen Nachricht.
-	 *
-	 * @return String : Der Klartext des Spruchschluessels
-	 */
-	public String getSpruchschluessel() {
-		return this.spruchschluessel;
-	}
-	//endregion
+    //region Variablen
+    /**
+     * Der Spruchschluessel als Klartext zur Codierung der Nachricht.
+     */
+    private String spruchschluessel;
+
+    /**
+     * Der Spruchschluessel, mit den Tageswerten aus dem Codebuch, codiert.
+     */
+    private String spruchschluesselCodiert;
+
+    /**
+     * Die Kenngruppe fuer die die versendeten Nachrichten gedacht sind.
+     * Diese ist relevant fuer den Webservice (Funkraum).
+     */
+    private String kenngruppe;
+
+    /**
+     * Die Nachricht, welche der Benutzer eingibt, wird als String "nachricht" gespeichert
+     * und im Laufe der Benutzung ergaenzt.
+     */
+    private String nachricht;
+
+    /**
+     * Das Hardware-Objekt. Hier werden alle hardwarerelevanten Baugruppen gespeichert und verarbeitet.
+     */
+    private Hardware hardware;
+
+    /**
+     * Im Codebuch sind die Tageswerte zu finden. Ueber dieses Objekt kann darauf zugegriffen werden.
+     */
+    private Codebuch codebuch;
+    //endregion
+
+    //region Konstruktor
+
+    /**
+     * Der Konstruktor des Codierers.
+     * Hier werden die globalen Variablen auf ihre Standardwerte gesetzt sowie die Objekte initialisiert.
+     */
+    public Codierer(String kenngruppe) {
+        this.nachricht = "";
+        this.spruchschluessel = "";
+        this.spruchschluesselCodiert = "";
+        this.kenngruppe = kenngruppe;
+        this.codebuch = new Codebuch();
+
+        this.codebuch.fetchTagesschluessel();
+    }
+    //endregion
+
+    //region Funktionen & Methoden
+    //region Reset & Initialisieren
+
+    /**
+     * Hier lesen wir den heutigen Eintrag aus dem Codebuch aus und erstellen ein Codebuch-Objekt.
+     * Nach dem Codebuch werden dann die Ringe auf die Walzen gesteckt und die Walzen anschließend
+     * in die Hardware gebaut.
+     * <br>
+     * Ein Reflektor wird definiert, jedoch keine Werte zugewiesen, da wir nur einen besitzen und
+     * deshalb alle Einstellungen hierfuer statisch im Reflektor definiert haben.
+     * <br>
+     * Das Steckbrett wird ebenfalls definiert und die notwendigen Kabel eingesteckt nach dem heutigen
+     * Codebucheintrag.
+     */
+    private void initialisiereHardware() {
+        this.nachricht = "";
+
+        // Das Steckbrett initialisieren
+        Steckbrett sb = new Steckbrett();
+        char[][] verbinder = this.codebuch.getSteckverbindung();
+
+        // Für jedes Kabel eine Verbindung auf dem Steckbrett setzen
+        for (char[] kabel : verbinder) {
+            sb.setzeVertauschung(kabel[0], kabel[1]);
+        }
+
+        // Die Hardware aus dem Koffer holen (initialisieren)
+        this.hardware = new Hardware();
+
+        // Den Ring an der Walze anbringen und die Walze dann in die Hardware einsetzen
+        this.hardware.setWalzen(0, this.codebuch.getWalzenlage()[0], this.codebuch.getRingstellung()[0]);
+        this.hardware.setWalzen(1, this.codebuch.getWalzenlage()[1], this.codebuch.getRingstellung()[1]);
+        this.hardware.setWalzen(2, this.codebuch.getWalzenlage()[2], this.codebuch.getRingstellung()[2]);
+
+        // Der Hardware das gesetzte Steckbrett zuweisen
+        this.hardware.setSteckbrett(sb);
+
+        // Ein Reflektor-Objekt erstellen und der Hardware bekanntgeben
+        this.hardware.setReflektor(new Reflektor());
+    }
+
+    /**
+     * Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurueck.
+     */
+    public void resetHardware() {
+        this.initialisiereHardware();
+    }
+
+    /**
+     * Leert das Nachrichten-Objekt um eine neue Nachricht aufnehmen zu koennen.
+     */
+    private void resetNachricht() {
+        this.nachricht = "";
+    }
+    //endregion
+
+    //region Nachrichten handler
+
+    /**
+     * Befehl, die Nachricht an den Funker zu uebergeben.
+     *
+     * @throws IOException : Die Antwort konnte nicht gelesen werden.
+     */
+    public void sendeNachricht() throws IOException {
+        String kopf = this.generateKopf();
+        new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht),
+                this.kenngruppe);
+        this.nachricht = "";
+        this.resetHardware();
+    }
+
+    /**
+     * Gibt die letzte empfangene Nachricht zurueck.
+     * <br>
+     * nachricht[0]: String[]: Tag, an dem die Nachricht gesendet wurde.
+     * nachricht[1]: String[]: Die verschluesselte Nachricht von Morsecode in Buchstaben konvertiert.
+     * nachricht[2]: String[]: Nachricht im Klartext. Die Enigma Nachricht (nachricht[1]) mittels der
+     * Tageseinstellungen (nachricht[0]) decodiert.
+     */
+    public String[] empfangeNachricht() {
+        StringBuilder sb = new StringBuilder();
+        Morsecode mc = new Morsecode();
+        String[] nachricht = new String[3];
+
+        // Alte Nachrichten-Variable erstmal leeren
+        this.nachricht = "";
+
+        // Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum
+        String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
+
+        // Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat
+        if ((codierteNachricht[1] != null) && (codierteNachricht[1].split(" ").length > 3)) {
+            nachricht[0] = codierteNachricht[0];
+            nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
+            nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
+
+            sb.append(nachricht[1], 0, 16);
+
+            for (int i = 17; i <= nachricht[1].length(); ) {
+                if ((i + 5) < nachricht[1].length()) {
+                    sb.append(nachricht[1], i, i + 5).append(" ");
+                    i += 5;
+                } else {
+                    sb.append(nachricht[1].substring(i));
+                    break;
+                }
+            }
+            nachricht[1] = sb.toString();
+        }
+
+        return nachricht;
+    }
+    //endregion
+
+    //region Generatoren
+
+    /**
+     * Hier wird ein neuer Spruchschluessel generiert.
+     * <p>
+     * Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
+     * Tagesschluessel codiert, hinzugefuegt.
+     * <br>
+     * Hierfuer wird mittels der Funktion "randomBuchstabe" ein zufaelliger Buchstabe generiert,
+     * und ueberprueft, ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
+     * Wenn nicht, wird der Buchstabe dem Spruchschluessel hinzugefügt.
+     * <br>
+     * Dies wir nun so lange gemacht bis der Spruchschluessel eine Laenge von drei Zeichen hat.
+     * Die Walzen werden anhand des Spruchschluessels automatisch gestellt.
+     */
+    public void generateSpruchschluessel() {
+        String klartext = "";
+
+        while (klartext.length() < 3) {
+            String temp = this.randomBuchstabe();
+            if (!klartext.contains(temp)) {
+                klartext += temp;
+            }
+        }
+
+        this.spruchschluessel = klartext;
+        this.spruchschluesselCodiert = this.codiere(klartext + klartext, false);
+
+        // Walzen auf den Spruchschlüssel stellen
+        this.hardware.setzePosition(0, this.spruchschluessel.charAt(0));
+        this.hardware.setzePosition(1, this.spruchschluessel.charAt(1));
+        this.hardware.setzePosition(2, this.spruchschluessel.charAt(2));
+
+        // Die Kenngruppe codieren und in der Nachricht speichern
+        this.codiere(this.kenngruppe, true);
+    }
+
+    /**
+     * Erstellen des Nachrichten-Kopfes.
+     * Hierfuer wird die aktuelle Uhrzeit ausgelesen, die Laenge der Nachricht, sowie der, mit dem
+     * Tagescode codierte, Spruchschluessel.
+     *
+     * @return String: Enthaelt die Uhrzeit, die Anzahl der Buchstaben der Nachricht und den Spruchschluessel.
+     */
+    private String generateKopf() {
+        Calendar cal = Calendar.getInstance();
+
+        return String.format("%02d%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)) + " "
+                + this.nachricht.length() + " " + this.spruchschluesselCodiert.substring(0, 3) + " "
+                + this.spruchschluesselCodiert.substring(3, 6) + " ";
+    }
+
+    /**
+     * Generiert einen zufaelligen Buchstaben aus dem Alphabet.
+     * In der Funktion gibt es den String "Alphabet", in welchem alle zulaessigen Zeichen eingetragen sind.
+     * Aus diesem String wird nun zufaellig ein Zeichen ausgewaehlt und zurueckgegeben.
+     *
+     * @return String : ein zufaellig generierter Buchstabe.
+     */
+    private String randomBuchstabe() {
+        return String.valueOf((char) ('A' + new Random().nextInt(26)));
+    }
+    //endregion
+
+    //region setze Funktionen
+
+    /**
+     * Setzt den Ring auf der Walze auf einen neuen Umsprungwert.
+     *
+     * @param walzenPosition : int : Walze auf die der Ring gesteckt wird.
+     * @param umsprungPunkt  : int : Umspringpunkt (Signal an linke Walze zum Drehen).
+     */
+    public void setzeRing(int walzenPosition, int umsprungPunkt) {
+        this.hardware.setzeRing(walzenPosition, umsprungPunkt);
+    }
+
+    /**
+     * Setzt die Walze (walzeNr) in die Position (walzenPosition) der Enigma ein.
+     * Mit Ringstellung(ringstellung) gibt man die Position des Umsprungpunktes an.
+     *
+     * @param walzenPosition : int : Position der Walze in der Enigma (1-2-3).
+     * @param walzeNr        : int : Nummer der Walze die eingesetzt wird.
+     * @param ringstellung   : int : Stellung des Ringes.
+     */
+    public void setzeWalzeNr(int walzenPosition, int walzeNr, int ringstellung) {
+        this.hardware.setzeWalzenNr(walzenPosition, walzeNr, ringstellung);
+    }
+
+    /**
+     * Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet das
+     * Nachrichten Objekt
+     *
+     * @param walze     : int : Nummer der Walze
+     * @param buchstabe : char : Buchstabe der zugewiesen soll
+     */
+    public void setzeWalzenPosition(int walze, char buchstabe) {
+        this.resetNachricht();
+        this.hardware.setzePosition(walze, buchstabe);
+    }
+
+
+    /**
+     * Setzt das Kabel in beide Ports ein und fuegt es dem Steckbrett-Array hinzu.
+     *
+     * @param port       : int : Kabel Nummer, welches am Steckbrett eingesteckt wird.
+     * @param verbindung : String : Verbindung, welche die vertauschten Buchstaben angibt.
+     * @return boolean : Wenn true, darf das Kabel gesteckt werden, wenn false, steckt da bereits schon eines.
+     */
+    public boolean setzeSteckbrett(int port, String verbindung) {
+        if (verbindung.equals("")) {
+            verbindung = "  ";
+        }
+
+        return this.hardware.getSteckbrett().setzeVertauschung(port, verbindung.charAt(0), verbindung.charAt(1));
+    }
+    //endregion
+
+    //region fetch Funktionen
+
+    /**
+     * Gibt die Ringstellungen aus dem Codebuch zurueck.
+     *
+     * @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen.
+     */
+    public int[] fetchRingstellung() {
+        return this.codebuch.getRingstellung();
+    }
+
+    /**
+     * Gibt die Walzennummer aus dem Codebuch zurueck.
+     *
+     * @return int[] : Array mit den Nummern der drei eingesetzten Walzen.
+     */
+    public int[] fetchWalzenNr() {
+        return this.codebuch.getWalzenlage();
+    }
+
+    /**
+     * Gibt die Steckverbindungen aus dem Codebuch zurueck.
+     *
+     * @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett.
+     */
+    public char[][] fetchSteckverbindungen() {
+        return this.codebuch.getSteckverbindung();
+    }
+
+    /**
+     * Gibt die aktuellen Buchstaben auf den Walzen zurueck.
+     *
+     * @return char[] : Walzen Array mit der aktuellen Positionen.
+     */
+    public char[] fetchWalzen() {
+        char[] walzen = new char[3];
+        walzen[0] = this.hardware.getWalzen()[0].getPosition();
+        walzen[1] = this.hardware.getWalzen()[1].getPosition();
+        walzen[2] = this.hardware.getWalzen()[2].getPosition();
+
+        return walzen;
+    }
+
+    /**
+     * Ueberprueft welche Buchstaben noch zur Vertauschung verfuegbar sind.
+     *
+     * @param port: Zahl zwischen 0-9: entspricht der Kabelnummer.
+     * @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck.
+     */
+    public String fetchVerfuegbareBuchstaben(int port) {
+        return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port);
+    }
+
+    /**
+     * Gibt die Walzennummer einer Walze auf Position (walzePos) zurück
+     *
+     * @param walzePos : int : Position der Walze
+     * @return int : Nummer der eingesetzten Walze
+     */
+    public int fetchWalzenNr(int walzePos) {
+        return this.hardware.getWalzen()[walzePos].getWalzenNr();
+    }
+    //endregion
+
+    //region codierer
+
+    /**
+     * Hier wird ein einzelner Buchstabe verschluesselt.
+     * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
+     * In der Regel ist dies der Fall.
+     *
+     * @param buchstabe : char : Der zu codierende Buchstabe.
+     * @param save      : boolean : Nachricht speichern oder nicht.
+     * @return char     : Der codierte Buchstabe.
+     */
+    public char codiere(char buchstabe, boolean save) {
+        char codiert = this.hardware.codiere(buchstabe);
+
+        if (save) {
+            this.nachricht += codiert;
+        }
+
+        return codiert;
+    }
+
+    /**
+     * Codiert den uebergebenen String.
+     * Man muss hier ebenfalls mitgeben, ob der codierte String in "nachricht" gespeichert werden soll oder nicht.
+     * In der Regel ist dies der Fall.
+     *
+     * @param klartext : String : Der zu codierende Text.
+     * @param save     : boolean : Nachricht speichern oder nicht.
+     * @return String : Der codierte Text zusaetzlich als Rueckgabe.
+     */
+    public String codiere(String klartext, boolean save) {
+        StringBuilder sb = new StringBuilder();
+
+        for (char buchstabe : klartext.toCharArray()) {
+            sb.append(this.codiere(buchstabe, save));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * Diese Funktion erwartet als (codierteNachricht) eine korrekte Enigma-Nachricht.
+     * Ihr muss auch der Tag der Codierung mitgegeben werden. Dieser weiss dein Funker im Funkraum.
+     * In der Regel ist dies der Tag des Nachrichtenempfangs.
+     *
+     * @param codierteNachricht : String : Enigma-codierte Nachricht.
+     * @param tag               : int : Tag der Nachricht.
+     * @return String : decodierte Nachricht.
+     */
+    private String decodiere(String codierteNachricht, int tag) {
+
+        // Hardware reseten und Tageseinstellungen aus dem Codebuch laden
+        this.codebuch.fetchTagesschluessel(tag);
+        this.initialisiereHardware();
+
+        // Nachricht splitten mit whitespace als delimiter
+        String[] nachricht = codierteNachricht.split(" ");
+        StringBuilder sb = new StringBuilder();
+
+        // Uhrzeit und Zeichenanzahl der Nachricht
+        sb.append(nachricht[0]).append(" ");
+        sb.append(nachricht[1]).append(" ");
+
+        // Spruchschluessel
+        String spruchschluessel = this.decodiereString(nachricht[2]);
+
+        sb.append(spruchschluessel).append(" ");
+        sb.append(this.decodiereString(nachricht[3])).append(" ");
+
+        // Walzen neu einstellen mit dem Spruchschluessel
+        this.hardware.setzePosition(0, spruchschluessel.charAt(0));
+        this.hardware.setzePosition(1, spruchschluessel.charAt(1));
+        this.hardware.setzePosition(2, spruchschluessel.charAt(2));
+
+        // Nachricht decodieren
+        sb.append(this.decodiereString(nachricht[4]));
+
+        return sb.toString();
+    }
+
+    /**
+     * Zerlegt den uebergebenen String in einen char-Array und decodiert jedes Zeichen.
+     * Der String wird dann decodiert zurueckgegeben.
+     *
+     * @param nachricht : String : Der zu decodierende Text.
+     * @return String : Der decodierte Text.
+     */
+    private String decodiereString(String nachricht) {
+        StringBuilder sb = new StringBuilder();
+
+        for (char buchstabe : nachricht.toCharArray()) {
+            if (buchstabe > 0) {
+                sb.append(this.hardware.codiere(buchstabe));
+            }
+        }
+
+        return sb.toString();
+    }
+    //endregion
+
+    //region Sonstige
+
+    /**
+     * Liest aus der empfangenen Nachricht den Spruchschluessel aus und gibt ihn zurueck.
+     *
+     * @param empfangeneNachricht : String : Die empfangene Nachricht als String.
+     * @return String : Der Spruchschluessel, mit welcher die Nachricht codiert wurde.
+     */
+    public String empfangenerSpruchschluessel(String empfangeneNachricht) {
+        String[] nachricht = empfangeneNachricht.split(" ");
+
+        return nachricht[2];
+    }
+
+    /**
+     * Loescht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurueck.
+     */
+    public void letztesZeichenLoeschen() {
+        this.hardware.dreheWalzen(-1);
+        this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
+    }
+    //endregion
+
+    //endregion
+
+    //region Getter
+
+    /**
+     * Liest die Kenngruppe aus, welche die Maschine gerade besitzt. Frueher war dies eine eindeutige Nummer,
+     * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
+     *
+     * @return String : Kenngruppe
+     */
+    public String getKenngruppe() {
+        return kenngruppe;
+    }
+
+    /**
+     * Der Spruchschluessel wird, zur internen Verwendung, auch im Klartext gespeichert.
+     * Wir brauchen diesen dann zum Codieren der eigentlichen Nachricht.
+     *
+     * @return String : Der Klartext des Spruchschluessels
+     */
+    public String getSpruchschluessel() {
+        return this.spruchschluessel;
+    }
+    //endregion
 }
diff --git a/src/main/java/projekt/enigma/model/Steckbrett.java b/src/main/java/projekt/enigma/model/Steckbrett.java
index 97674abe9776b63e8a0729c1548775733b64b500..71906d5e4d588ce2eb9b55790b500c9642a96c54 100644
--- a/src/main/java/projekt/enigma/model/Steckbrett.java
+++ b/src/main/java/projekt/enigma/model/Steckbrett.java
@@ -74,12 +74,31 @@ public class Steckbrett {
      * @return boolean : Wenn die Vertauschung zulaessig ist, true, ansonsten false.
      */
     public boolean setzeVertauschung(int steckbrettPort, char buchstabe1, char buchstabe2) {
-        if (!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2)) {
-            originalBuchstaben = originalBuchstaben.replace(originalBuchstaben.charAt(steckbrettPort), buchstabe1);
-            getauschteBuchstaben
-                    = getauschteBuchstaben.replace(getauschteBuchstaben.charAt(steckbrettPort), buchstabe2);
+        char[] original;
+        char[] getauscht;
+
+        new Fehler().debug("setzeVertauschung(int " + steckbrettPort + ", char |" + buchstabe1 + "|, char |" + buchstabe2 + "|)", false);
+
+        if ((!ueberpruefeVertauschungen(buchstabe1) && !ueberpruefeVertauschungen(buchstabe2)) ||
+                (buchstabe1 == ' ' && buchstabe2 == ' ')) {
+
+            new Fehler().debug("-> Original:\t" + originalBuchstaben, false);
+            new Fehler().debug("-> Getauscht:\t" + getauschteBuchstaben, false);
+            original = originalBuchstaben.toCharArray();
+            getauscht = getauschteBuchstaben.toCharArray();
+
+            original[steckbrettPort] = buchstabe1;
+            getauscht[steckbrettPort] = buchstabe2;
+
+            originalBuchstaben = String.valueOf(original);
+            getauschteBuchstaben = String.valueOf(getauscht);
+            new Fehler().debug("<- Original:\t" + originalBuchstaben, false);
+            new Fehler().debug("<- Getauscht:\t" + getauschteBuchstaben, false);
+
+            new Fehler().debug("true\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
             return true;
         } else {
+            new Fehler().debug("false\tOS: |" + originalBuchstaben + "| GS: |" + getauschteBuchstaben + "|", false);
             return false;
         }
     }
@@ -94,7 +113,7 @@ public class Steckbrett {
      *
      * @param buchstabe : Character: zu pruefender Buchstabe.
      * @return result : boolean : Wenn false, dann darf der Buchstabe genutzt werden. Wenn er schon vorhanden ist,
-     *                            wird true zurueckgegeben.
+     * wird true zurueckgegeben.
      */
     public boolean ueberpruefeVertauschungen(Character buchstabe) {
         boolean result = false;
diff --git a/src/main/java/projekt/enigma/view/ChkBoxGridPane.java b/src/main/java/projekt/enigma/view/ChkBoxGridPane.java
index 6b762fa9c4fe24de551ec84e8c514cdbefad051e..395dac8569059894936b70fc20ab8e44617f44d6 100644
--- a/src/main/java/projekt/enigma/view/ChkBoxGridPane.java
+++ b/src/main/java/projekt/enigma/view/ChkBoxGridPane.java
@@ -1,69 +1,138 @@
 package projekt.enigma.view;
 
+import javafx.geometry.Insets;
 import javafx.geometry.Pos;
 import javafx.scene.control.CheckBox;
+import javafx.scene.control.ToggleButton;
 import javafx.scene.layout.GridPane;
+import projekt.enigma.model.Codierer;
+
+import java.util.Arrays;
 
 /**
  * TODO: Doku
  */
 public class ChkBoxGridPane extends GridPane {
-	private CheckBox[] checkbox;
-	private char[] alphabet;
-	private int charSize;
+    private CheckBox[] checkbox;
+    private String checkedBuchstaben;
+    private int charSize;
+    private Codierer codierer;
+    private int port;
+    private char[] verfuegbareBuchstaben;
+    private ToggleButton tBtnPort;
+
+    /**
+     * TODO: Doku
+     *
+     * @param codierer : Codierer
+     * @param port     : int
+     */
+    public ChkBoxGridPane(Codierer codierer, int port, ToggleButton tBtnPort) {
+        this.codierer = codierer;
+        this.port = port;
+        this.tBtnPort = tBtnPort;
+        this.verfuegbareBuchstaben = this.codierer.fetchVerfuegbareBuchstaben(this.port).toCharArray();
+        Arrays.sort(this.verfuegbareBuchstaben);
+        charSize = this.verfuegbareBuchstaben.length;
+        this.checkedBuchstaben = tBtnPort.getText();
+        initializeComponents();
+    }
+
+    /**
+     * Es wird ein GridPane erzeugt, das zwei Spalten und abhängig von der Länge des
+     * Arrays (Character[] alphabet) Reihen hat. Das Label der CheckBoxen soll
+     * abhängig von deren Index links bzw. recht erzeugt werden
+     */
+    private void initializeComponents() {
+        checkbox = new CheckBox[charSize];
+
+        this.setAlignment(Pos.CENTER);
+
+        System.out.println("----->>>>>" + String.valueOf(this.verfuegbareBuchstaben));
+
+        for (int i = 0; i < this.verfuegbareBuchstaben.length; i++) {
+            if (this.verfuegbareBuchstaben[i] != 20 && this.verfuegbareBuchstaben[i] != ' ') {
+                checkbox[i] = new CheckBox(this.verfuegbareBuchstaben[i] + "");
+                checkbox[i].setPadding(new Insets(1, 1, 1, 1));
 
-	/**
-	 * TODO: Doku
-	 * @param alphabet
-	 */
-	public ChkBoxGridPane(char[] alphabet) {
-		charSize = alphabet.length;
-		this.alphabet = alphabet;
-		initializeComponents();
-	}
+                if (!checkedBuchstaben.equals("")) {
+                    if (!checkedBuchstaben.contains(String.valueOf(this.verfuegbareBuchstaben[i]))) {
+                        checkbox[i].setDisable(true);
+                    } else {
+                        checkbox[i].setSelected(true);
+                    }
+                } else {
+                    checkbox[i].setSelected(false);
+                    checkbox[i].setDisable(false);
+                }
 
-	/**
-	 * Es wird ein GridPane erzeugt, das zwei Spalten und abhängig von der Länge des
-	 * Arrays (Character[] alphabet) Reihen hat. Das Label der CheckBoxen soll
-	 * abhängig von deren Index links bzw. recht erzeugt werden
-	 */
-	private void initializeComponents() {
-		checkbox = new CheckBox[charSize];
-		this.setAlignment(Pos.CENTER);
+                checkbox[i].selectedProperty().addListener((observable, oldValue, newValue) -> {
+                    String portSelection = "";
+                    int zaehler = 0;
 
-		for (int i = 0; i < alphabet.length; i++) {
-			checkbox[i] = new CheckBox(alphabet[i] + "");
+                    for (CheckBox cb : checkbox) {
+                        if (cb != null && cb.isSelected()) {
+                            zaehler++;
+                        }
+                    }
+                    if (zaehler == 1 || zaehler == 0) {
+                        for (CheckBox cb : checkbox) {
+                            if (cb != null && cb.isDisabled()) {
+                                cb.setDisable(false);
+                            }
+                        }
+                    }
+                    if (zaehler == 0) {
+                        this.codierer.setzeSteckbrett(this.port, "");
+                        tBtnPort.setText(portSelection);
+                    }
+                    if (zaehler == 2) {
+                        for (CheckBox cb : checkbox) {
+                            if (cb != null && !cb.isSelected()) {
+                                cb.setDisable(true);
+                            } else {
+                                if (cb != null) {
+                                    portSelection += cb.getText();
+                                }
+                            }
+                        }
+                        this.codierer.setzeSteckbrett(this.port, "");
+                        this.codierer.setzeSteckbrett(this.port, portSelection);
+                        tBtnPort.setText(portSelection);
+                    }
+                });
 
-			this.addRow(i + 1);
-			this.add(checkbox[i], 2, i + 1, 1, 1);
-			//if (i==0)checkbox[0].setSelected(true);
-		}
-		this.setVisible(true);
-	}
+                this.addRow(i + 1);
+                this.add(checkbox[i], 2, i + 1, 1, 1);
+            }
+        }
+        this.setVisible(true);
+    }
 
-	/**
-	 * Prüft welche CheckBox aus gewählt und gibt deren
-	 * Index zurück
-	 *
-	 * @return Integer
-	 */
-	private Integer isCheckedChkBoxIndex() {
-		for (int i = 0; i < charSize; i++) {
-			if (checkbox[i].isSelected()) {
-				return i;
-			} else {
-				return null;
-			}
-		}
-		return null;
-	}
+    /**
+     * Prüft welche CheckBox aus gewählt und gibt deren
+     * Index zurück
+     *
+     * @return Integer
+     */
+    private Integer isCheckedChkBoxIndex() {
+        for (int i = 0; i < charSize; i++) {
+            if (checkbox[i].isSelected()) {
+                return i;
+            } else {
+                return null;
+            }
+        }
+        return null;
+    }
 
-	/**
-	 * TODO: Doku
-	 * @return
-	 */
-	public int getCharSize() {
-		return charSize;
-	}
+    /**
+     * TODO: Doku
+     *
+     * @return
+     */
+    public int getCharSize() {
+        return charSize;
+    }
 }