diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
index 5f808b024aaaaab4711d8b7ac755900e7e0b0f55..8298996decca07899cc2a8152dfa4e5bc0bd16dd 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionController.java
@@ -126,21 +126,33 @@ public class TransactionController extends BaseController
 	}
 
 	@PostMapping(value = "/transactions/newTransaction/normal")
-	public String postNormal(Model model, @CookieValue("currentDate") String cookieDate,
+	public String postNormal(Model model, @RequestParam String action,
+							 @CookieValue("currentDate") String cookieDate,
 							 @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult,
 							 @RequestParam(value = "isPayment", required = false) boolean isPayment)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		if(action.equals(TransactionSubmitAction.TEMPLATE.getActionName()))
+		{
+			LOGGER.debug("Received request to create template from existing normal transaction");
+			return "redirect:/transactions";
+		}
 
-		TransactionValidator transactionValidator = new TransactionValidator();
-		transactionValidator.validate(transaction, bindingResult);
+		if(action.equals(TransactionSubmitAction.SAVE.getActionName()))
+		{
+			DateTime date = dateService.getDateTimeFromCookie(cookieDate);
 
-		handleAmount(transaction, isPayment);
-		handleTags(transaction);
+			TransactionValidator transactionValidator = new TransactionValidator();
+			transactionValidator.validate(transaction, bindingResult);
+
+			handleAmount(transaction, isPayment);
+			handleTags(transaction);
 
-		transaction.setRepeatingOption(null);
+			transaction.setRepeatingOption(null);
 
-		return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionNormal", isPayment);
+			return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionNormal", isPayment);
+		}
+
+		return "redirect:/transactions";
 	}
 
 	@SuppressWarnings("ConstantConditions")
@@ -195,21 +207,33 @@ public class TransactionController extends BaseController
 	}
 
 	@PostMapping(value = "/transactions/newTransaction/transfer")
-	public String postTransfer(Model model, @CookieValue("currentDate") String cookieDate,
+	public String postTransfer(Model model, @RequestParam String action,
+							   @CookieValue("currentDate") String cookieDate,
 							   @ModelAttribute("NewTransaction") Transaction transaction, BindingResult bindingResult,
 							   @RequestParam(value = "isPayment", required = false) boolean isPayment)
 	{
-		DateTime date = dateService.getDateTimeFromCookie(cookieDate);
+		if(action.equals(TransactionSubmitAction.TEMPLATE.getActionName()))
+		{
+			LOGGER.debug("Received request to create template from existing transfer");
+			return "redirect:/transactions";
+		}
 
-		TransactionValidator transactionValidator = new TransactionValidator();
-		transactionValidator.validate(transaction, bindingResult);
+		if(action.equals(TransactionSubmitAction.SAVE.getActionName()))
+		{
+			DateTime date = dateService.getDateTimeFromCookie(cookieDate);
 
-		handleAmount(transaction, isPayment);
-		handleTags(transaction);
+			TransactionValidator transactionValidator = new TransactionValidator();
+			transactionValidator.validate(transaction, bindingResult);
+
+			handleAmount(transaction, isPayment);
+			handleTags(transaction);
 
-		transaction.setRepeatingOption(null);
+			transaction.setRepeatingOption(null);
 
-		return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionTransfer", isPayment);
+			return handleRedirect(model, transaction, bindingResult, date, "transactions/newTransactionTransfer", isPayment);
+		}
+
+		return "redirect:/transactions";
 	}
 
 	private void handleAmount(Transaction transaction, boolean isPayment)
diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSubmitAction.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSubmitAction.java
new file mode 100644
index 0000000000000000000000000000000000000000..8923f459d03a29cef969ad7570e4566a5815a3c1
--- /dev/null
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSubmitAction.java
@@ -0,0 +1,27 @@
+package de.deadlocker8.budgetmaster.transactions;
+
+public enum TransactionSubmitAction
+{
+	SAVE("save"),
+	TEMPLATE("template");
+
+	private String actionName;
+
+	TransactionSubmitAction(String actionName)
+	{
+		this.actionName = actionName;
+	}
+
+	public String getActionName()
+	{
+		return actionName;
+	}
+
+	@Override
+	public String toString()
+	{
+		return "TransactionSubmitAction{" +
+				"actionName='" + actionName + '\'' +
+				'}';
+	}
+}
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index 646e92888fe5040e4182d7b5d56f6967517cc8ce..1f03635ca0381e67e7414d954e9140d6e1b76554 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -63,6 +63,7 @@ tagfield.placeholder=Tag hier eingeben
 placeholder=Keine Daten verfügbar
 placeholder.seems.empty=Ganz schön leer hier...
 placeholder.advice=Füge {0} hinzu
+save.as.template=Vorlage erzeugen
 
 # WEEK DAYS
 monday=Montag
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index d5c026f21db07af7e83d50c2f2d2bd4eeab7ae59..2b22384d2c3e18a15f5d812811e11572cd1f8f94 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -63,6 +63,7 @@ tagfield.placeholder=Enter Tag here
 placeholder=No data available
 placeholder.seems.empty=It''s pretty empty here...
 placeholder.advice=Get started by adding {0}
+save.as.template=Create template
 
 # WEEK DAYS
 monday=Monday
diff --git a/src/main/resources/static/css/dark/style.css b/src/main/resources/static/css/dark/style.css
index b0ff8c050e29bca9d4efd82a83e1fba012c9dab4..7a2c2d3a5f81bb29f4515d5ac16ae9dab30eafb0 100644
--- a/src/main/resources/static/css/dark/style.css
+++ b/src/main/resources/static/css/dark/style.css
@@ -176,11 +176,13 @@ ul.sidenav.sidenav-fixed > li:last-child
     font-weight: 600;
 }
 
