diff --git a/src/main/java/de/telefonbuch/model/Client.java b/src/main/java/de/telefonbuch/model/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..d23c5d82ebd5293bebd357531f6c47e4e9d7c518
--- /dev/null
+++ b/src/main/java/de/telefonbuch/model/Client.java
@@ -0,0 +1,74 @@
+package de.telefonbuch.model;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+
+public class Client {
+
+	IServer server;
+
+	public Client(String ipaddress) throws RemoteException, NotBoundException {
+		// Registry holen, wenn sie sich auf demselben Rechner befindet
+		Registry registry = LocateRegistry.getRegistry(Registry.REGISTRY_PORT);
+
+		// Entferntes Objekt laden
+		this.server = (IServer) registry.lookup("RMI-Server");
+
+	}
+
+	public void addKontakt(@NotNull Kontakt kontakt) {
+		try {
+			server.addKontakt(kontakt);
+		} catch (RemoteException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void deleteKontakt(String telefon) {
+		try {
+			server.deleteKontakt(telefon);
+		} catch (RemoteException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public Kontakt getKontakt(@NotNull String telefon) {
+		Kontakt kontakt = null;
+
+		try {
+			kontakt = server.getKontakt(telefon);
+		} catch (RemoteException e) {
+			e.printStackTrace();
+		}
+
+		return kontakt;
+	}
+
+	public String[] getNavi(String telefon) {
+		String[] result = new String[0];
+
+		try {
+			result = server.getNavi(telefon);
+		} catch (RemoteException e) {
+			e.printStackTrace();
+		}
+
+		return result;
+	}
+
+	public int countKontakte() {
+		int i = 0;
+
+		try {
+			i = server.countKontakte();
+		} catch (RemoteException e) {
+			e.printStackTrace();
+		}
+
+		return i;
+	}
+}
diff --git a/src/main/java/de/telefonbuch/model/Datenbank.java b/src/main/java/de/telefonbuch/model/Datenbank.java
index 9e9d3d6de149a84d8e7f2ad5fbf67eeeb99a71b1..01bd07de7c8533d836a3ed01de0427963ac0e678 100644
--- a/src/main/java/de/telefonbuch/model/Datenbank.java
+++ b/src/main/java/de/telefonbuch/model/Datenbank.java
@@ -1,309 +1,72 @@
 package de.telefonbuch.model;
 
 import org.jetbrains.annotations.NotNull;
-import java.sql.*;
 
-public class Datenbank {
-	private final String VIEW_KONTAKTE = "telefonbuch";
-	private final String TABLE_KONTAKTE = "table_kontakte";
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
 
-	private Connection con;
+public class Datenbank {
+	private final boolean CLIENT = false;
+	private Sqlite sqlite;
+	private Server server;
+	private Client client;
+	private final String IPADRESS = "127.0.0.1";
 
 	public Datenbank() {
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3);
 
-		try {
-			this.connect();
-			this.createTables();
-		} catch (SQLException e) {
-			e.printStackTrace();
+		if(CLIENT) {
+			try {
+				this.client = new Client(IPADRESS);
+			} catch(RemoteException | NotBoundException e) {
+				e.printStackTrace();
+			}
+		} else {
+			this.sqlite = new Sqlite();
+			// Neues Serverobjekt erstellen
+			Server server = new Server(sqlite);
+			server.start(server);
 		}
-	}
-
-	private void createTables() throws SQLException {
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1);
-
-		Statement stmt = this.con.createStatement();
-		String sql;
-
-		sql = "CREATE TABLE IF NOT EXISTS \"table_vorname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, vorname VARCHAR(50) NOT NULL UNIQUE);";
-		stmt.execute(sql);
-		sql = "CREATE TABLE IF NOT EXISTS \"table_nachname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nachname VARCHAR(50) NOT NULL UNIQUE);";
-		stmt.execute(sql);
-		sql = "CREATE TABLE IF NOT EXISTS \"table_strasse\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, strasse VARCHAR(50) NOT NULL UNIQUE);";
-		stmt.execute(sql);
-		sql = "CREATE TABLE IF NOT EXISTS \"table_hnr\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, hnr VARCHAR(15) NOT NULL UNIQUE);";
-		stmt.execute(sql);
-		sql = "CREATE TABLE IF NOT EXISTS \"table_plz\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, plz CHAR(5) NOT NULL UNIQUE);";
-		stmt.execute(sql);
-		sql = "CREATE TABLE IF NOT EXISTS \"table_ort\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ort VARCHAR(50) NOT NULL UNIQUE);";
-		stmt.execute(sql);
-		sql ="CREATE TABLE IF NOT EXISTS \"table_telefonbuch\" ( " +
-				"            id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
-				"            vorname_id INTEGER NOT NULL, " +
-				"            nachname_id INTEGER NOT NULL, " +
-				"            strasse_id INTEGER NOT NULL, " +
-				"            hnr_id INTEGER NOT NULL, " +
-				"            plz_id INTEGER NOT NULL, " +
-				"            ort_id INTEGER NOT NULL, " +
-				"            telefon VARCHAR(30) NOT NULL UNIQUE," +
-				"            FOREIGN KEY (vorname_id) REFERENCES table_vorname(id), " +
-				"            FOREIGN KEY (nachname_id) REFERENCES table_nachname(id), " +
-				"            FOREIGN KEY (strasse_id) REFERENCES table_strasse(id), " +
-				"            FOREIGN KEY (hnr_id) REFERENCES table_hnr(id), " +
-				"            FOREIGN KEY (plz_id) REFERENCES table_plz(id), " +
-				"            FOREIGN KEY (ort_id) REFERENCES table_ort(id)" +
-				"            );";
-		stmt.execute(sql);
-
-		sql = "CREATE VIEW IF NOT EXISTS telefonbuch AS " +
-				"            SELECT v.vorname AS vorname, " +
-				"            n.nachname AS nachname, " +
-				"            s.strasse AS strasse, " +
-				"            h.hnr AS hnr, " +
-				"            p.plz AS plz, " +
-				"            o.ort AS ort, " +
-				"            t.telefon AS telefon " +
-				"             FROM table_telefonbuch t " +
-				"            INNER JOIN table_vorname v ON t.vorname_id = v.id " +
-				"            INNER JOIN table_nachname n ON t.nachname_id = n.id " +
-				"            INNER JOIN table_strasse s ON t.strasse_id = s.id " +
-				"            INNER JOIN table_hnr h ON t.hnr_id = h.id " +
-				"            INNER JOIN table_plz p ON t.plz_id = p.id " +
-				"            INNER JOIN table_ort o ON t.ort_id = o.id;";
-		stmt.execute(sql);
-
-		sql = "PRAGMA foreign_keys = ON;";
-		stmt.execute(sql);
-
-		sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_INS INSTEAD OF INSERT ON telefonbuch FOR EACH ROW\n" +
-				"        BEGIN\n" +
-				"            INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" +
-				"            INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" +
-				"            INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" +
-				"            INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" +
-				"            INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" +
-				"            INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" +
-				"            INSERT INTO table_telefonbuch (vorname_id, nachname_id, strasse_id, hnr_id, plz_id, ort_id, telefon) SELECT (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), (SELECT id FROM table_plz WHERE plz = NEW.plz), (SELECT id FROM table_ort WHERE ort = NEW.ort), NEW.telefon;\n" +
-				"        END;";
-		stmt.execute(sql);
-
-		sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_DEL INSTEAD OF DELETE ON telefonbuch FOR EACH ROW\n" +
-				"        BEGIN\n" +
-				"            DELETE FROM table_telefonbuch WHERE telefon = OLD.telefon;\n" +
-				"            DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" +
-				"        END;";
-		stmt.execute(sql);
-
-		sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_UPD INSTEAD OF UPDATE ON telefonbuch FOR EACH ROW\n" +
-				"        BEGIN\n" +
-				"            INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" +
-				"            INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" +
-				"            INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" +
-				"            INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" +
-				"            INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" +
-				"            INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" +
-				"            UPDATE table_telefonbuch SET vorname_id = (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), nachname_id = (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), strasse_id = (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), hnr_id = (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), plz_id = (SELECT id FROM table_plz WHERE plz = NEW.plz), ort_id = (SELECT id FROM table_ort WHERE ort = NEW.ort), telefon = NEW.telefon WHERE telefon = OLD.telefon;\n" +
-				"            DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" +
-				"            DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" +
-				"        END;";
-		stmt.execute(sql);
-	}
 
-	/**
-	 * Verbindung zur Datenbank aufbauen
-	 */
-	private void connect() throws SQLException {
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1);
-
-		String datenbankdatei = "c:\\temp\\telefonbuch.sqlite";
-
-		this.con = DriverManager.getConnection("jdbc:sqlite:" + datenbankdatei);
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3);
 	}
 
 	public void addKontakt(@NotNull Kontakt kontakt) {
-
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1);
-
-		try {
-			Statement stmt = this.con.createStatement();
-
-			String checkKontakt = "SELECT telefon FROM " + VIEW_KONTAKTE + " WHERE telefon=\"" + kontakt.getId() + "\";";
-			ResultSet checkResult = stmt.executeQuery(checkKontakt);
-
-			int rows = 0;
-			while (checkResult.next()) {
-				rows++;
-			}
-
-			String insertKontakt;
-
-			if (rows == 1) {
-				new Fehler().debug("Updating contact", false);
-
-				insertKontakt = "UPDATE " + VIEW_KONTAKTE + " SET " +
-						"vorname=\"" + kontakt.getVorname() + "\", " +
-						"nachname=\"" + kontakt.getNachname() + "\", " +
-						"strasse=\"" + kontakt.getStrasse() + "\", " +
-						"hnr=\"" + kontakt.getHausnummer() + "\", " +
-						"plz=\"" + kontakt.getPlz() + "\", " +
-						"ort=\"" + kontakt.getOrt() + "\", " +
-						"telefon=\"" + kontakt.getTelefon() + "\" " +
-						" WHERE telefon=\"" + kontakt.getId() + "\";";
-			} else {
-				new Fehler().debug("Insert new contact", false);
-
-				insertKontakt = "INSERT INTO " + VIEW_KONTAKTE + " (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" +
-						"\"" + kontakt.getVorname() + "\", " +
-						"\"" + kontakt.getNachname() + "\", " +
-						"\"" + kontakt.getStrasse() + "\", " +
-						"\"" + kontakt.getHausnummer() + "\", " +
-						"\"" + kontakt.getPlz() + "\", " +
-						"\"" + kontakt.getOrt() + "\", " +
-						"\"" + kontakt.getTelefon() + "\" " +
-						");";
-			}
-			new Fehler().debug(insertKontakt, false);
-
-			stmt.execute(insertKontakt);
-		} catch (SQLException e) {
-			e.printStackTrace();
+		if(CLIENT) {
+			this.client.addKontakt(kontakt);
+		} else {
+			this.sqlite.addKontakt(kontakt);
 		}
 	}
 
 	public void deleteKontakt(String telefon) {
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2);
-
-		try {
-			Statement stmt = this.con.createStatement();
-
-			String sql = "  DELETE FROM " + VIEW_KONTAKTE + "" +
-					"       WHERE telefon=\"" + telefon + "\";";
-			stmt.execute(sql);
-
-		} catch (SQLException e) {
-			e.printStackTrace();
+		if(CLIENT) {
+			this.client.deleteKontakt(telefon);
+		} else {
+			this.sqlite.deleteKontakt(telefon);
 		}
 	}
 
 	public Kontakt getKontakt(@NotNull String telefon) {
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3);
-
-		Kontakt kontakt = new Kontakt();
-		String sql;
-
-		try {
-			Statement stmt = this.con.createStatement();
-
-			if (telefon.equals("first")) {
-				sql = "SELECT * " +
-						"FROM " + VIEW_KONTAKTE + " " +
-						"LIMIT 1;";
-			} else {
-				sql = "SELECT * " +
-						"FROM " + VIEW_KONTAKTE + " " +
-						"WHERE telefon=\"" + telefon + "\";";
-			}
-			ResultSet rs = stmt.executeQuery(sql);
-
-			while (rs.next()) {
-				if (rs.getString("telefon").equals(telefon) || telefon.equals("first")) {
-					kontakt.setId(rs.getString("telefon"));
-					kontakt.setVorname(rs.getString("vorname"));
-					kontakt.setNachname(rs.getString("nachname"));
-					kontakt.setStrasse(rs.getString("strasse"));
-					kontakt.setHausnummer(rs.getString("hnr"));
-					kontakt.setPlz(rs.getString("plz"));
-					kontakt.setOrt(rs.getString("ort"));
-					kontakt.setTelefon(rs.getString("telefon"));
-
-					if (telefon.equals("first")) {
-						break;
-					}
-				}
-			}
-		} catch (SQLException e) {
-			e.printStackTrace();
+		if(CLIENT) {
+			return this.client.getKontakt(telefon);
+		} else {
+			return this.sqlite.getKontakt(telefon);
 		}
-
-		return kontakt;
 	}
 
 	public String[] getNavi(String telefon) {
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3);
-
-		String[] naviResult = new String[3];
-
-		try {
-			Statement stmt = this.con.createStatement();
-			String sql = "SELECT " +
-					"    CASE " +
-					"        WHEN LAG(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " +
-					"            SELECT telefon " +
-					"            FROM " + VIEW_KONTAKTE + " " +
-					"            ORDER BY nachname DESC " +
-					"            LIMIT 1 " +
-					"        ) " +
-					"        ELSE LAG(telefon) OVER (ORDER BY nachname) " +
-					"    END last, " +
-					"    telefon AS current, " +
-					"    CASE " +
-					"        WHEN LEAD(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " +
-					"            SELECT telefon " +
-					"            FROM " + VIEW_KONTAKTE + " " +
-					"            ORDER BY nachname ASC " +
-					"            LIMIT 1 " +
-					"        ) " +
-					"        ELSE LEAD(telefon) OVER (ORDER BY nachname) " +
-					"    END next " +
-					"FROM " + VIEW_KONTAKTE + " " +
-					"ORDER BY nachname ASC;";
-
-			ResultSet rs = stmt.executeQuery(sql);
-
-			while (rs.next()) {
-				if (rs.getString("current").equals(telefon)) {
-					naviResult[0] = rs.getString("last");
-					naviResult[1] = rs.getString("current");
-					naviResult[2] = rs.getString("next");
-				}
-			}
-		} catch (SQLException e) {
-			e.printStackTrace();
+		if(CLIENT) {
+			return this.client.getNavi(telefon);
+		} else {
+			return this.sqlite.getNavi(telefon);
 		}
-
-		return naviResult;
 	}
 
 	public int countKontakte() {
-		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2);
-
-		int intResult = 0;
-
-		try {
-			Statement stmt = this.con.createStatement();
-
-			String sql = "  SELECT COUNT(*) AS count" +
-					"       FROM " + VIEW_KONTAKTE + ";";
-			ResultSet rs = stmt.executeQuery(sql);
-
-			intResult = rs.getInt("count");
-
-		} catch (SQLException e) {
-			e.printStackTrace();
+		if(CLIENT) {
+			return this.client.countKontakte();
+		} else {
+			return this.sqlite.countKontakte();
 		}
-
-		new Fehler().debug("Result: " + intResult, false);
-
-		return intResult;
 	}
 }
diff --git a/src/main/java/de/telefonbuch/model/IServer.java b/src/main/java/de/telefonbuch/model/IServer.java
new file mode 100644
index 0000000000000000000000000000000000000000..055bca346b393acab2619214ec89ba432c750236
--- /dev/null
+++ b/src/main/java/de/telefonbuch/model/IServer.java
@@ -0,0 +1,21 @@
+package de.telefonbuch.model;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+public interface IServer extends Remote {
+
+	void methodenaufruf() throws RemoteException;
+	String methodeMitRueckgabe() throws RemoteException;
+	void methodeMitParameter(String text) throws RemoteException;
+	boolean interaktion(String text) throws RemoteException;
+
+	void addKontakt(Kontakt kontakt) throws RemoteException;
+	void deleteKontakt(String telefon) throws RemoteException;
+	Kontakt getKontakt(String telefon) throws RemoteException;
+	String[] getNavi(String telefon) throws RemoteException;
+	int countKontakte() throws RemoteException;
+
+}
diff --git a/src/main/java/de/telefonbuch/model/Server.java b/src/main/java/de/telefonbuch/model/Server.java
new file mode 100644
index 0000000000000000000000000000000000000000..f37139f2fc9676aa2300aedd5ac72de8569cf910
--- /dev/null
+++ b/src/main/java/de/telefonbuch/model/Server.java
@@ -0,0 +1,74 @@
+package de.telefonbuch.model;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
+
+public class Server implements IServer {
+
+	public Sqlite sqlite;
+
+	public Server(Sqlite sqlite) {
+		this.sqlite = sqlite;
+	}
+
+	public void start(Server server) {
+		try {
+			// Neues Objekt erstellen, das zur Registry exportiert werden soll
+			IServer stub = (IServer) UnicastRemoteObject.exportObject(server, 0);
+
+			// Das exportierte Objekt an die Registry binden
+			// Standard-Port der Registry: 1099
+			Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
+			registry.rebind("RMI-Server", stub); // rebind überschreibt ein evtl schon gebundenes Objekt
+		} catch (RemoteException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void addKontakt(@NotNull Kontakt kontakt) {
+		sqlite.addKontakt(kontakt);
+	}
+
+	public void deleteKontakt(String telefon) {
+		sqlite.deleteKontakt(telefon);
+	}
+
+	public Kontakt getKontakt(@NotNull String telefon) {
+		return sqlite.getKontakt(telefon);
+	}
+
+	public String[] getNavi(String telefon) {
+		return sqlite.getNavi(telefon);
+	}
+
+	public int countKontakte() {
+		return sqlite.countKontakte();
+	}
+
+	@Override
+	public void methodenaufruf() throws RemoteException {
+		System.out.println("Aufruf von Methode 'methodenaufruf()'");
+	}
+
+	@Override
+	public String methodeMitRueckgabe() throws RemoteException {
+		System.out.println("Aufruf von Methode 'methodeMitRueckgabe()'");
+		return "Hallo Client!";
+	}
+
+	@Override
+	public void methodeMitParameter(String text) throws RemoteException {
+		System.out.println("Aufruf von Methode 'methodeMitParameter()' mit Parameter: " + text);
+	}
+
+	@Override
+	public boolean interaktion(String text) throws RemoteException {
+		System.out.println("Aufruf von Methode 'interaktion()' mit Parameter: " + text);
+		return true;
+	}
+
+}
\ No newline at end of file
diff --git a/src/main/java/de/telefonbuch/model/Sqlite.java b/src/main/java/de/telefonbuch/model/Sqlite.java
new file mode 100644
index 0000000000000000000000000000000000000000..49828e95aa1986b66089977f260d98635db72c6e
--- /dev/null
+++ b/src/main/java/de/telefonbuch/model/Sqlite.java
@@ -0,0 +1,307 @@
+package de.telefonbuch.model;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.sql.*;
+
+public class Sqlite {
+
+	private final String VIEW_KONTAKTE = "telefonbuch";
+	private Connection con;
+
+	public Sqlite() {
+		try {
+			this.connect();
+			this.createTables();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	private void createTables() throws SQLException {
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1);
+
+		Statement stmt = this.con.createStatement();
+		String sql;
+
+		sql = "CREATE TABLE IF NOT EXISTS \"table_vorname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, vorname VARCHAR(50) NOT NULL UNIQUE);";
+		stmt.execute(sql);
+		sql = "CREATE TABLE IF NOT EXISTS \"table_nachname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nachname VARCHAR(50) NOT NULL UNIQUE);";
+		stmt.execute(sql);
+		sql = "CREATE TABLE IF NOT EXISTS \"table_strasse\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, strasse VARCHAR(50) NOT NULL UNIQUE);";
+		stmt.execute(sql);
+		sql = "CREATE TABLE IF NOT EXISTS \"table_hnr\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, hnr VARCHAR(15) NOT NULL UNIQUE);";
+		stmt.execute(sql);
+		sql = "CREATE TABLE IF NOT EXISTS \"table_plz\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, plz CHAR(5) NOT NULL UNIQUE);";
+		stmt.execute(sql);
+		sql = "CREATE TABLE IF NOT EXISTS \"table_ort\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ort VARCHAR(50) NOT NULL UNIQUE);";
+		stmt.execute(sql);
+		sql ="CREATE TABLE IF NOT EXISTS \"table_telefonbuch\" ( " +
+				"            id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
+				"            vorname_id INTEGER NOT NULL, " +
+				"            nachname_id INTEGER NOT NULL, " +
+				"            strasse_id INTEGER NOT NULL, " +
+				"            hnr_id INTEGER NOT NULL, " +
+				"            plz_id INTEGER NOT NULL, " +
+				"            ort_id INTEGER NOT NULL, " +
+				"            telefon VARCHAR(30) NOT NULL UNIQUE," +
+				"            FOREIGN KEY (vorname_id) REFERENCES table_vorname(id), " +
+				"            FOREIGN KEY (nachname_id) REFERENCES table_nachname(id), " +
+				"            FOREIGN KEY (strasse_id) REFERENCES table_strasse(id), " +
+				"            FOREIGN KEY (hnr_id) REFERENCES table_hnr(id), " +
+				"            FOREIGN KEY (plz_id) REFERENCES table_plz(id), " +
+				"            FOREIGN KEY (ort_id) REFERENCES table_ort(id)" +
+				"            );";
+		stmt.execute(sql);
+
+		sql = "CREATE VIEW IF NOT EXISTS telefonbuch AS " +
+				"            SELECT v.vorname AS vorname, " +
+				"            n.nachname AS nachname, " +
+				"            s.strasse AS strasse, " +
+				"            h.hnr AS hnr, " +
+				"            p.plz AS plz, " +
+				"            o.ort AS ort, " +
+				"            t.telefon AS telefon " +
+				"             FROM table_telefonbuch t " +
+				"            INNER JOIN table_vorname v ON t.vorname_id = v.id " +
+				"            INNER JOIN table_nachname n ON t.nachname_id = n.id " +
+				"            INNER JOIN table_strasse s ON t.strasse_id = s.id " +
+				"            INNER JOIN table_hnr h ON t.hnr_id = h.id " +
+				"            INNER JOIN table_plz p ON t.plz_id = p.id " +
+				"            INNER JOIN table_ort o ON t.ort_id = o.id;";
+		stmt.execute(sql);
+
+		sql = "PRAGMA foreign_keys = ON;";
+		stmt.execute(sql);
+
+		sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_INS INSTEAD OF INSERT ON telefonbuch FOR EACH ROW\n" +
+				"        BEGIN\n" +
+				"            INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" +
+				"            INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" +
+				"            INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" +
+				"            INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" +
+				"            INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" +
+				"            INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" +
+				"            INSERT INTO table_telefonbuch (vorname_id, nachname_id, strasse_id, hnr_id, plz_id, ort_id, telefon) SELECT (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), (SELECT id FROM table_plz WHERE plz = NEW.plz), (SELECT id FROM table_ort WHERE ort = NEW.ort), NEW.telefon;\n" +
+				"        END;";
+		stmt.execute(sql);
+
+		sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_DEL INSTEAD OF DELETE ON telefonbuch FOR EACH ROW\n" +
+				"        BEGIN\n" +
+				"            DELETE FROM table_telefonbuch WHERE telefon = OLD.telefon;\n" +
+				"            DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" +
+				"        END;";
+		stmt.execute(sql);
+
+		sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_UPD INSTEAD OF UPDATE ON telefonbuch FOR EACH ROW\n" +
+				"        BEGIN\n" +
+				"            INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" +
+				"            INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" +
+				"            INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" +
+				"            INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" +
+				"            INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" +
+				"            INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" +
+				"            UPDATE table_telefonbuch SET vorname_id = (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), nachname_id = (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), strasse_id = (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), hnr_id = (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), plz_id = (SELECT id FROM table_plz WHERE plz = NEW.plz), ort_id = (SELECT id FROM table_ort WHERE ort = NEW.ort), telefon = NEW.telefon WHERE telefon = OLD.telefon;\n" +
+				"            DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" +
+				"            DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" +
+				"        END;";
+		stmt.execute(sql);
+	}
+
+	/**
+	 * Verbindung zur Datenbank aufbauen
+	 */
+	private void connect() throws SQLException {
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1);
+
+		String datenbankdatei = "c:\\temp\\telefonbuch.sqlite";
+
+		this.con = DriverManager.getConnection("jdbc:sqlite:" + datenbankdatei);
+	}
+
+	public void addKontakt(@NotNull Kontakt kontakt) {
+
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1);
+
+		try {
+			Statement stmt = this.con.createStatement();
+
+			String checkKontakt = "SELECT telefon FROM " + VIEW_KONTAKTE + " WHERE telefon=\"" + kontakt.getId() + "\";";
+			ResultSet checkResult = stmt.executeQuery(checkKontakt);
+
+			int rows = 0;
+			while (checkResult.next()) {
+				rows++;
+			}
+
+			String insertKontakt;
+
+			if (rows == 1) {
+				new Fehler().debug("Updating contact", false);
+
+				insertKontakt = "UPDATE " + VIEW_KONTAKTE + " SET " +
+						"vorname=\"" + kontakt.getVorname() + "\", " +
+						"nachname=\"" + kontakt.getNachname() + "\", " +
+						"strasse=\"" + kontakt.getStrasse() + "\", " +
+						"hnr=\"" + kontakt.getHausnummer() + "\", " +
+						"plz=\"" + kontakt.getPlz() + "\", " +
+						"ort=\"" + kontakt.getOrt() + "\", " +
+						"telefon=\"" + kontakt.getTelefon() + "\" " +
+						" WHERE telefon=\"" + kontakt.getId() + "\";";
+			} else {
+				new Fehler().debug("Insert new contact", false);
+
+				insertKontakt = "INSERT INTO " + VIEW_KONTAKTE + " (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" +
+						"\"" + kontakt.getVorname() + "\", " +
+						"\"" + kontakt.getNachname() + "\", " +
+						"\"" + kontakt.getStrasse() + "\", " +
+						"\"" + kontakt.getHausnummer() + "\", " +
+						"\"" + kontakt.getPlz() + "\", " +
+						"\"" + kontakt.getOrt() + "\", " +
+						"\"" + kontakt.getTelefon() + "\" " +
+						");";
+			}
+			new Fehler().debug(insertKontakt, false);
+
+			stmt.execute(insertKontakt);
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void deleteKontakt(String telefon) {
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2);
+
+		try {
+			Statement stmt = this.con.createStatement();
+
+			String sql = "  DELETE FROM " + VIEW_KONTAKTE + "" +
+					"       WHERE telefon=\"" + telefon + "\";";
+			stmt.execute(sql);
+
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public Kontakt getKontakt(@NotNull String telefon) {
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3);
+
+		Kontakt kontakt = new Kontakt();
+		String sql;
+
+		try {
+			Statement stmt = this.con.createStatement();
+
+			if (telefon.equals("first")) {
+				sql = "SELECT * " +
+						"FROM " + VIEW_KONTAKTE + " " +
+						"LIMIT 1;";
+			} else {
+				sql = "SELECT * " +
+						"FROM " + VIEW_KONTAKTE + " " +
+						"WHERE telefon=\"" + telefon + "\";";
+			}
+			ResultSet rs = stmt.executeQuery(sql);
+
+			while (rs.next()) {
+				if (rs.getString("telefon").equals(telefon) || telefon.equals("first")) {
+					kontakt.setId(rs.getString("telefon"));
+					kontakt.setVorname(rs.getString("vorname"));
+					kontakt.setNachname(rs.getString("nachname"));
+					kontakt.setStrasse(rs.getString("strasse"));
+					kontakt.setHausnummer(rs.getString("hnr"));
+					kontakt.setPlz(rs.getString("plz"));
+					kontakt.setOrt(rs.getString("ort"));
+					kontakt.setTelefon(rs.getString("telefon"));
+
+					if (telefon.equals("first")) {
+						break;
+					}
+				}
+			}
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+
+		return kontakt;
+	}
+
+	public String[] getNavi(String telefon) {
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3);
+
+		String[] naviResult = new String[3];
+
+		try {
+			Statement stmt = this.con.createStatement();
+			String sql = "SELECT " +
+					"    CASE " +
+					"        WHEN LAG(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " +
+					"            SELECT telefon " +
+					"            FROM " + VIEW_KONTAKTE + " " +
+					"            ORDER BY nachname DESC " +
+					"            LIMIT 1 " +
+					"        ) " +
+					"        ELSE LAG(telefon) OVER (ORDER BY nachname) " +
+					"    END last, " +
+					"    telefon AS current, " +
+					"    CASE " +
+					"        WHEN LEAD(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " +
+					"            SELECT telefon " +
+					"            FROM " + VIEW_KONTAKTE + " " +
+					"            ORDER BY nachname ASC " +
+					"            LIMIT 1 " +
+					"        ) " +
+					"        ELSE LEAD(telefon) OVER (ORDER BY nachname) " +
+					"    END next " +
+					"FROM " + VIEW_KONTAKTE + " " +
+					"ORDER BY nachname ASC;";
+
+			ResultSet rs = stmt.executeQuery(sql);
+
+			while (rs.next()) {
+				if (rs.getString("current").equals(telefon)) {
+					naviResult[0] = rs.getString("last");
+					naviResult[1] = rs.getString("current");
+					naviResult[2] = rs.getString("next");
+				}
+			}
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+
+		return naviResult;
+	}
+
+	public int countKontakte() {
+		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2);
+
+		int intResult = 0;
+
+		try {
+			Statement stmt = this.con.createStatement();
+
+			String sql = "  SELECT COUNT(*) AS count" +
+					"       FROM " + VIEW_KONTAKTE + ";";
+			ResultSet rs = stmt.executeQuery(sql);
+
+			intResult = rs.getInt("count");
+
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+
+		new Fehler().debug("Result: " + intResult, false);
+
+		return intResult;
+	}
+}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
deleted file mode 100644
index 7376dd0caf38886d5e8582957f1f3fda073d1294..0000000000000000000000000000000000000000
--- a/src/main/java/module-info.java
+++ /dev/null
@@ -1,10 +0,0 @@
-module de.telefonbuch {
-    requires javafx.controls;
-    requires javafx.fxml;
-	requires java.desktop;
-	requires java.sql;
-	requires org.jetbrains.annotations;
-
-	opens de.telefonbuch to javafx.fxml;
-    exports de.telefonbuch;
-}
\ No newline at end of file