diff --git a/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java
index ae0635a8a4e05d9bb775891a373dc538bfd7e3ad..3a2f6cb530e96f0dc019959f9777c646ec50dc0e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/controller/TransactionController.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.controller;
 
 import de.deadlocker8.budgetmaster.entities.Settings;
-import de.deadlocker8.budgetmaster.entities.Tag;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import de.deadlocker8.budgetmaster.filter.FilterConfiguration;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
index 936d77ef7d72eff96bb826c4076117db4cdd9dae..eb967c16d4dcc55b754461687edab9efa2253a69 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3.java
@@ -1,9 +1,9 @@
 package de.deadlocker8.budgetmaster.database;
 
 import com.google.gson.*;
-import de.deadlocker8.budgetmaster.entities.*;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.category.Category;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.*;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
index 700c69aed3395256cf2d98e582b0566b7a451929..a2271ac2ff248f18df4b109f95f4188e8895d123 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/database/legacy/LegacyParser.java
@@ -237,14 +237,14 @@ public class LegacyParser
 		return null;
 	}
 
-	private List<de.deadlocker8.budgetmaster.entities.Tag> getTagsByPaymentID(int paymentID)
+	private List<de.deadlocker8.budgetmaster.entities.tag.Tag> getTagsByPaymentID(int paymentID)
 	{
-		List<de.deadlocker8.budgetmaster.entities.Tag> tags = new ArrayList<>();
+		List<de.deadlocker8.budgetmaster.entities.tag.Tag> tags = new ArrayList<>();
 		for(TagMatch tagMatch : tagMatches)
 		{
 			if(tagMatch.getPaymentID() == paymentID)
 			{
-				tags.add(new de.deadlocker8.budgetmaster.entities.Tag(tagMatch.getTagName()));
+				tags.add(new de.deadlocker8.budgetmaster.entities.tag.Tag(tagMatch.getTagName()));
 			}
 		}
 
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/Tag.java b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/Tag.java
similarity index 92%
rename from src/main/java/de/deadlocker8/budgetmaster/entities/Tag.java
rename to src/main/java/de/deadlocker8/budgetmaster/entities/tag/Tag.java
index 3814cf90c0c353fe94ef3ff863e3520e50fc3acc..dcddf01215507a808d558a73144af7a246f5abdd 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/Tag.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/Tag.java
@@ -1,4 +1,4 @@
-package de.deadlocker8.budgetmaster.entities;
+package de.deadlocker8.budgetmaster.entities.tag;
 
 import com.google.gson.annotations.Expose;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
@@ -24,7 +24,7 @@ public class Tag
 	private String name;
 
 	@ManyToMany(mappedBy = "tags", fetch = FetchType.LAZY)
-	private transient List<Transaction> referringTransactions;
+	private List<Transaction> referringTransactions;
 
 	public Tag()
 	{
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/tag/TagScheduler.java b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/TagScheduler.java
new file mode 100644
index 0000000000000000000000000000000000000000..d5acd0f5ccd0814600545cd72f5e7d728db18a57
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/tag/TagScheduler.java
@@ -0,0 +1,41 @@
+package de.deadlocker8.budgetmaster.entities.tag;
+
+import de.deadlocker8.budgetmaster.repositories.TagRepository;
+import de.deadlocker8.budgetmaster.repositories.TransactionRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class TagScheduler
+{
+	private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
+
+	private TagRepository tagRepository;
+	private TransactionRepository transactionRepository;
+
+	@Autowired
+	public TagScheduler(TagRepository tagRepository, TransactionRepository transactionRepository)
+	{
+		this.tagRepository = tagRepository;
+		this.transactionRepository = transactionRepository;
+	}
+
+	@Scheduled(fixedRate = 60*1000)
+	public void tagCleaner()
+	{
+		LOGGER.debug("Cleaning Tags...");
+		List<Tag> tags = tagRepository.findAll();
+		for(Tag tag : tags)
+		{
+			if(transactionRepository.findAllByTagsContaining(tag).size() == 0)
+			{
+				tagRepository.delete(tag);
+			}
+		}
+	}
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java
index a17497072a0d66be2d5fa7b33efc80d74ebd29c5..2b68a0a72a70743b9be4e1682a9482fddfa5dc22 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction.java
@@ -1,7 +1,7 @@
 package de.deadlocker8.budgetmaster.entities.transaction;
 
 import com.google.gson.annotations.Expose;
-import de.deadlocker8.budgetmaster.entities.Tag;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
@@ -40,8 +40,14 @@ public class Transaction
 	@Expose
 	private String description;
 
-	@ManyToMany(cascade = CascadeType.ALL)
+	@ManyToMany
 	@Expose
+	@JoinTable(
+			name = "transaction_tags",
+			joinColumns = @JoinColumn(
+					name = "transaction_id", referencedColumnName = "ID"),
+			inverseJoinColumns = @JoinColumn(
+					name = "tags_id", referencedColumnName = "ID"))
 	private List<Tag> tags;
 
 	@ManyToOne(optional = true, cascade = CascadeType.ALL)
@@ -198,4 +204,4 @@ public class Transaction
 	{
 		return Objects.hash(ID, amount, date, account, category, name, description, tags, repeatingOption);
 	}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java
index 311580ba5417940badde745678bbbef97f2ffc9f..9a6c2d2f938f175143d662270d618ba226e5ddd7 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/entities/transaction/Transaction_.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.entities.transaction;
 
-import de.deadlocker8.budgetmaster.entities.Tag;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java
index 21fb2b22ff5e6fa73eb9718ac4654c3de3adce27..dce776463ced743d26270cf21bed831fa978060e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/TagRepository.java
@@ -1,6 +1,6 @@
 package de.deadlocker8.budgetmaster.repositories;
 
-import de.deadlocker8.budgetmaster.entities.Tag;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java b/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java
index 359ad8e01e606f7e1631f806e83793e37dc3ab7d..0c6691ba6f19889838b8db8bbfe6be05e670cbaa 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/repositories/TransactionRepository.java
@@ -1,5 +1,6 @@
 package de.deadlocker8.budgetmaster.repositories;
 
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import org.joda.time.DateTime;
@@ -18,6 +19,8 @@ public interface TransactionRepository extends JpaRepository<Transaction, Intege
 
 	List<Transaction> findAllByAccount(Account account);
 
+	List<Transaction> findAllByTagsContaining(Tag tag);
+
 	@Query(value = "SELECT SUM(t.amount) FROM `transaction` as t WHERE t.account_id = ?1 AND t.date BETWEEN ?2 AND ?3", nativeQuery = true)
 	Integer getRest(int accountID, String startDate, String endDate);
 }
\ No newline at end of file
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
index 3d031609c06ca53bee3c6df05bb60a0a4cc2a7ff..75335615111fc9552706bda9709f9f4d37f4586e 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/HelpersService.java
@@ -2,7 +2,7 @@ package de.deadlocker8.budgetmaster.services;
 
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch;
 import de.deadlocker8.budgetmaster.entities.Settings;
-import de.deadlocker8.budgetmaster.entities.Tag;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.account.AccountType;
 import de.deadlocker8.budgetmaster.entities.category.CategoryType;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
index 75bf793e6d83948b96432731ffce19df888ff38f..50f91605d6797a0244ffa6b3903b2a51afc75564 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/ImportService.java
@@ -5,7 +5,7 @@ import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatch;
 import de.deadlocker8.budgetmaster.database.accountmatches.AccountMatchList;
 import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.entities.category.CategoryType;
-import de.deadlocker8.budgetmaster.entities.Tag;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
 import de.deadlocker8.budgetmaster.repositories.TagRepository;
diff --git a/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java
index 6d6874193f1df6046c3d29e8327b43b921eb9694..3015a0fe5e24fe6f1ec827de037766dc0c5c4660 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/services/report/ReportGeneratorService.java
@@ -2,7 +2,7 @@ package de.deadlocker8.budgetmaster.services.report;
 
 import com.itextpdf.text.*;
 import com.itextpdf.text.pdf.*;
-import de.deadlocker8.budgetmaster.entities.Tag;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import de.deadlocker8.budgetmaster.entities.report.ReportColumn;
 import de.deadlocker8.budgetmaster.reports.*;
diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java
index 8ea6402923254d59738b7655fb57798245a95dee..19317aec174d6995f45f93ef0f5bb82ec983aec7 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseImportTest.java
@@ -1,10 +1,10 @@
 package de.deadlocker8.budgetmaster.database;
 
-import de.deadlocker8.budgetmaster.entities.*;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.account.AccountType;
 import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.entities.category.CategoryType;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
 import de.deadlocker8.budgetmaster.repositories.TagRepository;
@@ -262,6 +262,12 @@ public class DatabaseImportTest
 					return null;
 				}
 
+				@Override
+				public List<Transaction> findAllByTagsContaining(Tag tag)
+				{
+					return null;
+				}
+
 				@Override
 				public Integer getRest(int accountID, String startDate, String endDate)
 				{
diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java
index aba53cde27859778928c6d4604137dc9c5c337a5..7a662d7e1512a6f2fd1afc414fab0a2215d15ba2 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/database/DatabaseParser_v3Test.java
@@ -1,10 +1,10 @@
 package de.deadlocker8.budgetmaster.database;
 
-import de.deadlocker8.budgetmaster.entities.*;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.account.AccountType;
 import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.entities.category.CategoryType;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndAfterXTimes;
diff --git a/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java b/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java
index 290fef2456d7965ecb7204b5cf9f4658f7666a2e..4fd0cd4277ca5f68a73dc52d83414d297f6d4a18 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/database/LegacyParserTest.java
@@ -1,11 +1,11 @@
 package de.deadlocker8.budgetmaster.database;
 
 import de.deadlocker8.budgetmaster.database.legacy.LegacyParser;
-import de.deadlocker8.budgetmaster.entities.*;
 import de.deadlocker8.budgetmaster.entities.account.Account;
 import de.deadlocker8.budgetmaster.entities.account.AccountType;
 import de.deadlocker8.budgetmaster.entities.category.Category;
 import de.deadlocker8.budgetmaster.entities.category.CategoryType;
+import de.deadlocker8.budgetmaster.entities.tag.Tag;
 import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
 import de.deadlocker8.budgetmaster.repeating.RepeatingOption;
 import de.deadlocker8.budgetmaster.repeating.endoption.RepeatingEndDate;