-.btn:hover {
+.btn:hover,
+.btn-floating:hover {
     background-color: #70A3CF;
 }
 
-.btn:focus {
+.btn:focus,
+.btn-floating:focus {
     background-color: #2E79B9;
 }
 
@@ -614,6 +616,10 @@ input[type="radio"]:not(:checked) + span::before, [type="radio"]:not(:checked) +
     .budget {
         font-size: 2.5vmin;
     }
+
+    .fixed-action-btn {
+        right: 53px;
+    }
 }
 
 @media all and (max-width: 959px) and (min-width: 600px) {
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index e740eb462678e53cd6b85444e787b34964172645..0f867bda3024681775cf341f1ecb96b84a3a67b0 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -158,11 +158,13 @@ ul.sidenav.sidenav-fixed > li:last-child
     font-weight: 600;
 }
 
-.btn:hover {
+.btn:hover,
+.btn-floating:hover {
     background-color: #70A3CF;
 }
 
-.btn:focus {
+.btn:focus,
+.btn-floating:focus {
     background-color: #2E79B9;
 }
 
@@ -533,6 +535,10 @@ input[type="radio"]:checked + span::after, [type="radio"].with-gap:checked + spa
     .budget {
         font-size: 2.5vmin;
     }
+
+    .fixed-action-btn {
+        right: 53px;
+    }
 }
 
 @media all and (max-width: 959px) and (min-width: 600px) {
diff --git a/src/main/resources/templates/transactions/newTransactionMacros.ftl b/src/main/resources/templates/transactions/newTransactionMacros.ftl
index 93c4d0af7ec62fd5d700042596f00b72f939ba5a..54bdd552c01b3df9eae9145c7b576fb37358eeeb 100644
--- a/src/main/resources/templates/transactions/newTransactionMacros.ftl
+++ b/src/main/resources/templates/transactions/newTransactionMacros.ftl
@@ -362,7 +362,15 @@
 </#macro>
 
 <#macro buttonSave>
-    <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action">
+    <button class="btn waves-effect waves-light budgetmaster-blue" type="submit" name="action" value="save">
         <i class="material-icons left">save</i>${locale.getString("save")}
     </button>
+</#macro>
+
+<#macro buttonTemplate>
+    <div class="fixed-action-btn">
+        <button class="btn-floating btn-large waves-effect waves-light budgetmaster-blue tooltipped" type="submit" name="action" value="template" data-position="left" data-tooltip="${locale.getString("save.as.template")}">
+            <i class="material-icons left">file_copy</i>${locale.getString("save")}
+        </button>
+    </div>
 </#macro>
\ No newline at end of file
diff --git a/src/main/resources/templates/transactions/newTransactionNormal.ftl b/src/main/resources/templates/transactions/newTransactionNormal.ftl
index d90a0f7fdb3b1d3cf2a99396f3c4a0fbbb248bfd..c613caad4222ddfc4dc62b82e2d5bea685a73ca7 100644
--- a/src/main/resources/templates/transactions/newTransactionNormal.ftl
+++ b/src/main/resources/templates/transactions/newTransactionNormal.ftl
@@ -58,6 +58,7 @@
                         <br>
                         <#-- buttons -->
                         <@newTransactionMacros.buttons/>
+                        <@newTransactionMacros.buttonTemplate/>
                     </form>
                 </div>
             </div>
diff --git a/src/main/resources/templates/transactions/newTransactionTransfer.ftl b/src/main/resources/templates/transactions/newTransactionTransfer.ftl
index f2a42f81914346b69aaeda161db4a2b52cd03eb4..5b1268702acefe74303ae5c7053e58aa72485a53 100644
--- a/src/main/resources/templates/transactions/newTransactionTransfer.ftl
+++ b/src/main/resources/templates/transactions/newTransactionTransfer.ftl
@@ -63,6 +63,7 @@
                         <br>
                         <#-- buttons -->
                         <@newTransactionMacros.buttons/>
+                        <@newTransactionMacros.buttonTemplate/>
                     </form>
                 </div>
             </div>