diff --git a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
index 2c344b77a50cac186397578b6ed840166b7da6e6..831183ddebbb2de68afe98701bbc5522366193f4 100644
--- a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
+++ b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerConnection.java
@@ -233,7 +233,7 @@ public class ServerConnection
 		}
 	}
 
-	public void addNormalPayment(NormalPayment payment) throws Exception
+	public Integer addNormalPayment(NormalPayment payment) throws Exception
 	{
 		URL url = new URL(settings.getUrl() + "/payment?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&amount=" + payment.getAmount() + "&date=" + payment.getDate() + "&categoryID=" + payment.getCategoryID() + "&name=" + Helpers.getURLEncodedString(payment.getName())
 				+ "&description=" + Helpers.getURLEncodedString(payment.getDescription()));
@@ -242,9 +242,8 @@ public class ServerConnection
 		httpsCon.setDoInput(true);
 		if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK)
 		{
-			InputStream stream = httpsCon.getInputStream();
-			BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
-			reader.close();
+			String result = Read.getStringFromInputStream(httpsCon.getInputStream());
+			return gson.fromJson(result, Integer.class);
 		}
 		else
 		{
@@ -271,7 +270,7 @@ public class ServerConnection
 		}
 	}
 
-	public void addRepeatingPayment(RepeatingPayment payment) throws Exception
+	public Integer addRepeatingPayment(RepeatingPayment payment) throws Exception
 	{
 		String repeatEndDate = payment.getRepeatEndDate();
 		if(repeatEndDate == null || repeatEndDate.equals(""))
@@ -287,9 +286,8 @@ public class ServerConnection
 		httpsCon.setDoInput(true);
 		if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK)
 		{
-			InputStream stream = httpsCon.getInputStream();
-			BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
-			reader.close();
+			String result = Read.getStringFromInputStream(httpsCon.getInputStream());
+			return gson.fromJson(result, Integer.class);
 		}
 		else
 		{
diff --git a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java
index 80bb67a649515c3fda5b6f30bf6d9e94073ac326..858de8646b233295b714d2117a919c65caf4088d 100644
--- a/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java
+++ b/src/de/deadlocker8/budgetmaster/logic/serverconnection/ServerTagConnection.java
@@ -19,7 +19,6 @@ import com.google.gson.reflect.TypeToken;
 import de.deadlocker8.budgetmaster.logic.Settings;
 import de.deadlocker8.budgetmaster.logic.payment.NormalPayment;
 import de.deadlocker8.budgetmaster.logic.payment.RepeatingPayment;
-import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
 import de.deadlocker8.budgetmaster.logic.utils.Helpers;
 import tools.Read;
@@ -98,6 +97,24 @@ public class ServerTagConnection
 			return null;
 		}
 	}
+	
+	public Tag getTag(String name) throws Exception
+	{
+		URL url = new URL(settings.getUrl() + "/tag/single/byName?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&name=" + Helpers.getURLEncodedString(name));
+		HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection();
+		httpsCon.setDoOutput(true);
+		httpsCon.setRequestMethod("GET");
+
+		if(httpsCon.getResponseCode() == HttpsURLConnection.HTTP_OK)
+		{
+			String result = Read.getStringFromInputStream(httpsCon.getInputStream());
+			return gson.fromJson(result, Tag.class);
+		}
+		else
+		{
+			return null;
+		}
+	}
 
 	public void addTag(Tag tag) throws Exception
 	{
@@ -268,9 +285,9 @@ public class ServerTagConnection
 		}
 	}
 	
