diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java
new file mode 100644
index 0000000000000000000000000000000000000000..12638c224f8de8328e058b3024f7849c46b726c9
--- /dev/null
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagCache.java
@@ -0,0 +1,67 @@
+package de.deadlocker8.budgetmaster.logic.tag;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import de.deadlocker8.budgetmaster.logic.payment.Payment;
+import de.deadlocker8.budgetmaster.logic.payment.RepeatingPaymentEntry;
+
+public class TagCache
+{
+	private HashMap<Integer, ArrayList<Tag>> normalPaymentTagCache;
+	private HashMap<Integer, ArrayList<Tag>> repeatingPaymentTagCache;
+	
+	public TagCache()
+	{
+		clear();
+	}
+	
+	public void clear()
+	{
+		normalPaymentTagCache = new HashMap<>();
+		repeatingPaymentTagCache = new HashMap<>();
+	}
+	
+	public void addTags(Payment payment, ArrayList<Tag> tags)
+	{
+		if(payment instanceof RepeatingPaymentEntry)
+		{
+			repeatingPaymentTagCache.put(((RepeatingPaymentEntry)payment).getRepeatingPaymentID(), tags);
+		}
+		else
+		{
+			normalPaymentTagCache.put(payment.getID(), tags);
+		}
+	}
+	
+	public ArrayList<Tag> getTags(Payment payment)
+	{
+		if(payment instanceof RepeatingPaymentEntry)
+		{
+			RepeatingPaymentEntry repeatingPayment = (RepeatingPaymentEntry)payment;
+			if(repeatingPaymentTagCache.containsKey(repeatingPayment.getRepeatingPaymentID()))
+			{
+				return repeatingPaymentTagCache.get(repeatingPayment.getRepeatingPaymentID());
+			}
+		}
+		else
+		{
+			if(normalPaymentTagCache.containsKey(payment.getID()))
+			{
+				return normalPaymentTagCache.get(payment.getID());
+			}			
+		}
+		
+		return null;
+	}
+
+	public HashMap<Integer, ArrayList<Tag>> getNormalPaymentTagCache()
+	{
+		return normalPaymentTagCache;
+	}
+
+	public HashMap<Integer, ArrayList<Tag>> getRepeatingPaymentTagCache()
+	{
+		return repeatingPaymentTagCache;
+	}
+}
\ No newline at end of file
diff --git a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java
index d4f0f17311eadfa9020c542847211701d7fcb40b..a6fb9dfe3b538dffc630e4a5d30fcd5fe1833686 100644
--- a/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java
+++ b/BudgetMasterCore/src/main/java/de/deadlocker8/budgetmaster/logic/tag/TagHandler.java
@@ -11,15 +11,22 @@ import de.deadlocker8.budgetmaster.logic.serverconnection.ServerTagConnection;
 public class TagHandler
 {
 	private Settings settings;
+	private TagCache tagCache;
 	
 	public TagHandler(Settings settings)
 	{
 		this.settings = settings;
+		this.tagCache = new TagCache();
 	}
 
 	public ArrayList<Tag> getTags(Payment payment) throws Exception
 	{
 		ArrayList<Tag> tags = new ArrayList<>();
+		ArrayList<Tag> cachedTags = tagCache.getTags(payment);
+		if(cachedTags != null)
+		{
+			return cachedTags;
+		}
 		
 		ServerTagConnection connection = new ServerTagConnection(settings);
 		
@@ -32,6 +39,8 @@ public class TagHandler
 			tags.addAll(connection.getAllTagsForRepeatingPayment(((RepeatingPaymentEntry)payment).getRepeatingPaymentID()));
 		}
 		
+		tagCache.addTags(payment, tags);
+		
 		return tags;
 	}