diff --git a/src/main/java/projekt/enigma/App.java b/src/main/java/projekt/enigma/App.java
index 9e05616af19c780bbce8111c26621b7c4e31f9e5..267c3fcc983846cacdddd73d6a2cfe30829a4677 100644
--- a/src/main/java/projekt/enigma/App.java
+++ b/src/main/java/projekt/enigma/App.java
@@ -9,7 +9,7 @@ import javafx.scene.control.Label;
 import javafx.scene.control.TextField;
 import javafx.scene.layout.VBox;
 import javafx.stage.Stage;
-import projekt.enigma.model.Codierer;
+import projekt.enigma.model.Fehler;
 
 import java.io.IOException;
 
@@ -20,61 +20,89 @@ import java.io.IOException;
  */
 public class App extends Application {
 
+	private static String kenngruppe;
+	private static GuiController gc;
+    private static int debug;
+    private static Fehler fehler;
     Scene sce1, sce2;
 
+	private static Parent loadFXML(String fxml) throws IOException {
+	    FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
+        Parent result = fxmlLoader.load();
+
+		if (fxml.equals("gui")) {
+			gc = fxmlLoader.getController();
+            gc.setKenngruppe(kenngruppe);
+		}
+
+		return result;
+	}
+
+	public static void main(String[] args) {
+	    fehler = new Fehler();
+		launch(args);
+	}
+
+    public static int getDebug() {
+        return debug;
+    }
+
+    public static void setDebug(int debug) {
+        App.debug = debug;
+    }
+
+    public static Fehler getFehler() {
+        return fehler;
+    }
+
     @Override
-    public void start(Stage primaryStage) throws IOException {
-
-        Codierer cod = new Codierer();
-
-        primaryStage.setTitle("Kenngruppenabfrage");
-
-//Scene 1
-        Label label1= new Label("Bitte Kenngruppe eingeben!");
-        label1.setTranslateX(55);
-        Label l1=new Label("");
-        Label l2 = new Label("");
-        TextField tfield=new TextField();
-        Button button1= new Button("Kenngruppe setzen!");
-
-        VBox layout1 = new VBox();
-        // kc.btnGui(primaryStage, sce2);
-        button1.setOnAction(e -> {
-            if (tfield.getText().length() < 9) {
-                for (char c : tfield.getText().toCharArray()) {
-                    if (c == 'a' || c == 'b' || c == 'c' || c == 'd' || c == 'e' || c == 'f' || c == 'g' || c == 'h' || c == 'i' || c == 'j' || c == 'k' || c == 'l' || c == 'm' || c == 'n' || c == 'o' || c == 'p' || c == 'q' || c == 'r' || c == 's' || c == 't' || c == 'u' || c == 'v' || c == 'w' || c == 'x' || c == 'y' || c == 'z' || c == 'A' || c == 'B' || c == 'C' || c == 'D' || c == 'E' || c == 'F' || c == 'G' || c == 'H' || c == 'I' || c == 'J' || c == 'K' || c == 'L' || c == 'M' || c == 'N' || c == 'O' || c == 'P' || c == 'Q' || c == 'R' || c == 'S' || c == 'T' || c == 'U' || c == 'V' || c == 'W' || c == 'X' || c == 'Y' || c == 'Z') {
-                        cod.setKenngruppe(tfield.getText());
-                        primaryStage.setScene(sce2);
-                    }
+	public void start(Stage primaryStage) throws IOException {
+
+		primaryStage.setTitle("Kenngruppenabfrage");
+
+		//Scene 1
+		Label label1 = new Label("Bitte Kenngruppe eingeben!");
+		label1.setTranslateX(55);
+		Label l1 = new Label("");
+		Label l2 = new Label("");
+		TextField tfield = new TextField();
+		Button button1 = new Button("Kenngruppe setzen!");
+
+		VBox layout1 = new VBox();
+
+		button1.setOnAction(e -> {
+			String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+            boolean error = false;
+
+            for (char c : tfield.getText().toUpperCase().toCharArray()) {
+                if (!alphabet.contains(String.valueOf(c))) {
+                    error = true;
+                    break;
                 }
-            }else{
+            }
+            if (tfield.getText().length() < 9 && !error) {
+                kenngruppe = tfield.getText();
+                try {
+                    primaryStage.setScene(new Scene(loadFXML("gui"), 962, 677));
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            } else {
                 tfield.setStyle("-fx-background-color:#FF0000");
                 tfield.setText("Fehlerhafte Kenngruppe!");
             }
-        });
-        layout1.getChildren().addAll(label1,l1,tfield,l2,button1);
 
-        //sce1= new Scene(loadFXML("kenngruppe"), 300, 250);
-
-        sce1=new Scene(layout1,234,137);
+        });
 
-        sce2 = new Scene(loadFXML("gui"), 962, 677);
+		layout1.getChildren().addAll(label1, l1, tfield, l2, button1);
 
-        primaryStage.setScene(sce1);
-        primaryStage.show();
-    }
+		sce1 = new Scene(layout1, 234, 137);
 
-    	private static Parent loadFXML(String fxml) throws IOException {
-		FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
-		return fxmlLoader.load();
+		primaryStage.setScene(sce1);
+		primaryStage.show();
 	}
 
 
-    public static void main(String[] args) {
-        launch(args);
-    }
-
-
 //	/**
 //	 * TODO Dokumentieren
 //	 */
diff --git a/src/main/java/projekt/enigma/GuiController.java b/src/main/java/projekt/enigma/GuiController.java
index 86e590529f655cc2911ea1b78ac66277cc7bdc30..c95f077d3d703a3dfdf7656d71bba024ae569d8a 100644
--- a/src/main/java/projekt/enigma/GuiController.java
+++ b/src/main/java/projekt/enigma/GuiController.java
@@ -55,7 +55,6 @@ public class GuiController {
 //endregion
 
     //region Init
-
     /**
      * Initialisiert die Elemente GUI und setzt deren Startwerte
      */
@@ -81,15 +80,6 @@ public class GuiController {
         menu(mBtnStartPos1, position);
         menu(mBtnStartPos3, position);
         menu(mBtnStartPos2, position);
-
-        // Initialisieren des Codierers und setzen der Kenngruppe
-        codierer = new Codierer();
-        // 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();
     }
 
     /**
@@ -110,9 +100,7 @@ public class GuiController {
             mItem.get(i).setOnAction(e -> setMenuBtnText(button, finalMi.get(finalI)));
         }
     }
-
-
-//endregion
+	//endregion
 
     //region EventHandler/Listener
 
@@ -287,11 +275,9 @@ public class GuiController {
             this.setzeTagesSchluessel();
         }
     }
-
-//endregion
+	//endregion
 
     //region Methoden
-
     /**
      * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
      *
@@ -445,8 +431,6 @@ public class GuiController {
 
             // Spruchschluessel in das Feld lblSpruchschluessel schreiben
             lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(empfangeneNachricht[2]));
-
-
         }
     }
 
@@ -647,14 +631,17 @@ public class GuiController {
         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
         tfStecker1.setText(codierer.fetchSteckverbindungen()[0][0] + "" +
                 codierer.fetchSteckverbindungen()[0][1]);
@@ -683,5 +670,20 @@ public class GuiController {
     }
 
     private enum BUCHSTABE_LEUCHTET {AN, AUS}
+
+    public void setKenngruppe(String kenngruppe) {
+
+	    // Initialisieren des Codierers und setzen der Kenngruppe
+	    codierer = new Codierer(kenngruppe);
+
+	    this.codierer.resetHardware();
+
+	    // 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();
+    }
     //endregion
 }
diff --git a/src/main/java/projekt/enigma/KenngruppeController.java b/src/main/java/projekt/enigma/KenngruppeController.java
deleted file mode 100644
index beb6b985ef6821feeec3732754f7bc6a8e0b1d38..0000000000000000000000000000000000000000
--- a/src/main/java/projekt/enigma/KenngruppeController.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package projekt.enigma;
-
-import java.io.IOException;
-
-import javafx.fxml.FXML;
-import javafx.scene.control.TextField;
-import projekt.enigma.model.Codierer;
-
-public class KenngruppeController {
-    private Codierer cod = new Codierer();
-
-    @FXML
-    private TextField tfKenngruppe;
-
-    //TODO: Doku
-
-    /**
-     * Beim drücken der Taste wird überprüft ob die eingegebene Kenngruppe weniger als 9 Zeichen hat und ob die
-     * eingegebenen Zeichen nur Buchstaben sind.
-     * Bei einer gültigen Eingabe wird die eingegebene Kenngruppe gespeichert und die Enigma-Anwendung gestartet
-     *
-     * @throws IOException :
-     */
-    @FXML
-    private void btnGui() throws IOException {
-
-        String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-        boolean error = false;
-
-        for (char c : tfKenngruppe.getText().toUpperCase().toCharArray()) {
-            if (!alphabet.contains(String.valueOf(c))) {
-                error = true;
-            }
-        }
-        if (tfKenngruppe.getText().length() < 9 && !error) {
-            cod.setKenngruppe(tfKenngruppe.getText().toUpperCase());
-            //setzt
-          //  App.setRoot("gui");
-        } else {
-            tfKenngruppe.setStyle("-fx-background-color:#FF0000");
-            tfKenngruppe.setText("Fehlerhafte Kenngruppe!");
-        }
-    }
-}
diff --git a/src/main/java/projekt/enigma/Main.java b/src/main/java/projekt/enigma/Main.java
index ec28c8326559cd7f825ec1b94e8263a36f93adb6..b5abaf5e0ca620dbe5c06670a79b78aa1ee41db4 100644
--- a/src/main/java/projekt/enigma/Main.java
+++ b/src/main/java/projekt/enigma/Main.java
@@ -9,10 +9,6 @@ import java.sql.SQLException;
 public class Main {
 
     public static void main(String[] args) throws SQLException {
-        Thread app = new Thread(new ThreadApp());
-        Thread funk = new Thread(new ThreadFunkraum());
-
-        app.start();
-        funk.start();
+        App.main(args);
     }
 }
diff --git a/src/main/java/projekt/enigma/model/Codierer.java b/src/main/java/projekt/enigma/model/Codierer.java
index 33789a373f29fab20960043f7890ea8551040ad2..bd9f1f5cb01b8de6fa837ad5f6ac4a4c6c57bc0a 100644
--- a/src/main/java/projekt/enigma/model/Codierer.java
+++ b/src/main/java/projekt/enigma/model/Codierer.java
@@ -1,6 +1,7 @@
 package projekt.enigma.model;
 
 import org.apache.http.HttpException;
+import projekt.enigma.threads.ThreadFunkraum;
 
 import java.io.IOException;
 import java.util.Calendar;
@@ -14,521 +15,527 @@ import java.util.Random;
  */
 public class Codierer {
 
-    //region Variablen
-    /**
-     * Der Klartext Spruchschlüssel zur codierung der Nachricht
-     */
-    private String spruchschluessel;
-
-    /**
-     * Der Spruchschlüssel, mit den Tageswerten aus dem Codebuch, codiert
-     */
-    private String spruchschluesselCodiert;
-
-    /**
-     * Die Kenngruppe für die versendeten Nachrichten gedacht sind. Diese ist relevant für den Webservice (Funkraum)
-     */
-    private String kenngruppe;
-
-    /**
-     * Die Nachricht, welche der Benutzer eingibt, wird als String nachricht gespeichert
-     * und im laufe der Benutzung ergänzt
-     */
-    private String nachricht;
-
-    /**
-     * Das Hardware Objekt. Hier werden alle Hardware relevanten Baugruppen gespeichert und verarbeitet.
-     */
-    private Hardware hardware;
-
-    /**
-     * Im Codebuch sind die Tageswerte zu finden. Über dieses Objekt kann darauf zugegriffen werden.
-     */
-    private Codebuch codebuch;
-    //endregion
-
-    //region Konstruktor
-
-    /**
-     * Der Konstruktor des Codierers
-     * Hier werden die globalen Variablen auf ihre Standart Werte gesetzt sowie die Objekte Initialisiert.
-     */
-    public Codierer() {
-
-        this.nachricht = "";
-        this.spruchschluessel = "";
-        this.spruchschluesselCodiert = "";
-        this.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 zugewisen, da wir nur einen besitzen und
-     * deshalb alle Einstellungen hierfür Statisch im Reflektor definiert haben.
-     * <br>
-     * Das Steck wird ebenfalls definiert und die notwendigen Kabel eingesteckt laut dem heutigen
-     * Codebuch Eintrag.
-     */
-    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 bekannt geben
-        this.hardware.setReflektor(new Reflektor());
-    }
-
-    /**
-     * Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurück.
-     */
-    public void resetHardware() {
-        this.initialisiereHardware();
-    }
-
-    /**
-     * Leer das Nachrichten Objekt um eine neue Nachricht aufnehmen zu können
-     */
-    public void resetNachricht() {
-        this.nachricht = "";
-    }
-    //endregion
-
-    //region Nachrichten handler
-
-    /**
-     * Befehl die Nachricht an den Funker zu übergeben
-     *
-     * @throws IOException   : Die Antwort konnte nicht gelesen werden
-     * @throws HttpException : Die Nachricht konnte nicht abgesendet werden
-     */
-    public void sendeNachricht() throws IOException, HttpException {
-        String kopf = this.generateKopf();
-        new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht), this.kenngruppe);
-        this.nachricht = "";
-        this.resetHardware();
-    }
-
-    /**
-     * Gibt die letzte empfangene Nachricht zurück
-     * <br>
-     * String[0] Tag wann die Nachricht gesendet wurde
-     * String[1] = Die verschlüsselte Nachricht
-     * String[2] = Nachricht im Klartext
-     */
-    public String[] empfangeNachricht() {
-
-        // Alte Nachrichten Variable erstmal leeren
-        this.nachricht = "";
-        // Morsecode Objekt initialisieren
-        Morsecode mc = new Morsecode();
-        // Unser Nachrichten Array soll drei Einträge erhalten
-        String[] nachricht = new String[4];
-        // 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.length > 1 && codierteNachricht[1].split(" ").length > 3) {
-            // Den Tag der Nachricht speichern
-            nachricht[0] = codierteNachricht[0];
-            // Die Nachricht von Morsecode in Buchstaben konvertieren
-            nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
-            // Die Enigma Nachricht (nachricht[1]) mittels der Tageseinstellungen (nachricht[0]) decodieren
-            nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
-            // StringBuilder initialisieren
-            StringBuilder sb = new StringBuilder();
-
-            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();
-        } else {
-            nachricht[0] = "";
-            nachricht[1] = "";
-            nachricht[2] = "Es liegen keine neuen Nachrichten im Funkraum für Sie vor.";
-        }
-
-        return nachricht;
-    }
-    //endregion
-
-    //region Generatoren
-
-    /**
-     * Hier wird ein neuer Spruchschlüssel generiert.
-     * <p>
-     * Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
-     * Tagesschlüssel codiert, hinzugefügt.
-     * <br>
-     * Hierfür wird mittels der Funktion "randomBuchstabe" ein zufälliger Buchstabe generiert,
-     * und geschaut ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
-     * Wenn nicht, wird der Buchstabe dem Spruchschlüssel hinzugefügt.
-     * <br>
-     * Dies wir nun so lange gemacht bis der Spruchschlüssel eine länge von drei Zeichen hat.
-     */
-    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.
-     * Hierfür wird die aktuelle Uhrzeit ausgelesen, die Länge der Nachricht sowie der, mit den
-     * Tagescodes codierte, Spruchschlüssel.
-     */
-    private String generateKopf() {
-        Calendar cal = Calendar.getInstance();
-
-        // Uhrzeit an den Kopf hängen
-        return String.format("%02d%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE)) + " " +
-                // Zeichen Anzahl der Nachricht
-                this.nachricht.length() + " " +
-                // Spruchschlüssel anhängen
-                this.spruchschluesselCodiert.substring(0, 3) + " " + this.spruchschluesselCodiert.substring(3, 6) + " ";
-    }
-
-    /**
-     * Einen zufälligen Buchstaben aus dem Alphabet generieren.
-     * In der Funktion gibt es den String Alphabet, in welchem alle zulässigen Zeichen eingetragen sind.
-     * Aus diesem String wird nun zufällig ein Zeichen ausgewählt und zurück gegeben.
-     *
-     * @return String : ein zufällig generierter Buchstabe
-     */
-    private String randomBuchstabe() {
-        return String.valueOf((char) ('A' + new Random().nextInt(26)));
-    }
-    //endregion
-
-    //region setzte Funktionen
-
-    /**
-     * Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet anschließen das
-     * Nachrichten Objekt
-     *
-     * @param walzenPosition : int : Nummer der Walze
-     * @param buchstabe      : char : Buchstabe der zugewiesen soll
-     */
-    public void setzeWalze(int walzenPosition, char buchstabe) {
-        this.resetNachricht();
-        this.hardware.setzePosition(walzenPosition, buchstabe);
-    }
-
-    /**
-     * Setzt den Ring auf der Walze auf einen neuen Umstprungwert.
-     *
-     * @param walzenPosition : int : Walze auf die der Ring gesteckt wird
-     * @param umsprungPunkt  : int : Buchstabe auf dem der Notch sitzt
-     */
-    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) 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 das Kabel in beide Ports ein und fügt 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 nicht, 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 zurück
-     *
-     * @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen
-     */
-    public int[] fetchRingstellung() {
-        return this.codebuch.getRingstellung();
-    }
-
-    /**
-     * Gibt die Walzennummer aus dem Codebuch zurück
-     *
-     * @return int[] : Array mit den Nummern der drei eingesetzten Walzen
-     */
-    public int[] fetchWalzenNr() {
-        return this.codebuch.getWalzenlage();
-    }
-
-    /**
-     * Gibt die Steckverbindungen aus dem Codebuch zurück
-     *
-     * @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett
-     */
-    public char[][] fetchSteckverbindungen() {
-        return this.codebuch.getSteckverbindung();
-    }
-
-    /**
-     * Gibt die aktuellen Buchstaben auf den Walzen zurück
-     *
-     * @return char[] : Walzen Array mit der aktuellen Position
-     */
-    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;
-    }
-    //endregion
-
-    //region codierer
-
-    /**
-     * Hier wird ein einzelner Buchstabe verschlüsselt.
-     * Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.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 Übergebenen String.
-     * Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.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 zusätzlich als Rückgabe
-     */
-    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 weiß dein Funker im Funkraum.
-     * In der Regel ist dies der Tag des Nachrichten empfangs.
-     *
-     * @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
-        sb.append(nachricht[0]).append(" ");
-
-        // Zeichen Anzahl der Nachricht
-        sb.append(nachricht[1]).append(" ");
-
-        // Spruchschlüssel
-        String spruchschluessel = this.decodiereString(nachricht[2]);
-
-        sb.append(spruchschluessel).append(" ");
-        sb.append(this.decodiereString(nachricht[3])).append(" ");
-
-        // Walzen neu einstellen mit dem Spruchschlüssel
-        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 übergebenen String in einen char Array und decodiert jedes Zeichen.
-     * Der String wird dann decodiert zurück gegeben.
-     *
-     * @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
-
-    /**
-     * Prüft ob der Port auf den das Kabel gesteckt werden soll, noch frei ist.
-     * <p>
-     * setSteckbrett ausführen mit beiden Buchstaben als String
-     *
-     * @param buchstabe : char : Der zuletzt eingegebene Buchstabe
-     * @return boolean : Wenn der Buchstabe nicht vorhanden ist, wird true zurückgegeben, ansonsten false
-     */
-    public boolean pruefeSteckbrettPort(char buchstabe) {
-        return this.hardware.getSteckbrett().ueberpruefeVertauschungen(buchstabe);
-    }
-
-    /**
-     * Ließt aus der empfangenen Nachricht den Spruchschlüssel aus und gibt ihn zurück.
-     *
-     * @param empfangeneNachricht : String : Die empfangene Nachricht als String
-     * @return String : Der Spruchschlüssel mit welcher die Nachricht codiert wurde.
-     */
-    public String empfangenerSpruchschluessel(String empfangeneNachricht) {
-        String[] nachricht = empfangeneNachricht.split(" ");
-
-        return nachricht[2];
-    }
-
-    /**
-     * Löscht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurück.
-     */
-    public void letztesZeichenLoeschen() {
-        this.hardware.dreheWalzen(-1);
-        this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
-    }
-    //endregion
-    //endregion
-
-    //region Setter
-
-    /**
-     * Gibt die bisher erstellte Nachricht zurück
-     *
-     * @return String : Erstellte Nachricht
-     */
-    public String getNachricht() {
-        return nachricht;
-    }
-    //endregion
-
-    //region Getter
-
-    /**
-     * Liest die Kenngruppe aus welche die Maschine gerade besitzt. Früher war dies eine eindeutige Nummer
-     * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
-     *
-     * @return String : Kenngruppe
-     */
-    public String getKenngruppe() {
-        return kenngruppe;
-    }
-
-    /**
-     * Setzt die Kenngruppe welche die Enigma gerade benutzt.
-     *
-     * @param kenngruppe : String : Kenngruppe welche die Enigma gerade benutzt
-     */
-    public void setKenngruppe(String kenngruppe) {
-
-        this.kenngruppe = kenngruppe;
-        this.initialisiereHardware();
-
-    }
-
-    /**
-     * Der Spruchschlüssel wird, zur internen Verwendung, auch im Klartext gespeichert.
-     * Wir brauchen diesen dann zum codieren der eigentlichen Nachricht.
-     *
-     * @return String : Der klartext Spruchschlüssel
-     */
-    public String getSpruchschluessel() {
-        return this.spruchschluessel;
-    }
-    //endregion
+	//region Variablen
+	/**
+	 * Der Klartext Spruchschlüssel zur codierung der Nachricht
+	 */
+	private String spruchschluessel;
+
+	/**
+	 * Der Spruchschlüssel, mit den Tageswerten aus dem Codebuch, codiert
+	 */
+	private String spruchschluesselCodiert;
+
+	/**
+	 * Die Kenngruppe für die versendeten Nachrichten gedacht sind. Diese ist relevant für den Webservice (Funkraum)
+	 */
+	private String kenngruppe;
+
+	/**
+	 * Die Nachricht, welche der Benutzer eingibt, wird als String nachricht gespeichert
+	 * und im laufe der Benutzung ergänzt
+	 */
+	private String nachricht;
+
+	/**
+	 * Das Hardware Objekt. Hier werden alle Hardware relevanten Baugruppen gespeichert und verarbeitet.
+	 */
+	private Hardware hardware;
+
+	/**
+	 * Im Codebuch sind die Tageswerte zu finden. Über dieses Objekt kann darauf zugegriffen werden.
+	 */
+	private Codebuch codebuch;
+
+	//TODO Dokumentieren
+	private Thread funk;
+	//endregion
+
+	//region Konstruktor
+
+	/**
+	 * Der Konstruktor des Codierers
+	 * Hier werden die globalen Variablen auf ihre Standart Werte 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();
+
+		/*this.funk = new Thread(new ThreadFunkraum(this.kenngruppe));
+		funk.start();*/
+	}
+	//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 zugewisen, da wir nur einen besitzen und
+	 * deshalb alle Einstellungen hierfür Statisch im Reflektor definiert haben.
+	 * <br>
+	 * Das Steck wird ebenfalls definiert und die notwendigen Kabel eingesteckt laut dem heutigen
+	 * Codebuch Eintrag.
+	 */
+	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 bekannt geben
+		this.hardware.setReflektor(new Reflektor());
+	}
+
+	/**
+	 * Setzt die Enigma auf die Einstellungen des aktuellen Tages, aus dem Codebuch zurück.
+	 */
+	public void resetHardware() {
+		this.initialisiereHardware();
+	}
+
+	/**
+	 * Leer das Nachrichten Objekt um eine neue Nachricht aufnehmen zu können
+	 */
+	public void resetNachricht() {
+		this.nachricht = "";
+	}
+	//endregion
+
+	//region Nachrichten handler
+
+	/**
+	 * Befehl die Nachricht an den Funker zu übergeben
+	 *
+	 * @throws IOException   : Die Antwort konnte nicht gelesen werden
+	 * @throws HttpException : Die Nachricht konnte nicht abgesendet werden
+	 */
+	public void sendeNachricht() throws IOException, HttpException {
+		String kopf = this.generateKopf();
+		new Funkraum().sendeFunkspruch(new Morsecode().convertBuchstabeToMorsecode(kopf + this.nachricht), this.kenngruppe);
+		this.nachricht = "";
+		this.resetHardware();
+	}
+
+	/**
+	 * Gibt die letzte empfangene Nachricht zurück
+	 * <br>
+	 * String[0] Tag wann die Nachricht gesendet wurde
+	 * String[1] = Die verschlüsselte Nachricht
+	 * String[2] = Nachricht im Klartext
+	 */
+	public String[] empfangeNachricht() {
+
+		// Alte Nachrichten Variable erstmal leeren
+		this.nachricht = "";
+		// Morsecode Objekt initialisieren
+		Morsecode mc = new Morsecode();
+		// Unser Nachrichten Array soll drei Einträge erhalten
+		String[] nachricht = new String[4];
+		// Abrufen der letzten Nachricht, für unsere Kenngruppe, aus dem Funkraum
+		String[] codierteNachricht = new Funkraum().empfangeFunkspruch(this.kenngruppe);
+
+		System.out.println(codierteNachricht.toString());
+
+		// Prüfen ob Nachrichtenlänge > 1 und die codierte Nachricht mehr als drei Felder (" ") hat
+		if (codierteNachricht.length > 1 && codierteNachricht[1].split(" ").length > 3) {
+			// Den Tag der Nachricht speichern
+			nachricht[0] = codierteNachricht[0];
+			// Die Nachricht von Morsecode in Buchstaben konvertieren
+			nachricht[1] = mc.convertMorsecodeToBuchstabe(codierteNachricht[1]);
+			// Die Enigma Nachricht (nachricht[1]) mittels der Tageseinstellungen (nachricht[0]) decodieren
+			nachricht[2] = this.decodiere(nachricht[1], Integer.parseInt(nachricht[0]));
+			// StringBuilder initialisieren
+			StringBuilder sb = new StringBuilder();
+
+			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();
+		} else {
+			nachricht[0] = "";
+			nachricht[1] = "";
+			nachricht[2] = "Es liegen keine neuen Nachrichten im Funkraum für Sie vor.";
+		}
+
+		return nachricht;
+	}
+	//endregion
+
+	//region Generatoren
+
+	/**
+	 * Hier wird ein neuer Spruchschlüssel generiert.
+	 * <p>
+	 * Mit diesem werden die Walzen auf eine neue Startposition gestellt und dem Kopf, mit dem
+	 * Tagesschlüssel codiert, hinzugefügt.
+	 * <br>
+	 * Hierfür wird mittels der Funktion "randomBuchstabe" ein zufälliger Buchstabe generiert,
+	 * und geschaut ob dieser bereits in der globalen Variable (this.spruchschluessel) vorhanden ist.
+	 * Wenn nicht, wird der Buchstabe dem Spruchschlüssel hinzugefügt.
+	 * <br>
+	 * Dies wir nun so lange gemacht bis der Spruchschlüssel eine länge von drei Zeichen hat.
+	 */
+	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.
+	 * Hierfür wird die aktuelle Uhrzeit ausgelesen, die Länge der Nachricht sowie der, mit den
+	 * Tagescodes codierte, Spruchschlüssel.
+	 */
+	private String generateKopf() {
+		Calendar cal = Calendar.getInstance();
+
+		// Uhrzeit an den Kopf hängen
+		return String.format("%02d%02d", cal.get(Calendar.HOUR), cal.get(Calendar.MINUTE)) + " " +
+				// Zeichen Anzahl der Nachricht
+				this.nachricht.length() + " " +
+				// Spruchschlüssel anhängen
+				this.spruchschluesselCodiert.substring(0, 3) + " " + this.spruchschluesselCodiert.substring(3, 6) + " ";
+	}
+
+	/**
+	 * Einen zufälligen Buchstaben aus dem Alphabet generieren.
+	 * In der Funktion gibt es den String Alphabet, in welchem alle zulässigen Zeichen eingetragen sind.
+	 * Aus diesem String wird nun zufällig ein Zeichen ausgewählt und zurück gegeben.
+	 *
+	 * @return String : ein zufällig generierter Buchstabe
+	 */
+	private String randomBuchstabe() {
+		return String.valueOf((char) ('A' + new Random().nextInt(26)));
+	}
+	//endregion
+
+	//region setzte Funktionen
+
+	/**
+	 * Setzt den anzuzeigenden Buchstaben (buchstabe) auf der Walze (walzenPosition) und resetet anschließen das
+	 * Nachrichten Objekt
+	 *
+	 * @param walzenPosition : int : Nummer der Walze
+	 * @param buchstabe      : char : Buchstabe der zugewiesen soll
+	 */
+	public void setzeWalze(int walzenPosition, char buchstabe) {
+		this.resetNachricht();
+		this.hardware.setzePosition(walzenPosition, buchstabe);
+	}
+
+	/**
+	 * Setzt den Ring auf der Walze auf einen neuen Umstprungwert.
+	 *
+	 * @param walzenPosition : int : Walze auf die der Ring gesteckt wird
+	 * @param umsprungPunkt  : int : Buchstabe auf dem der Notch sitzt
+	 */
+	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) 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 das Kabel in beide Ports ein und fügt 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 nicht, 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 zurück
+	 *
+	 * @return int[] : Array mit den Ringstellungen der drei eingesetzten Walzen
+	 */
+	public int[] fetchRingstellung() {
+		return this.codebuch.getRingstellung();
+	}
+
+	/**
+	 * Gibt die Walzennummer aus dem Codebuch zurück
+	 *
+	 * @return int[] : Array mit den Nummern der drei eingesetzten Walzen
+	 */
+	public int[] fetchWalzenNr() {
+		return this.codebuch.getWalzenlage();
+	}
+
+	/**
+	 * Gibt die Steckverbindungen aus dem Codebuch zurück
+	 *
+	 * @return char[][] : Array mit den gesteckten Verbindungen im Steckbrett
+	 */
+	public char[][] fetchSteckverbindungen() {
+		return this.codebuch.getSteckverbindung();
+	}
+
+	/**
+	 * Gibt die aktuellen Buchstaben auf den Walzen zurück
+	 *
+	 * @return char[] : Walzen Array mit der aktuellen Position
+	 */
+	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;
+	}
+	//endregion
+
+	//region codierer
+
+	/**
+	 * Hier wird ein einzelner Buchstabe verschlüsselt.
+	 * Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.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 Übergebenen String.
+	 * Man muss hier ebenfalls mitgeben ob der codierte String in Codierer.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 zusätzlich als Rückgabe
+	 */
+	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 weiß dein Funker im Funkraum.
+	 * In der Regel ist dies der Tag des Nachrichten empfangs.
+	 *
+	 * @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
+		sb.append(nachricht[0]).append(" ");
+
+		// Zeichen Anzahl der Nachricht
+		sb.append(nachricht[1]).append(" ");
+
+		// Spruchschlüssel
+		String spruchschluessel = this.decodiereString(nachricht[2]);
+
+		sb.append(spruchschluessel).append(" ");
+		sb.append(this.decodiereString(nachricht[3])).append(" ");
+
+		// Walzen neu einstellen mit dem Spruchschlüssel
+		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 übergebenen String in einen char Array und decodiert jedes Zeichen.
+	 * Der String wird dann decodiert zurück gegeben.
+	 *
+	 * @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
+
+	/**
+	 * Prüft ob der Port auf den das Kabel gesteckt werden soll, noch frei ist.
+	 * <p>
+	 * setSteckbrett ausführen mit beiden Buchstaben als String
+	 *
+	 * @param buchstabe : char : Der zuletzt eingegebene Buchstabe
+	 * @return boolean : Wenn der Buchstabe nicht vorhanden ist, wird true zurückgegeben, ansonsten false
+	 */
+	public boolean pruefeSteckbrettPort(char buchstabe) {
+		return this.hardware.getSteckbrett().ueberpruefeVertauschungen(buchstabe);
+	}
+
+	/**
+	 * Ließt aus der empfangenen Nachricht den Spruchschlüssel aus und gibt ihn zurück.
+	 *
+	 * @param empfangeneNachricht : String : Die empfangene Nachricht als String
+	 * @return String : Der Spruchschlüssel mit welcher die Nachricht codiert wurde.
+	 */
+	public String empfangenerSpruchschluessel(String empfangeneNachricht) {
+		String[] nachricht = empfangeneNachricht.split(" ");
+
+		return nachricht[2];
+	}
+
+	/**
+	 * Löscht das letzte Zeichen aus der Nachricht und dreht die Walzen eine Position zurück.
+	 */
+	public void letztesZeichenLoeschen() {
+		this.hardware.dreheWalzen(-1);
+		this.nachricht = this.nachricht.substring(0, this.nachricht.length() - 1);
+	}
+	//endregion
+	//endregion
+
+	//region Setter
+	/**
+	 * Setzt die Kenngruppe welche die Enigma gerade benutzt.
+	 *
+	 * @param kenngruppe : String : Kenngruppe welche die Enigma gerade benutzt
+	 */
+	public void setKenngruppe(String kenngruppe) {
+
+		this.kenngruppe = kenngruppe;
+		this.initialisiereHardware();
+	}
+	//endregion
+
+	//region Getter
+
+	/**
+	 * Liest die Kenngruppe aus welche die Maschine gerade besitzt. Früher war dies eine eindeutige Nummer
+	 * die einer Einheit zugewiesen war. Wir hinterlegen hier einen Benutzernamen.
+	 *
+	 * @return String : Kenngruppe
+	 */
+	public String getKenngruppe() {
+		return kenngruppe;
+	}
+
+	/**
+	 * Der Spruchschlüssel wird, zur internen Verwendung, auch im Klartext gespeichert.
+	 * Wir brauchen diesen dann zum codieren der eigentlichen Nachricht.
+	 *
+	 * @return String : Der klartext Spruchschlüssel
+	 */
+	public String getSpruchschluessel() {
+		return this.spruchschluessel;
+	}
+
+	/**
+	 * Gibt die bisher erstellte Nachricht zurück
+	 *
+	 * @return String : Erstellte Nachricht
+	 */
+	public String getNachricht() {
+		return nachricht;
+	}
+	//endregion
 }