-	public ArrayList<Tag> getAllTagsForRepeatingPayment(RepeatingPaymentEntry repeatingPayment) throws Exception
+	public ArrayList<Tag> getAllTagsForRepeatingPayment(int repeatingPaymentID) throws Exception
 	{
-		URL url = new URL(settings.getUrl() + "/tag/match/all/normal?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&repeatingPaymentID=" + repeatingPayment.getID());
+		URL url = new URL(settings.getUrl() + "/tag/match/all/repeating?secret=" + Helpers.getURLEncodedString(settings.getSecret()) + "&repeatingPaymentID=" + repeatingPaymentID);
 		HttpsURLConnection httpsCon = (HttpsURLConnection)url.openConnection();
 		httpsCon.setDoOutput(true);
 		httpsCon.setRequestMethod("GET");
diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java b/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java
index da9d6161628f4fb97f76008167c3c90edd16665e..cea51ffa04b925973a9d40ee80398f4036d9720d 100644
--- a/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java
+++ b/src/de/deadlocker8/budgetmaster/ui/controller/NewPaymentController.java
@@ -77,6 +77,7 @@ public class NewPaymentController extends BaseController implements Styleable
 	private Payment payment;
 	private ButtonCategoryCell buttonCategoryCell;
 	private TagField tagField;
+	private ArrayList<Tag> previousTags;
 	
 	public NewPaymentController(Stage parentStage, Controller controller, PaymentController paymentController, boolean isPayment, boolean edit, Payment payment)
 	{
@@ -125,6 +126,8 @@ public class NewPaymentController extends BaseController implements Styleable
 		tagField.maxWidthProperty().bind(hboxTags.widthProperty());
 		HBox.setHgrow(tagField, Priority.ALWAYS);
 		
+		previousTags = new ArrayList<>();
+		
 		initRepeatingArea();
 		
 		if(edit)
@@ -281,7 +284,8 @@ public class NewPaymentController extends BaseController implements Styleable
 				try
 				{					
 					RepeatingPaymentEntry currentPayment = (RepeatingPaymentEntry)payment;
-					tagField.setTags(serverTagConnection.getAllTagsForRepeatingPayment(currentPayment));
+					previousTags = serverTagConnection.getAllTagsForRepeatingPayment(currentPayment.getRepeatingPaymentID());
+					tagField.setTags(new ArrayList<>(previousTags));
 					
 					ServerConnection connection = new ServerConnection(controller.getSettings());
 					RepeatingPayment repeatingPayment = connection.getRepeatingPayment(currentPayment.getRepeatingPaymentID());
@@ -316,7 +320,8 @@ public class NewPaymentController extends BaseController implements Styleable
 			}	
 			else
 			{
-				tagField.setTags(serverTagConnection.getAllTagsForPayment((NormalPayment)payment));
+				previousTags = serverTagConnection.getAllTagsForPayment((NormalPayment)payment);
+				tagField.setTags(new ArrayList<>(previousTags));
 				checkBoxRepeat.setSelected(false);
 				radioButtonPeriod.setSelected(true);
 				toggleRepeatingArea(false);
@@ -341,6 +346,7 @@ public class NewPaymentController extends BaseController implements Styleable
 				                false);
 	}
 
+	@FXML
 	public void save()
 	{
 		String name = textFieldName.getText();
@@ -390,6 +396,8 @@ public class NewPaymentController extends BaseController implements Styleable
 		{
 			description = "";
 		}
+		
+		Payment finalPayment;
 
 		int repeatingInterval = 0;
 		int repeatingDay = 0;
@@ -431,12 +439,16 @@ public class NewPaymentController extends BaseController implements Styleable
 					{	
 						connection.deleteRepeatingPayment((RepeatingPaymentEntry)payment);						
 					}	
-					connection.addRepeatingPayment(newPayment);
+					int id = connection.addRepeatingPayment(newPayment);
+					finalPayment = newPayment;
+					finalPayment.setID(id);
 				}
 				catch(Exception e)
 				{
 					Logger.error(e);
 					controller.showConnectionErrorAlert(ExceptionHandler.getMessageForException(e));
+					getStage().close();
+					return;
 				}
 			}
 			else
@@ -445,12 +457,16 @@ public class NewPaymentController extends BaseController implements Styleable
 				try
 				{
 					ServerConnection connection = new ServerConnection(controller.getSettings());
-					connection.addRepeatingPayment(newPayment);
+					int id = connection.addRepeatingPayment(newPayment);
+					finalPayment = newPayment;
+					finalPayment.setID(id);
 				}
 				catch(Exception e)
 				{
 					Logger.error(e);
 					controller.showConnectionErrorAlert(e.getMessage());
+					getStage().close();
+					return;
 				}
 			}
 		}
