diff --git a/src/main/java/de/telefonbuch/model/Datenbank.java b/src/main/java/de/telefonbuch/model/Datenbank.java
index 20eee6521a92bb2fd37866a6118310a2e6f81ed5..f7520b19bff19869cacc3966620950b48ee7e8de 100644
--- a/src/main/java/de/telefonbuch/model/Datenbank.java
+++ b/src/main/java/de/telefonbuch/model/Datenbank.java
@@ -23,17 +23,7 @@ public class Datenbank {
 		new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1);
 
 		Statement stmt = this.con.createStatement();
-		String createTable = "CREATE TABLE IF NOT EXISTS \"kontakte\" (" +
-				"id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
-				"vorname VARCHAR(50) NULL, " +
-				"nachname VARCHAR(50) NULL, " +
-				"strasse VARCHAR(50) NULL, " +
-				"hnr VARCHAR(10) NULL, " +
-				"plz VARCHAR(5) NULL, " +
-				"ort VARCHAR(50) NULL, " +
-				"telefon VARCHAR(30) UNIQUE NULL" +
-				");";
-		//stmt.execute(createTable);
+		String createTable, createTrigger, createView;
 
 		createTable = "CREATE TABLE IF NOT EXISTS \"table_vorname\" (" +
 				"id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
@@ -70,7 +60,8 @@ public class Datenbank {
 				"telefon VARCHAR(30) NOT NULL " +
 				");";
 		stmt.execute(createTable);
-		createTable = "CREATE TABLE IF NOT EXISTS \"kontakte\" (\n" +
+
+		createTable = "CREATE TABLE IF NOT EXISTS \"table_kontakte\" (\n" +
 				"    vorname VARCHAR,\n" +
 				"    nachname VARCHAR,\n" +
 				"    strasse VARCHAR,\n" +
@@ -87,6 +78,103 @@ public class Datenbank {
 				"    FOREIGN KEY(telefon) REFERENCES table_telefon(telefon)\n" +
 				");";
 		stmt.execute(createTable);
+
+		createView = "CREATE VIEW IF NOT EXISTS \"view_kontakte\" AS " +
+				"           SELECT" +
+				"               table_vorname.vorname, " +
+				"               table_nachname.nachname, " +
+				"               table_strasse.strasse, " +
+				"               table_hnr.hnr, " +
+				"               table_plz.plz, " +
+				"               table_ort.ort, " +
+				"               table_telefon.telefon " +
+				"           FROM table_kontakte " +
+				"           INNER JOIN table_vorname ON table_kontakte.vorname = table_vorname.id" +
+				"           INNER JOIN table_nachname ON table_kontakte.nachname = table_nachname.id" +
+				"           INNER JOIN table_strasse ON table_kontakte.strasse = table_strasse.id" +
+				"           INNER JOIN table_hnr ON table_kontakte.hnr = table_hnr.id" +
+				"           INNER JOIN table_plz ON table_kontakte.plz = table_plz.id" +
+				"           INNER JOIN table_ort ON table_kontakte.ort = table_ort.id" +
+				"           INNER JOIN table_telefon ON table_kontakte.telefon = table_telefon.id;";
+		stmt.execute(createView);
+
+		createTrigger = "CREATE TRIGGER IF NOT EXISTS view_kontakte_INS\n" +
+				"INSTEAD OF INSERT ON view_kontakte 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_telefon (telefon) SELECT NEW.telefon WHERE NOT EXISTS (SELECT 1 FROM table_telefon WHERE telefon = NEW.telefon);\n" +
+				"   INSERT INTO table_kontakte (vorname, nachname, strasse, hnr, plz, ort, telefon)\n" +
+				"       SELECT\n" +
+				"           (SELECT id FROM table_vorname WHERE vorname = NEW.vorname),\n" +
+				"           (SELECT id FROM table_nachname WHERE nachname = NEW.nachname),\n" +
+				"           (SELECT id FROM table_strasse WHERE strasse = NEW.strasse),\n" +
+				"           (SELECT id FROM table_hnr WHERE hnr = NEW.hnr),\n" +
+				"           (SELECT id FROM table_plz WHERE plz = NEW.plz),\n" +
+				"           (SELECT id FROM table_ort WHERE ort = NEW.ort),\n" +
+				"           (SELECT id FROM table_telefon WHERE telefon = NEW.telefon);\n" +
+				"END;";
+		stmt.execute(createTrigger);
+
+		createTrigger = "CREATE TRIGGER IF NOT EXISTS view_kontakte_DEL " +
+				"   INSTEAD OF DELETE ON view_kontakte FOR EACH ROW " +
+				"   BEGIN " +
+				"       DELETE FROM table_kontakte" +
+				"       WHERE vorname.id = (SELECT id FROM table_vorname WHERE vorname = OLD.vorname)" +
+				"           AND nachname.id = (SELECT id FROM table_nachname WHERE nachname = OLD.nachname)" +
+				"           AND strasse.id = (SELECT id FROM table_strasse WHERE strasse = OLD.strasse)" +
+				"           AND hnr.id = (SELECT id FROM table_hnr WHERE hnr = OLD.hnr)" +
+				"           AND plz.id = (SELECT id FROM table_plz WHERE plz = OLD.plz)" +
+				"           AND ort.id = (SELECT id FROM table_ort WHERE ort = OLD.ort)" +
+				"           AND telefon.id = (SELECT id FROM table_telefon WHERE telefon = OLD.telefon); " +
+				"       DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname.id FROM table_kontakte);" +
+				"       DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname.id FROM table_kontakte);" +
+				"       DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse.id FROM table_kontakte);" +
+				"       DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr.id FROM table_kontakte);" +
+				"       DELETE FROM table_plz WHERE id NOT IN (SELECT plz.id FROM table_kontakte);" +
+				"       DELETE FROM table_ort WHERE id NOT IN (SELECT ort.id FROM table_kontakte);" +
+				"       DELETE FROM table_telefon WHERE id NOT IN (SELECT telefon.id FROM table_kontakte);" +
+				"   END;";
+		stmt.execute(createTrigger);
+
+		createTrigger = "CREATE TRIGGER IF NOT EXISTS view_kontakte_UPD " +
+				"   INSTEAD OF UPDATE ON view_kontakte FOR EACH ROW " +
+				"   BEGIN " +
+				"       INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);" +
+				"       INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);" +
+				"       INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);" +
+				"       INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);" +
+				"       INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);" +
+				"       INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);" +
+				"       INSERT INTO table_telefon (telefon) SELECT NEW.telefon WHERE NOT EXISTS (SELECT 1 FROM table_telefon WHERE telefon = NEW.telefon);" +
+				"       UPDATE table_kontakte SET" +
+				"           vorname = (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), " +
+				"           nachname = (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), " +
+				"           strasse = (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), " +
+				"           hnr = (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), " +
+				"           plz = (SELECT id FROM table_plz WHERE plz = NEW.plz), " +
+				"           ort = (SELECT id FROM table_ort WHERE ort = NEW.ort), " +
+				"           telefon = (SELECT id FROM table_telefon WHERE telefon = NEW.telefon) " +
+				"       WHERE vorname = (SELECT id FROM table_vorname WHERE vorname = OLD.vorname) " +
+				"           AND nachname = (SELECT id FROM table_nachname WHERE nachname = OLD.nachname)" +
+				"           AND strasse = (SELECT id FROM table_strasse WHERE strasse = OLD.strasse)" +
+				"           AND hnr = (SELECT id FROM table_hnr WHERE hnr = OLD.hnr)" +
+				"           AND plz = (SELECT id FROM table_plz WHERE plz = OLD.plz)" +
+				"           AND ort = (SELECT id FROM table_ort WHERE ort = OLD.ort)" +
+				"           AND telefon = (SELECT id FROM table_telefon WHERE telefon = OLD.telefon);" +
+				"       DELETE FROM table_vorname WHERE vorname NOT IN (SELECT id FROM table_kontakte);" +
+				"       DELETE FROM table_nachname WHERE nachname NOT IN (SELECT id FROM table_kontakte);" +
+				"       DELETE FROM table_strasse WHERE strasse NOT IN (SELECT id FROM table_kontakte);" +
+				"       DELETE FROM table_hnr WHERE hnr NOT IN (SELECT id FROM table_kontakte);" +
+				"       DELETE FROM table_plz WHERE plz NOT IN (SELECT id FROM table_kontakte);" +
+				"       DELETE FROM table_ort WHERE ort NOT IN (SELECT id FROM table_kontakte);" +
+				"       DELETE FROM table_telefon WHERE telefon NOT IN (SELECT id FROM table_kontakte);" +
+				"END;";
+		stmt.execute(createTrigger);
 	}
 
 	/**
@@ -107,7 +195,7 @@ public class Datenbank {
 		try {
 			Statement stmt = this.con.createStatement();
 
-			String checkKontakt = "SELECT id FROM kontakte WHERE telefon=\"" + kontakt.getId() + "\";";
+			String checkKontakt = "SELECT telefon FROM view_kontakte WHERE telefon=\"" + kontakt.getId() + "\";";
 			ResultSet checkResult = stmt.executeQuery(checkKontakt);
 
 			int rows = 0;
@@ -120,7 +208,7 @@ public class Datenbank {
 			if (rows == 1) {
 				new Fehler().debug("Updating contact", false);
 
-				insertKontakt = "UPDATE kontakte SET " +
+				insertKontakt = "UPDATE view_kontakte SET " +
 						"vorname=\"" + kontakt.getVorname() + "\", " +
 						"nachname=\"" + kontakt.getNachname() + "\", " +
 						"strasse=\"" + kontakt.getStrasse() + "\", " +
@@ -132,7 +220,7 @@ public class Datenbank {
 			} else {
 				new Fehler().debug("Insert new contact", false);
 
-				insertKontakt = "INSERT INTO kontakte (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" +
+				insertKontakt = "INSERT INTO view_kontakte (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" +
 						"\"" + kontakt.getVorname() + "\", " +
 						"\"" + kontakt.getNachname() + "\", " +
 						"\"" + kontakt.getStrasse() + "\", " +
@@ -156,7 +244,7 @@ public class Datenbank {
 		try {
 			Statement stmt = this.con.createStatement();
 
-			String sql = "  DELETE FROM kontakte" +
+			String sql = "  DELETE FROM view_kontakte" +
 					"       WHERE telefon=\"" + telefon + "\";";
 			stmt.execute(sql);
 
@@ -176,11 +264,11 @@ public class Datenbank {
 
 			if (telefon.equals("first")) {
 				sql = "SELECT * " +
-						"FROM kontakte " +
+						"FROM view_kontakte " +
 						"LIMIT 1;";
 			} else {
 				sql = "SELECT * " +
-						"FROM kontakte " +
+						"FROM view_kontakte " +
 						"WHERE telefon=\"" + telefon + "\";";
 			}
 			ResultSet rs = stmt.executeQuery(sql);
@@ -215,27 +303,27 @@ public class Datenbank {
 
 		try {
 			Statement stmt = this.con.createStatement();
-			String sql = "SELECT\n" +
-					"    CASE\n" +
-					"        WHEN LAG(telefon) OVER (ORDER BY nachname) IS NULL THEN (\n" +
-					"            SELECT telefon\n" +
-					"            FROM kontakte\n" +
-					"            ORDER BY nachname DESC\n" +
-					"            LIMIT 1\n" +
-					"        )\n" +
-					"        ELSE LAG(telefon) OVER (ORDER BY nachname)\n" +
-					"    END last,\n" +
-					"    telefon AS current,\n" +
-					"    CASE\n" +
-					"        WHEN LEAD(telefon) OVER (ORDER BY nachname) IS NULL THEN (\n" +
-					"            SELECT telefon\n" +
-					"            FROM kontakte\n" +
-					"            ORDER BY nachname ASC\n" +
-					"            LIMIT 1\n" +
-					"        )\n" +
-					"        ELSE LEAD(telefon) OVER (ORDER BY nachname)\n" +
-					"    END next\n" +
-					"FROM kontakte\n" +
+			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);
@@ -263,7 +351,7 @@ public class Datenbank {
 			Statement stmt = this.con.createStatement();
 
 			String sql = "  SELECT COUNT(*) AS count" +
-					"       FROM kontakte;";
+					"       FROM view_kontakte;";
 			ResultSet rs = stmt.executeQuery(sql);
 
 			intResult = rs.getInt("count");