diff --git a/src/main/java/projekt/enigma/model/Fehler.java b/src/main/java/projekt/enigma/model/Fehler.java
new file mode 100644
index 0000000000000000000000000000000000000000..3abf0aadaa76781dd7296c2f3386ea69a8fbcd9f
--- /dev/null
+++ b/src/main/java/projekt/enigma/model/Fehler.java
@@ -0,0 +1,81 @@
+package projekt.enigma.model;
+
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+import projekt.enigma.App;
+
+/**
+ * In dieser Klasse werden Fehler behandelt und an den User/Admin/Entwickler ausgegeben
+ */
+public class Fehler {
+
+	private String functionPrefix = "- ";
+	private String messagePrefix = "--> ";
+
+	/**
+	 * Zeige Fehler Dialog
+	 *
+	 * @param type    : String : Art der Meldung (warning/information/error)
+	 * @param subject : Titel des Dialoges
+	 * @param message : Nachricht der Meldung
+	 */
+	public void showErrorDialog(String type, String subject, String message) {
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true);
+
+		Alert alert;
+
+		/* Der Titel darf auch als leerer String übergeben werden, dann wird ein Default gesetzt */
+		if (subject.equals("")) {
+			subject = "Es ist ein Fehler aufgetreten";
+		}
+
+		/* Welcher Fehler Typ wurde übergeben? */
+		switch (type) {
+			case "warning":
+				alert = new Alert(AlertType.WARNING);
+				break;
+			case "information":
+				alert = new Alert(AlertType.INFORMATION);
+				break;
+			case "error":
+				alert = new Alert(AlertType.ERROR);
+				break;
+			default:
+				alert = new Alert(AlertType.NONE);
+		}
+		/* Setzt den Titel des Dialoges */
+		alert.setTitle(subject);
+		/* Setzt den Headertext des Dialoges */
+		alert.setHeaderText(null);
+		/* Setzt die Nachricht des Dialoges */
+		alert.setContentText(message);
+		/* Zeige den Dialog an */
+		alert.showAndWait();
+	}
+
+	public void debug(String message, boolean isFunction) {
+		if (App.getDebug() != 0) {
+			if (isFunction) {
+				System.out.println(functionPrefix + message);
+			} else {
+				System.out.println(messagePrefix + message);
+			}
+		}
+	}
+
+	public void debug(String message, boolean isFunction, int debugLevel) {
+
+		if (App.getDebug() != 0 && (App.getDebug() >= debugLevel || App.getDebug() == 3) ) {
+
+			if (isFunction) {
+
+				System.out.println(functionPrefix + message);
+
+			} else {
+
+				System.out.println(messagePrefix + message);
+
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/projekt/enigma/model/Funkraum.java b/src/main/java/projekt/enigma/model/Funkraum.java
index f596cfad8ef16c6e1479e798fb1123afc5cb8da6..e3b1fabe5f956edaa0c1e69739ba532b5c385edd 100644
--- a/src/main/java/projekt/enigma/model/Funkraum.java
+++ b/src/main/java/projekt/enigma/model/Funkraum.java
@@ -10,6 +10,7 @@ import org.apache.http.client.methods.HttpPost;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicNameValuePair;
 import org.json.JSONObject;
+import projekt.enigma.App;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -63,10 +64,11 @@ public class Funkraum {
 				}
 			}
 		} catch (UnsupportedEncodingException e) {
-			System.out.println("Encoding wird nicht unterstützt.");
+			App.getFehler().showErrorDialog("error", "Fehler", "Encoding wird nicht unterstützt.");
 		} catch (IOException e) {
-			System.out.println("HTTP Post war nicht erfolgreich.\nBitte wenden Sie sich an ihren Vorgesetzten.");
-			e.printStackTrace();
+			App.getFehler().showErrorDialog("error", "HTTP Post war nicht erfolgreich", "Bitte wenden Sie sich an ihren Vorgesetzten.");
+		} catch (NullPointerException e) {
+			App.getFehler().showErrorDialog("error", "Fehler", "Keine Nachrichten für diese Kenngruppe");
 		}
 
 		return funkspruch;
@@ -107,7 +109,7 @@ public class Funkraum {
 			JSONObject result = new JSONObject(reader.readLine());
 			if (result.getInt("result") != 200) {
 				throw new HttpException("Der andere Funker mag deine Nachricht nicht. " +
-										"Rüge ihn wenn du ihn wieder siehst...");
+						"Rüge ihn wenn du ihn wieder siehst...");
 			}
 		}
 	}