@@ -459,24 +475,29 @@ public class NewPaymentController extends BaseController implements Styleable
 			if(edit)
 			{
 				NormalPayment newPayment = new NormalPayment(payment.getID(), amount, Helpers.getDateString(date), comboBoxCategory.getValue().getID(), name, description);
+				int id = payment.getID();
 				try
 				{
 					ServerConnection connection = new ServerConnection(controller.getSettings());
 					if(payment instanceof RepeatingPaymentEntry)
 					{
 						//if old one was repeating it should be deleted
-						connection.deleteRepeatingPayment((RepeatingPaymentEntry)payment);
-						connection.addNormalPayment(newPayment);
+						connection.deleteRepeatingPayment((RepeatingPaymentEntry)payment);						
+						id = connection.addNormalPayment(newPayment);
 					}
 					else
 					{
 						connection.updateNormalPayment(newPayment);
-					}					
+					}
+					finalPayment = newPayment;
+					finalPayment.setID(id);
 				}
 				catch(Exception e)
 				{
 					Logger.error(e);
 					controller.showConnectionErrorAlert(e.getMessage());
+					getStage().close();
+					return;
 				}
 			}
 			else
@@ -485,15 +506,29 @@ public class NewPaymentController extends BaseController implements Styleable
 				try
 				{
 					ServerConnection connection = new ServerConnection(controller.getSettings());
-					connection.addNormalPayment(newPayment);
+					int id = connection.addNormalPayment(newPayment);					
+					finalPayment = newPayment;
+					finalPayment.setID(id);
 				}
 				catch(Exception e)
 				{
 					Logger.error(e);
 					controller.showConnectionErrorAlert(e.getMessage());
+					getStage().close();
+					return;
 				}
 			}
 		}
+		
+		try
+		{
+			saveTags(tagField.getTags(), finalPayment);
+		}
+		catch(Exception e)
+		{
+			Logger.error(e);
+			controller.showConnectionErrorAlert(e.getMessage());
+		}
 
 		getStage().close();
 		paymentController.getController().refresh(controller.getFilterSettings());
@@ -541,6 +576,67 @@ public class NewPaymentController extends BaseController implements Styleable
 		labelText3.setDisable(selected);
 	}
 	
+	private boolean tagListContainsTag(ArrayList<Tag> tags, String name)
+	{
+		for(Tag paymentTag: tags)
+		{
+			if(name.equals(paymentTag.getName()))
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	private void saveTags(ArrayList<Tag> tags, Payment payment) throws Exception
+	{
+		ServerTagConnection serverTagConnection = new ServerTagConnection(controller.getSettings());
+		
+		//check for deleted tags
+		for(Tag currentTag : previousTags)
+		{
+			if(!tagListContainsTag(tags, currentTag.getName()))
+			{
+				if(payment instanceof RepeatingPayment)
+				{
+					RepeatingPayment repeatingPayment = (RepeatingPayment)payment;
+					serverTagConnection.deleteTagMatchForRepeatingPayment(currentTag.getID(), repeatingPayment);
+				}
+				else
+				{
+					NormalPayment normalPayment = (NormalPayment)payment;
+					serverTagConnection.deleteTagMatchForPayment(currentTag.getID(), normalPayment);
+				}	
+			}
+		}
+		
+		//check for new tags
+		for(Tag paymentTag : tags)
+		{
+			if(!tagListContainsTag(previousTags, payment.getName()))
+			{
+				String name = paymentTag.getName();
+				Tag existingTag = serverTagConnection.getTag(name);
+				if(existingTag == null)
+				{
+					serverTagConnection.addTag(new Tag(-1, name));
+					existingTag = serverTagConnection.getTag(name);
+				}
+				
+				if(payment instanceof RepeatingPayment)
+				{
+					RepeatingPayment repeatingPayment = (RepeatingPayment)payment;
+					serverTagConnection.addTagMatchForRepeatingPayment(existingTag.getID(), repeatingPayment);
+				}
+				else
+				{
+					NormalPayment normalPayment = (NormalPayment)payment;
+					serverTagConnection.addTagMatchForPayment(existingTag.getID(), normalPayment);
+				}	
+			}
+		}	
+	}
+	
 	@Override
 	public void applyStyle()
 	{
diff --git a/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java b/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java
index d0fcef1083d25a5a9687ed65a4ae88b59b04d528..439460fa7b01c5939845f9d026b54621eb32196f 100644
--- a/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java
+++ b/src/de/deadlocker8/budgetmaster/ui/tagField/TagField.java
@@ -1,7 +1,9 @@
 package de.deadlocker8.budgetmaster.ui.tagField;
 
 import java.util.ArrayList;
+import java.util.Collection;
 
+import org.controlsfx.control.textfield.AutoCompletionBinding;
 import org.controlsfx.control.textfield.TextFields;
 
 import de.deadlocker8.budgetmaster.logic.tag.Tag;
@@ -18,6 +20,7 @@ import javafx.scene.input.KeyCode;
 import javafx.scene.layout.FlowPane;
 import javafx.scene.layout.HBox;
 import javafx.scene.layout.VBox;
+import javafx.util.Callback;
 import tools.ConvertTo;
 import tools.Localization;
 
@@ -46,7 +49,26 @@ public class TagField extends VBox
             	addTag(textField.getText().trim());
             }
 	    });
-		TextFields.bindAutoCompletion(textField, param -> getCompletions(allTags));
+		
+		TextFields.bindAutoCompletion(textField, new Callback<AutoCompletionBinding.ISuggestionRequest, Collection<String>>()
+		{
+
+			@Override
+			public Collection<String> call(org.controlsfx.control.textfield.AutoCompletionBinding.ISuggestionRequest param)
+			{
+				ArrayList<String> completions = getCompletions(allTags);
+				ArrayList<String> remainingCompletions = new ArrayList<>();
+				for(String currentCompletion : completions)
+				{
+					if(currentCompletion.toLowerCase().contains(param.getUserText().toLowerCase()))
+					{
+						remainingCompletions.add(currentCompletion);
+					}
+				}
+				
+				return remainingCompletions;
+			}
+		});
 		this.getChildren().add(textField);		
 
 		this.setStyle("-fx-background-color: #FFFFFF; -fx-border-color: #000000; -fx-background-radius: 5px; -fx-border-radius: 5px");
@@ -59,7 +81,7 @@ public class TagField extends VBox
 	{
 		FlowPane flowPane = new FlowPane();
 		flowPane.setVgap(5);
-		flowPane.setMinHeight(20);
+		flowPane.setMinHeight(30);
 		flowPane.setHgap(5);
 		flowPane.setPadding(new Insets(5));
 		return flowPane;
@@ -107,10 +129,11 @@ public class TagField extends VBox
 
 	public void addTag(String tagName)
 	{
+		//TODO max length = 45 chars
 		if(tagName.equals(""))
 		{
 			return;
-		}		
+		}
 		
 		for(Tag currentTag : tags)
 		{
@@ -120,7 +143,7 @@ public class TagField extends VBox
 			}
 		}
 		
-		tags.add(new Tag(-1, tagName));	
+		tags.add(new Tag(-1, tagName));
 		refresh(true);
 	}
 	
diff --git a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
index 2101468241bb5577953a13c38b2dbab2df16c109..f2ddf9ca7bef7706de22d6993522a6cc5bc69911 100644
--- a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
+++ b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseHandler.java
@@ -792,18 +792,25 @@ public class DatabaseHandler
 		}
 	}
 