diff --git a/src/main/java/projekt/enigma/threads/ThreadFunkraum.java b/src/main/java/projekt/enigma/threads/ThreadFunkraum.java
index 7ef5014d482ac1c8731fe198798540c2ca694a20..d47b2bf08312b5fcc9092137d543c1463f39e517 100644
--- a/src/main/java/projekt/enigma/threads/ThreadFunkraum.java
+++ b/src/main/java/projekt/enigma/threads/ThreadFunkraum.java
@@ -7,7 +7,11 @@ import projekt.enigma.model.Funkraum;
  * Thread fuer den Funkraum, wird durch das Interface Runnable erweitert
  */
 public class ThreadFunkraum implements Runnable {
-    String kenngruppe = new Codierer().getKenngruppe();
+    String kenngruppe;
+
+    public ThreadFunkraum(String kenngruppe) {
+        this.kenngruppe = kenngruppe;
+    }
 
     /**
      * Ueberschriebene Funktion - fuehrt die Klasse Funkraum aus und startet
@@ -16,7 +20,7 @@ public class ThreadFunkraum implements Runnable {
     public void run() {
         Funkraum funkraum = new Funkraum();
         System.out.println("Threadfunkraum" + Thread.currentThread());
-        funkraum.empfangeFunkspruch(kenngruppe);
+        funkraum.empfangeFunkspruch(this.kenngruppe);
     }
 }