-	public void addNormalPayment(int amount, String date, int categoryID, String name, String description)
+	public Integer addNormalPayment(int amount, String date, int categoryID, String name, String description)
 	{
 		PreparedStatement stmt = null;
 		try
 		{
-			stmt = connection.prepareStatement("INSERT INTO payment (Amount, Date, CategoryID, Name, Description) VALUES(?, ?, ?, ?, ?);");
+			stmt = connection.prepareStatement("INSERT INTO payment (Amount, Date, CategoryID, Name, Description) VALUES(?, ?, ?, ?, ?);",
+												Statement.RETURN_GENERATED_KEYS);
 			stmt.setInt(1, amount);
 			stmt.setString(2, date);
 			stmt.setInt(3, categoryID);
 			stmt.setString(4, name);
 			stmt.setString(5, description);
 			stmt.execute();
+			
+			ResultSet rs = stmt.getGeneratedKeys();
+            if(rs.next())
+            {
+                return rs.getInt(1);
+            }
 		}
 		catch(SQLException e)
 		{
@@ -813,9 +820,11 @@ public class DatabaseHandler
 		{
 			closeConnection(stmt);
 		}
+		
+		return -1;
 	}
 
-	public void addRepeatingPayment(int amount, String date, int categoryID, String name, String description, int repeatInterval, String repeatEndDate, int repeatMonthDay)
+	public Integer addRepeatingPayment(int amount, String date, int categoryID, String name, String description, int repeatInterval, String repeatEndDate, int repeatMonthDay)
 	{
 		PreparedStatement stmt = null;
 		String correctRepeatEndDate = repeatEndDate;
@@ -826,7 +835,8 @@ public class DatabaseHandler
 
 		try
 		{
-			stmt = connection.prepareStatement("INSERT INTO repeating_payment (Amount, Date, CategoryID, Name, RepeatInterval, RepeatEndDate, RepeatMonthDay, Description) VALUES(?, ?, ?, ?, ?, ?, ?, ?);");
+			stmt = connection.prepareStatement("INSERT INTO repeating_payment (Amount, Date, CategoryID, Name, RepeatInterval, RepeatEndDate, RepeatMonthDay, Description) VALUES(?, ?, ?, ?, ?, ?, ?, ?);",
+												Statement.RETURN_GENERATED_KEYS);
 			stmt.setInt(1, amount);
 			stmt.setString(2, date);
 			stmt.setInt(3, categoryID);
@@ -836,16 +846,23 @@ public class DatabaseHandler
 			stmt.setInt(7, repeatMonthDay);
 			stmt.setString(8, description);
 			stmt.execute();
+			
+			ResultSet rs = stmt.getGeneratedKeys();
+            if(rs.next())
+            {
+                return rs.getInt(1);
+            }
 		}
 		catch(SQLException e)
-		{
-			e.printStackTrace();
+		{			
 			Logger.error(e);
 		}
 		finally
 		{
 			closeConnection(stmt);
 		}
+		
+		return -1;
 	}
 	
 	public void addRepeatingPaymentEntry(int repeatingPaymentID, String date)
diff --git a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
index 8df044b57441a007ee784d144976c58dcc75aa39..9da524b4e953093228d1516fb1dcfc15d9673ab3 100644
--- a/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
+++ b/src/de/deadlocker8/budgetmasterserver/logic/database/DatabaseTagHandler.java
@@ -98,6 +98,36 @@ public class DatabaseTagHandler
            closeConnection(stmt);
         }
 
+        return tag;
+    }
+	
+	public Tag getTagByName(String name)
+    {
+	    PreparedStatement stmt = null;
+	    Tag tag = null;
+        try
+        {
+        	stmt = connection.prepareStatement("SELECT * FROM tag WHERE tag.Name= ?;");	
+			stmt.setString(1, name);
+			ResultSet rs = stmt.executeQuery();
+
+            while(rs.next())
+            {
+            	int id = rs.getInt("ID");
+            	String newName = rs.getString("Name");
+            
+                tag = new Tag(id, newName);
+            }
+        }
+        catch(SQLException e)
+        {
+            Logger.error(e);
+        }
+        finally
+        {
+           closeConnection(stmt);
+        }
+
         return tag;
     }
 	
diff --git a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
index fb778a5e80875cb8b6c0f6f5e87a72332c8de63e..86d6552d3328f59b96df0dca4fe69c8dfe6bcb34 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/SparkServer.java
@@ -55,6 +55,7 @@ import de.deadlocker8.budgetmasterserver.server.tag.tag.TagAdd;
 import de.deadlocker8.budgetmasterserver.server.tag.tag.TagDelete;
 import de.deadlocker8.budgetmasterserver.server.tag.tag.TagGet;
 import de.deadlocker8.budgetmasterserver.server.tag.tag.TagGetAll;
+import de.deadlocker8.budgetmasterserver.server.tag.tag.TagGetByName;
 import de.deadlocker8.budgetmasterserver.server.updater.RepeatingPaymentUpdater;
 import de.deadlocker8.budgetmasterserver.server.version.VersionGet;
 import logger.Logger;
@@ -66,6 +67,7 @@ public class SparkServer
 {	
 	private Gson gson;
 	private DatabaseHandler handler;
+	private DatabaseTagHandler tagHandler;
 	
 	public SparkServer(Settings settings, VersionInformation versionInfo)
 	{
@@ -95,6 +97,7 @@ public class SparkServer
 		RouteOverview.enableRouteOverview();
 		
 		handler = new DatabaseHandler(settings);
+		tagHandler = new DatabaseTagHandler(settings);
 
 		before((request, response) -> {
 
@@ -119,15 +122,15 @@ public class SparkServer
 		get("/payment/search", new PaymentSearch(handler));
 		// Normal
 		get("/payment", new PaymentGet(handler, gson));
-		post("/payment", new PaymentAdd(handler));
+		post("/payment", new PaymentAdd(handler, gson));
 		put("/payment", new PaymentUpdate(handler));
-		delete("/payment", new PaymentDelete(handler));
+		delete("/payment", new PaymentDelete(handler, tagHandler));
 
 		// Repeating
 		get("/repeatingpayment/single", new RepeatingPaymentGet(handler, gson));
 		get("/repeatingpayment", new RepeatingPaymentGetAll(handler, gson));
-		post("/repeatingpayment", new RepeatingPaymentAdd(handler));
-		delete("/repeatingpayment", new RepeatingPaymentDelete(handler));
+		post("/repeatingpayment", new RepeatingPaymentAdd(handler, gson));
+		delete("/repeatingpayment", new RepeatingPaymentDelete(handler, tagHandler));
 		
 		// CategoryBudget
 		get("/categorybudget", new CategoryBudgetGet(handler, gson));
@@ -140,20 +143,21 @@ public class SparkServer
 		get("/charts/monthInOutSum", new MonthInOutSum(handler, gson));
 		
 		// tag
-		get("/tag/single", new TagGet(new DatabaseTagHandler(settings), gson));
-		get("/tag", new TagGetAll(new DatabaseTagHandler(settings), gson));
-		post("/tag", new TagAdd(new DatabaseTagHandler(settings)));
-		delete("/tag", new TagDelete(new DatabaseTagHandler(settings)));
+		get("/tag/single", new TagGet(tagHandler, gson));
+		get("/tag/single/byName", new TagGetByName(tagHandler, gson));
+		get("/tag", new TagGetAll(tagHandler, gson));
+		post("/tag", new TagAdd(tagHandler));
+		delete("/tag", new TagDelete(tagHandler));
 		
 		// tag match
-		get("/tag/match/all/normal", new TagMatchGetAllForPayment(new DatabaseTagHandler(settings), gson));
-		get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(new DatabaseTagHandler(settings), gson));
-		get("/tag/match/normal", new TagMatchExistingForPayment(new DatabaseTagHandler(settings), gson));
-		get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(new DatabaseTagHandler(settings), gson));
-		post("/tag/match/normal", new TagMatchAddForPayment(new DatabaseTagHandler(settings)));
-		post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(new DatabaseTagHandler(settings)));
-		delete("/tag/match/normal", new TagMatchDeleteForPayment(new DatabaseTagHandler(settings)));
-		delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(new DatabaseTagHandler(settings)));
+		get("/tag/match/all/normal", new TagMatchGetAllForPayment(tagHandler, gson));
+		get("/tag/match/all/repeating", new TagMatchGetAllForRepeatingPayment(tagHandler, gson));
+		get("/tag/match/normal", new TagMatchExistingForPayment(tagHandler, gson));
+		get("/tag/match/repeating", new TagMatchExistingForRepeatingPayment(tagHandler, gson));
+		post("/tag/match/normal", new TagMatchAddForPayment(tagHandler));
+		post("/tag/match/repeating", new TagMatchAddForRepeatingPayment(tagHandler));
+		delete("/tag/match/normal", new TagMatchDeleteForPayment(tagHandler));
+		delete("/tag/match/repeating", new TagMatchDeleteForRepeatingPayment(tagHandler));
 
 		// Database
 		get("/database", new DatabaseExport(settings, gson));
diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
index 53580d8b925d12db336c1a649dff3c51d6975748..86a78819e0481f958bd4eaaef065f52b53519d11 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentAdd.java
@@ -2,6 +2,8 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal;
 
 import static spark.Spark.halt;
 
+import com.google.gson.Gson;
+
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import spark.Request;
 import spark.Response;
@@ -10,10 +12,12 @@ import spark.Route;
 public class PaymentAdd implements Route
 {
 	private DatabaseHandler handler;
+	private Gson gson;
 	
-	public PaymentAdd(DatabaseHandler handler)
+	public PaymentAdd(DatabaseHandler handler, Gson gson)
 	{	
 		this.handler = handler;
+		this.gson = gson;
 	}
 
 	@Override
@@ -38,13 +42,13 @@ public class PaymentAdd implements Route
 			
 			try
 			{			
-				handler.addNormalPayment(amount, 
-										req.queryMap("date").value(),
-										categoryID, 
-										req.queryMap("name").value(), 
-										req.queryMap("description").value());			
+				Integer id = handler.addNormalPayment(amount, 
+													  req.queryMap("date").value(),
+													  categoryID, 
+													  req.queryMap("name").value(), 
+													  req.queryMap("description").value());			
 
-				return "";
+				return gson.toJson(id);
 			}
 			catch(IllegalStateException ex)
 			{				
@@ -52,8 +56,7 @@ public class PaymentAdd implements Route
 			}
 		}
 		catch(Exception e)
-		{			
-			e.printStackTrace();
+		{
 			halt(400, "Bad Request");
 		}
 		
diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
index ff7b6a5ae53c0b42c2cd91e04212545cf0a698f9..f0a059d1cb7fb0f628006ca844a2bdbb679ebde2 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/payment/normal/PaymentDelete.java
@@ -2,7 +2,10 @@ package de.deadlocker8.budgetmasterserver.server.payment.normal;
 
 import static spark.Spark.halt;
 
+import java.util.ArrayList;
+
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 import spark.Route;
@@ -10,10 +13,12 @@ import spark.Route;
 public class PaymentDelete implements Route
 {
 	private DatabaseHandler handler;
+	private DatabaseTagHandler tagHandler;
 	
-	public PaymentDelete(DatabaseHandler handler)
+	public PaymentDelete(DatabaseHandler handler, DatabaseTagHandler tagHandler)
 	{		
 		this.handler = handler;
+		this.tagHandler = tagHandler;
 	}
 
 	@Override
@@ -37,7 +42,12 @@ public class PaymentDelete implements Route
 			
 			try
 			{						
-				handler.deletePayment(id);			
+				handler.deletePayment(id);	
+				ArrayList<Integer> tagIDs = tagHandler.getAllTagsForPayment(id);				
+				for(Integer currentTagID : tagIDs)
+				{
+					tagHandler.deleteTagMatchForPayment(currentTagID, id);
+				}
 
 				return "";
 			}
diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
index 0c711c30f0f6e1c5ea8baf7c7ff721c61c2a0221..72111cbffa878a2a8a1be9f6db7a03d4c8132cb8 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentAdd.java
@@ -2,6 +2,8 @@ package de.deadlocker8.budgetmasterserver.server.payment.repeating;
 
 import static spark.Spark.halt;
 
+import com.google.gson.Gson;
+
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
 import spark.Request;
 import spark.Response;
@@ -10,10 +12,12 @@ import spark.Route;
 public class RepeatingPaymentAdd implements Route
 {
 	private DatabaseHandler handler;
+	private Gson gson;
 	
-	public RepeatingPaymentAdd(DatabaseHandler handler)
+	public RepeatingPaymentAdd(DatabaseHandler handler, Gson gson)
 	{		
 		this.handler = handler;
+		this.gson = gson;
 	}
 
 	@Override
@@ -45,16 +49,16 @@ public class RepeatingPaymentAdd implements Route
 			
 			try
 			{				
-				handler.addRepeatingPayment(amount, 
-											req.queryMap("date").value(), 
-											categoryID, 
-											req.queryMap("name").value(), 
-											req.queryMap("description").value(), 
-											repeatInterval, 
-											req.queryMap("repeatEndDate").value(), 
-											repeatMonthDay);			
+				Integer id = handler.addRepeatingPayment(amount, 
+														req.queryMap("date").value(), 
+														categoryID, 
+														req.queryMap("name").value(), 
+														req.queryMap("description").value(), 
+														repeatInterval, 
+														req.queryMap("repeatEndDate").value(), 
+														repeatMonthDay);			
 
-				return "";
+				return gson.toJson(id);
 			}
 			catch(IllegalStateException ex)
 			{				
diff --git a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
index 89d2c121929fd5198eb0fd67e93fb1c54240d101..0df80498598d4b81e4736201d11a44ba34f5481d 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/payment/repeating/RepeatingPaymentDelete.java
@@ -2,7 +2,10 @@ package de.deadlocker8.budgetmasterserver.server.payment.repeating;
 
 import static spark.Spark.halt;
 
+import java.util.ArrayList;
+
 import de.deadlocker8.budgetmasterserver.logic.database.DatabaseHandler;
+import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
 import spark.Request;
 import spark.Response;
 import spark.Route;
@@ -10,10 +13,12 @@ import spark.Route;
 public class RepeatingPaymentDelete implements Route
 {
 	private DatabaseHandler handler;
+	private DatabaseTagHandler tagHandler;
 	
-	public RepeatingPaymentDelete(DatabaseHandler handler)
+	public RepeatingPaymentDelete(DatabaseHandler handler, DatabaseTagHandler tagHandler)
 	{
 		this.handler = handler;
+		this.tagHandler = tagHandler;
 	}
 
 	@Override
@@ -37,7 +42,12 @@ public class RepeatingPaymentDelete implements Route
 			
 			try
 			{					
-				handler.deleteRepeatingPayment(id);			
+				handler.deleteRepeatingPayment(id);	
+				ArrayList<Integer> tagIDs = tagHandler.getAllTagsForRepeatingPayment(id);
+				for(Integer currentTagID : tagIDs)
+				{
+					tagHandler.deleteTagMatchForRepeatingPayment(currentTagID, id);
+				}
 
 				return "";
 			}
diff --git a/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java b/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
index 8617a15d2138ad424e758cf61fe3a614d84862cd..08a93ad9b39d992c4fd7d3efce79529266e37c9a 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/tag/match/TagMatchGetAllForPayment.java
@@ -49,7 +49,7 @@ public class TagMatchGetAllForPayment implements Route
 				{
 					tags.add(currentTag);
 				}
-			}			
+			}
 			
 			return gson.toJson(tags);
 		}
diff --git a/src/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java b/src/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
index b804ef4b646cfdae165732a7f4dac1ca41fb0ffd..782df0b96bd7b4ba78fc064aa3eced912a45cf58 100644
--- a/src/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
+++ b/src/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGet.java
@@ -47,8 +47,7 @@ public class TagGet implements Route
 				return gson.toJson(tag);
 			}
 			catch(IllegalStateException e)
-			{
-				e.printStackTrace();
+			{				
 				halt(500, "Internal Server Error");
 			}
 		}
diff --git a/src/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java b/src/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4e7a898978ff76953b2d73bb199d7653e3a0059
--- /dev/null
+++ b/src/de/deadlocker8/budgetmasterserver/server/tag/tag/TagGetByName.java
@@ -0,0 +1,44 @@
+package de.deadlocker8.budgetmasterserver.server.tag.tag;
+
+import static spark.Spark.halt;
+
+import com.google.gson.Gson;
+
+import de.deadlocker8.budgetmaster.logic.tag.Tag;
+import de.deadlocker8.budgetmasterserver.logic.database.DatabaseTagHandler;
+import spark.Request;
+import spark.Response;
+import spark.Route;
+
+public class TagGetByName implements Route
+{
+	private DatabaseTagHandler tagHandler;
+	private Gson gson;
+
+	public TagGetByName(DatabaseTagHandler tagHandler, Gson gson)
+	{
+		this.tagHandler = tagHandler;
+		this.gson = gson;
+	}
+
+	@Override
+	public Object handle(Request req, Response res) throws Exception
+	{
+		if(!req.queryParams().contains("name"))
+		{
+			halt(400, "Bad Request");
+		}
+
+		try
+		{
+			Tag tag = tagHandler.getTagByName(req.queryMap("name").value());
+			return gson.toJson(tag);
+		}
+		catch(Exception e)
+		{
+			halt(500, "Internal Server Error");
+		}
+	
+		return null;
+	}
+}
\ No newline at end of file